/ Hex Artifact Content
Login

Artifact 73234bca5efe5cfe0d330ae26b705bf2df03af1e:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  le is responsibl
0200: 65 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74  e for.** generat
0210: 69 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61  ing the code tha
0220: 74 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20  t loops through 
0230: 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20  a table looking 
0240: 66 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a  for applicable.*
0250: 2a 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73  * rows.  Indices
0260: 20 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e   are selected an
0270: 64 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  d used to speed 
0280: 74 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20  the search when 
0290: 64 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61  doing.** so is a
02a0: 70 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61  pplicable.  Beca
02b0: 75 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20  use this module 
02c0: 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
02d0: 6f 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20  or selecting.** 
02e0: 69 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67  indices, you mig
02f0: 68 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66  ht also think of
0300: 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20   this module as 
0310: 74 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d  the "query optim
0320: 69 7a 65 72 22 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  izer"..*/.#inclu
0330: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0340: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  .../*.** Trace o
0350: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
0360: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
0370: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
0380: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
0390: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03a0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
03c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
03d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
03e0: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
03f0: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0400: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0410: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0420: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0430: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0440: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0450: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0460: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0470: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0480: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
0490: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04a0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04b0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
04c0: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
04d0: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
04e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
04f0: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0500: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0510: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0520: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0530: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0540: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0550: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0560: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
0570: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
0580: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
0590: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05a0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05b0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05c0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
05d0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
05e0: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
05f0: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0600: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0610: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0620: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0630: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0640: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0650: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0660: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0670: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0680: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06a0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06b0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
06c0: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
06d0: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06e0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06f0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0700: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0710: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0720: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0730: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0740: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0750: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0760: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0770: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0780: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0790: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07a0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07b0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
07c0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
07d0: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
07e0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
07f0: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0800: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0810: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0820: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0830: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0840: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0850: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
0860: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
0870: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
0880: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
0890: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08a0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08b0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
08c0: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
08d0: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
08e0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
08f0: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0900: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0910: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0920: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0930: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0940: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0950: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
0960: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
0970: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
0980: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
0990: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09a0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09b0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
09c0: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
09d0: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
09e0: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
09f0: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a00: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a10: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a20: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a30: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a40: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a50: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0a60: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0a70: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0a80: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0a90: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0aa0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0ab0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0ac0: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0ad0: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0ae0: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0af0: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b00: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b10: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b20: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b30: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b40: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b50: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0b60: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0b70: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0b80: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0b90: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0ba0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bb0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0bc0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0bd0: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0be0: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0bf0: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c00: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c10: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c20: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c30: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c40: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c50: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0c60: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0c70: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0c80: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0c90: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ca0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cb0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0cc0: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0cd0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0ce0: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0cf0: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d00: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d10: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d20: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d30: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d40: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d50: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0d60: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0d70: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0d80: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0d90: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0da0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0db0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0dc0: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0dd0: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0de0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0df0: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e00: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e10: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e20: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e30: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e40: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e50: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0e60: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0e70: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0e80: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0e90: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ea0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0eb0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0ec0: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0ed0: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0ee0: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0ef0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f00: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f10: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f20: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f40: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f50: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0f60: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0f70: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0f90: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fa0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0fb0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
0fc0: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
0fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
0fe0: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
0ff0: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1000: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1010: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1020: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1030: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1040: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1050: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
1060: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
1070: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
1080: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
1090: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10a0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10b0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
10c0: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
10d0: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
10e0: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
10f0: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1100: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1110: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1120: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1130: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1140: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1150: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
1160: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
1170: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
1180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1190: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11a0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11b0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
11c0: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
11d0: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
11e0: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
11f0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1200: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1210: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1220: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1230: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1240: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1250: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
1260: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
1270: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
1280: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
1290: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12a0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
12c0: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
12d0: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
12e0: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
12f0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1300: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1310: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1320: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1330: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1340: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1350: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
1360: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
1370: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
1380: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13a0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13b0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
13c0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
13d0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
13e0: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
13f0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1400: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1410: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1420: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1430: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1440: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1450: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
1460: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
1470: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
1480: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
1490: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
14b0: 5f 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 23 20  _ENABLE_STAT2.# 
14c0: 20 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55   define TERM_VNU
14d0: 4c 4c 20 20 20 20 30 78 38 30 20 20 20 2f 2a 20  LL    0x80   /* 
14e0: 4d 61 6e 75 66 61 63 74 75 72 65 64 20 78 3e 4e  Manufactured x>N
14f0: 55 4c 4c 20 6f 72 20 78 3c 3d 4e 55 4c 4c 20 74  ULL or x<=NULL t
1500: 65 72 6d 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 20  erm */.#else.#  
1510: 64 65 66 69 6e 65 20 54 45 52 4d 5f 56 4e 55 4c  define TERM_VNUL
1520: 4c 20 20 20 20 30 78 30 30 20 20 20 2f 2a 20 44  L    0x00   /* D
1530: 69 73 61 62 6c 65 64 20 69 66 20 6e 6f 74 20 75  isabled if not u
1540: 73 69 6e 67 20 73 74 61 74 32 20 2a 2f 0a 23 65  sing stat2 */.#e
1550: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ndif../*.** An i
1560: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1570: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1580: 72 65 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66  re holds all inf
1590: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15a0: 0a 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65  .** WHERE clause
15b0: 2e 20 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69  .  Mostly this i
15c0: 73 20 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f  s a container fo
15d0: 72 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68  r one or more Wh
15e0: 65 72 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72  ereTerms..*/.str
15f0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
1600: 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
1610: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
1620: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
1630: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73  xt */.  WhereMas
1640: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20  kSet *pMaskSet; 
1650: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74   /* Mapping of t
1660: 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  able cursor numb
1670: 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20  ers to bitmasks 
1680: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61  */.  Bitmask vma
1690: 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  sk;           /*
16a0: 20 42 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66   Bitmask identif
16b0: 79 69 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62  ying virtual tab
16c0: 6c 65 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20  le cursors */.  
16d0: 75 38 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  u8 op;          
16e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69           /* Spli
16f0: 74 20 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f  t operator.  TK_
1700: 41 4e 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a  AND or TK_OR */.
1710: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20    int nTerm;    
1720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1730: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f  mber of terms */
1740: 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20  .  int nSlot;   
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
1770: 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65   in a[] */.  Whe
1780: 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20  reTerm *a;      
1790: 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b        /* Each a[
17a0: 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74 65  ] describes a te
17b0: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
17c0: 63 6c 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65  cluase */.#if de
17d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41  fined(SQLITE_SMA
17e0: 4c 4c 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72  LL_STACK).  Wher
17f0: 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d  eTerm aStatic[1]
1800: 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20  ;    /* Initial 
1810: 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f 72  static space for
1820: 20 61 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20   a[] */.#else.  
1830: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
1840: 63 5b 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74  c[8];    /* Init
1850: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
1860: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64   for a[] */.#end
1870: 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57  if.};../*.** A W
1880: 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f  hereTerm with eO
1890: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68  perator==WO_OR h
18a0: 61 73 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f  as its u.pOrInfo
18b0: 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a   pointer set to.
18c0: 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  ** a dynamically
18d0: 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61   allocated insta
18e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
1900: 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f  */.struct WhereO
1910: 72 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43  rInfo {.  WhereC
1920: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
1930: 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74     /* Decomposit
1940: 69 6f 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d  ion into subterm
1950: 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69  s */.  Bitmask i
1960: 6e 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20  ndexable;       
1970: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c  /* Bitmask of al
1980: 6c 20 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c  l indexable tabl
1990: 65 73 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65  es in the clause
19a0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
19b0: 57 68 65 72 65 54 65 72 6d 20 77 69 74 68 20 65  WhereTerm with e
19c0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
19d0: 20 68 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49   has its u.pAndI
19e0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20  nfo pointer set 
19f0: 74 6f 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61  to.** a dynamica
1a00: 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e  lly allocated in
1a10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1a20: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1a30: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65  e..*/.struct Whe
1a40: 72 65 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68  reAndInfo {.  Wh
1a50: 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20  ereClause wc;   
1a60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75         /* The su
1a70: 62 65 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b  bexpression brok
1a80: 65 6e 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  en out */.};../*
1a90: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
1aa0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1ab0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
1ac0: 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70   track of a mapp
1ad0: 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56  ing.** between V
1ae0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
1af0: 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74  rs and bits of t
1b00: 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57  he bitmasks in W
1b10: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
1b20: 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
1b30: 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c  numbers are smal
1b40: 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61  l integers conta
1b50: 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c  ined in .** SrcL
1b60: 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72  ist_item.iCursor
1b70: 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65   and Expr.iTable
1b80: 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e   fields.  For an
1b90: 79 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a  y given WHERE .*
1ba0: 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75  * clause, the cu
1bb0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67  rsor numbers mig
1bc0: 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  ht not begin wit
1bd0: 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67  h 0 and they mig
1be0: 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61  ht.** contain ga
1bf0: 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ps in the number
1c00: 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42  ing sequence.  B
1c10: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
1c20: 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73  ke maximum.** us
1c30: 65 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e  e of the bits in
1c40: 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20   our bitmasks.  
1c50: 54 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70  This structure p
1c60: 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e  rovides a mappin
1c70: 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70  g.** from the sp
1c80: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
1c90: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
1ca0: 74 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65  tive integers be
1cb0: 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20  ginning.** with 
1cc0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72  0..**.** If Wher
1cd0: 65 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d  eMaskSet.ix[A]==
1ce0: 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  B it means that 
1cf0: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d00: 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72  a Bitmask.** cor
1d10: 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75  responds VDBE cu
1d20: 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20  rsor number B.  
1d30: 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20  The A-th bit of 
1d40: 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c  a bitmask is 1<<
1d50: 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  A..**.** For exa
1d60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45  mple, if the WHE
1d70: 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65 73  RE clause expres
1d80: 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20  sion used these 
1d90: 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a  VDBE.** cursors:
1da0: 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35    4, 5, 8, 29, 5
1db0: 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65  7, 73.  Then the
1dc0: 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73    WhereMaskSet s
1dd0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1de0: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1df0: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1e00: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1e10: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1e20: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1e30: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1e40: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1e50: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
1e60: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
1e70: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
1e80: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
1e90: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
1ea0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
1eb0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1ec0: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1ed0: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1ee0: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1ef0: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1f00: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1f10: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1f20: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1f30: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1f40: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1f50: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1f60: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
1f70: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73  ** no gaps..*/.s
1f80: 74 72 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53  truct WhereMaskS
1f90: 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20  et {.  int n;   
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fc0: 66 20 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f  f assigned curso
1fd0: 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e  r values */.  in
1fe0: 74 20 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20  t ix[BMS];      
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2000: 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74  ursor assigned t
2010: 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b  o each bit */.};
2020: 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43  ../*.** A WhereC
2030: 6f 73 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72  ost object recor
2040: 64 73 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61  ds a lookup stra
2050: 74 65 67 79 20 61 6e 64 20 74 68 65 20 65 73 74  tegy and the est
2060: 69 6d 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f  imated.** cost o
2070: 66 20 70 75 72 73 75 69 6e 67 20 74 68 61 74 20  f pursuing that 
2080: 73 74 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72  strategy..*/.str
2090: 75 63 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a  uct WhereCost {.
20a0: 20 20 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e    WherePlan plan
20b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b  ;    /* The look
20c0: 75 70 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20  up strategy */. 
20d0: 20 64 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20   double rCost;  
20e0: 20 20 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63      /* Overall c
20f0: 6f 73 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20  ost of pursuing 
2100: 74 68 69 73 20 73 65 61 72 63 68 20 73 74 72 61  this search stra
2110: 74 65 67 79 20 2a 2f 0a 20 20 42 69 74 6d 61 73  tegy */.  Bitmas
2120: 6b 20 75 73 65 64 3b 20 20 20 20 20 20 2f 2a 20  k used;      /* 
2130: 42 69 74 6d 61 73 6b 20 6f 66 20 63 75 72 73 6f  Bitmask of curso
2140: 72 73 20 75 73 65 64 20 62 79 20 74 68 69 73 20  rs used by this 
2150: 70 6c 61 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  plan */.};../*.*
2160: 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74  * Bitmasks for t
2170: 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61  he operators tha
2180: 74 20 69 6e 64 69 63 65 73 20 61 72 65 20 61 62  t indices are ab
2190: 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20  le to exploit.  
21a0: 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62  An.** OR-ed comb
21b0: 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65  ination of these
21c0: 20 76 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75   values can be u
21d0: 73 65 64 20 77 68 65 6e 20 73 65 61 72 63 68 69  sed when searchi
21e0: 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20  ng for.** terms 
21f0: 69 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  in the where cla
2200: 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  use..*/.#define 
2210: 57 4f 5f 49 4e 20 20 20 20 20 30 78 30 30 31 0a  WO_IN     0x001.
2220: 23 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20  #define WO_EQ   
2230: 20 20 30 78 30 30 32 0a 23 64 65 66 69 6e 65 20    0x002.#define 
2240: 57 4f 5f 4c 54 20 20 20 20 20 28 57 4f 5f 45 51  WO_LT     (WO_EQ
2250: 3c 3c 28 54 4b 5f 4c 54 2d 54 4b 5f 45 51 29 29  <<(TK_LT-TK_EQ))
2260: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 45 20 20  .#define WO_LE  
2270: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2280: 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  E-TK_EQ)).#defin
2290: 65 20 57 4f 5f 47 54 20 20 20 20 20 28 57 4f 5f  e WO_GT     (WO_
22a0: 45 51 3c 3c 28 54 4b 5f 47 54 2d 54 4b 5f 45 51  EQ<<(TK_GT-TK_EQ
22b0: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 45  )).#define WO_GE
22c0: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
22d0: 5f 47 45 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GE-TK_EQ)).#def
22e0: 69 6e 65 20 57 4f 5f 4d 41 54 43 48 20 20 30 78  ine WO_MATCH  0x
22f0: 30 34 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49  040.#define WO_I
2300: 53 4e 55 4c 4c 20 30 78 30 38 30 0a 23 64 65 66  SNULL 0x080.#def
2310: 69 6e 65 20 57 4f 5f 4f 52 20 20 20 20 20 30 78  ine WO_OR     0x
2320: 31 30 30 20 20 20 20 20 20 20 2f 2a 20 54 77 6f  100       /* Two
2330: 20 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e   or more OR-conn
2340: 65 63 74 65 64 20 74 65 72 6d 73 20 2a 2f 0a 23  ected terms */.#
2350: 64 65 66 69 6e 65 20 57 4f 5f 41 4e 44 20 20 20  define WO_AND   
2360: 20 30 78 32 30 30 20 20 20 20 20 20 20 2f 2a 20   0x200       /* 
2370: 54 77 6f 20 6f 72 20 6d 6f 72 65 20 41 4e 44 2d  Two or more AND-
2380: 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20  connected terms 
2390: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4e 4f  */.#define WO_NO
23a0: 4f 50 20 20 20 30 78 38 30 30 20 20 20 20 20 20  OP   0x800      
23b0: 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 64 6f   /* This term do
23c0: 65 73 20 6e 6f 74 20 72 65 73 74 72 69 63 74 20  es not restrict 
23d0: 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f 0a  search space */.
23e0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 41 4c 4c 20  .#define WO_ALL 
23f0: 20 20 20 30 78 66 66 66 20 20 20 20 20 20 20 2f     0xfff       /
2400: 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 70 6f  * Mask of all po
2410: 73 73 69 62 6c 65 20 57 4f 5f 2a 20 76 61 6c 75  ssible WO_* valu
2420: 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  es */.#define WO
2430: 5f 53 49 4e 47 4c 45 20 30 78 30 66 66 20 20 20  _SINGLE 0x0ff   
2440: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 61      /* Mask of a
2450: 6c 6c 20 6e 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20  ll non-compound 
2460: 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 0a  WO_* values */..
2470: 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66 6f 72 20  /*.** Value for 
2480: 77 73 46 6c 61 67 73 20 72 65 74 75 72 6e 65 64  wsFlags returned
2490: 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29 20   by bestIndex() 
24a0: 61 6e 64 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  and stored in.**
24b0: 20 57 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c   WhereLevel.wsFl
24c0: 61 67 73 2e 20 20 54 68 65 73 65 20 66 6c 61 67  ags.  These flag
24d0: 73 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 63  s determine whic
24e0: 68 20 73 65 61 72 63 68 0a 2a 2a 20 73 74 72 61  h search.** stra
24f0: 74 65 67 69 65 73 20 61 72 65 20 61 70 70 72 6f  tegies are appro
2500: 70 72 69 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  priate..**.** Th
2510: 65 20 6c 65 61 73 74 20 73 69 67 6e 69 66 69 63  e least signific
2520: 61 6e 74 20 31 32 20 62 69 74 73 20 69 73 20 72  ant 12 bits is r
2530: 65 73 65 72 76 65 64 20 61 73 20 61 20 6d 61 73  eserved as a mas
2540: 6b 20 66 6f 72 20 57 4f 5f 20 76 61 6c 75 65 73  k for WO_ values
2550: 20 61 62 6f 76 65 2e 0a 2a 2a 20 54 68 65 20 57   above..** The W
2560: 68 65 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67  hereLevel.wsFlag
2570: 73 20 66 69 65 6c 64 20 69 73 20 75 73 75 61 6c  s field is usual
2580: 6c 79 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c  ly set to WO_IN|
2590: 57 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e  WO_EQ|WO_ISNULL.
25a0: 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74  .** But if the t
25b0: 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68  able is the righ
25c0: 74 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66  t table of a lef
25d0: 74 20 6a 6f 69 6e 2c 20 57 68 65 72 65 4c 65 76  t join, WhereLev
25e0: 65 6c 2e 77 73 46 6c 61 67 73 0a 2a 2a 20 69 73  el.wsFlags.** is
25f0: 20 73 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f   set to WO_IN|WO
2600: 5f 45 51 2e 20 20 54 68 65 20 57 68 65 72 65 4c  _EQ.  The WhereL
2610: 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69 65  evel.wsFlags fie
2620: 6c 64 20 63 61 6e 20 74 68 65 6e 20 62 65 20 75  ld can then be u
2630: 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 22 6f  sed as.** the "o
2640: 70 22 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20  p" parameter to 
2650: 66 69 6e 64 54 65 72 6d 20 77 68 65 6e 20 77 65  findTerm when we
2660: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 65   are resolving e
2670: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
2680: 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63  nts..** ISNULL c
2690: 6f 6e 73 74 72 61 69 6e 74 73 20 77 69 6c 6c 20  onstraints will 
26a0: 74 68 65 6e 20 6e 6f 74 20 62 65 20 75 73 65 64  then not be used
26b0: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 20 74 61   on the right ta
26c0: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 0a 2a 2a  ble of a left.**
26d0: 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65 74 73 20   join.  Tickets 
26e0: 23 32 31 37 37 20 61 6e 64 20 23 32 31 38 39 2e  #2177 and #2189.
26f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
2700: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 30  E_ROWID_EQ     0
2710: 78 30 30 30 30 31 30 30 30 20 20 2f 2a 20 72 6f  x00001000  /* ro
2720: 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69  wid=EXPR or rowi
2730: 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64  d IN (...) */.#d
2740: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49  efine WHERE_ROWI
2750: 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30 30 32  D_RANGE  0x00002
2760: 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58  000  /* rowid<EX
2770: 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e  PR and/or rowid>
2780: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
2790: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
27a0: 20 20 20 30 78 30 30 30 31 30 30 30 30 20 20 2f     0x00010000  /
27b0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
27c0: 20 28 2e 2e 2e 29 20 6f 72 20 78 20 49 53 20 4e   (...) or x IS N
27d0: 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ULL */.#define W
27e0: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
27f0: 45 20 30 78 30 30 30 32 30 30 30 30 20 20 2f 2a  E 0x00020000  /*
2800: 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78   x<EXPR and/or x
2810: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
2820: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
2830: 20 20 20 20 30 78 30 30 30 34 30 30 30 30 20 20      0x00040000  
2840: 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f  /* x IN (...) */
2850: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 43  .#define WHERE_C
2860: 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 20 30 78 30 30  OLUMN_NULL  0x00
2870: 30 38 30 30 30 30 20 20 2f 2a 20 78 20 49 53 20  080000  /* x IS 
2880: 4e 55 4c 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  NULL */.#define 
2890: 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 20 20  WHERE_INDEXED   
28a0: 20 20 20 30 78 30 30 30 66 30 30 30 30 20 20 2f     0x000f0000  /
28b0: 2a 20 41 6e 79 74 68 69 6e 67 20 74 68 61 74 20  * Anything that 
28c0: 75 73 65 73 20 61 6e 20 69 6e 64 65 78 20 2a 2f  uses an index */
28d0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4e  .#define WHERE_N
28e0: 4f 54 5f 46 55 4c 4c 53 43 41 4e 20 30 78 31 30  OT_FULLSCAN 0x10
28f0: 30 66 33 30 30 30 20 20 2f 2a 20 44 6f 65 73 20  0f3000  /* Does 
2900: 6e 6f 74 20 64 6f 20 61 20 66 75 6c 6c 20 74 61  not do a full ta
2910: 62 6c 65 20 73 63 61 6e 20 2a 2f 0a 23 64 65 66  ble scan */.#def
2920: 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c  ine WHERE_IN_ABL
2930: 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30 30  E      0x000f100
2940: 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73 75  0  /* Able to su
2950: 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65 72  pport an IN oper
2960: 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ator */.#define 
2970: 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20  WHERE_TOP_LIMIT 
2980: 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20 2f     0x00100000  /
2990: 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d 45  * x<EXPR or x<=E
29a0: 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a  XPR constraint *
29b0: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
29c0: 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  BTM_LIMIT    0x0
29d0: 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45 58  0200000  /* x>EX
29e0: 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63 6f  PR or x>=EXPR co
29f0: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66  nstraint */.#def
2a00: 69 6e 65 20 57 48 45 52 45 5f 42 4f 54 48 5f 4c  ine WHERE_BOTH_L
2a10: 49 4d 49 54 20 20 20 30 78 30 30 33 30 30 30 30  IMIT   0x0030000
2a20: 30 20 20 2f 2a 20 42 6f 74 68 20 78 3e 45 58 50  0  /* Both x>EXP
2a30: 52 20 61 6e 64 20 78 3c 45 58 50 52 20 2a 2f 0a  R and x<EXPR */.
2a40: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49 44  #define WHERE_ID
2a50: 58 5f 4f 4e 4c 59 20 20 20 20 20 30 78 30 30 38  X_ONLY     0x008
2a60: 30 30 30 30 30 20 20 2f 2a 20 55 73 65 20 69 6e  00000  /* Use in
2a70: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
2a80: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
2a90: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
2aa0: 20 20 20 20 30 78 30 31 30 30 30 30 30 30 20 20      0x01000000  
2ab0: 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61  /* Output will a
2ac0: 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74  ppear in correct
2ad0: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2ae0: 65 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  e WHERE_REVERSE 
2af0: 20 20 20 20 20 30 78 30 32 30 30 30 30 30 30 20       0x02000000 
2b00: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
2b10: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65  rse order */.#de
2b20: 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55  fine WHERE_UNIQU
2b30: 45 20 20 20 20 20 20 20 30 78 30 34 30 30 30 30  E       0x040000
2b40: 30 30 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  00  /* Selects n
2b50: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
2b60: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
2b70: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
2b80: 45 20 30 78 30 38 30 30 30 30 30 30 20 20 2f 2a  E 0x08000000  /*
2b90: 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62   Use virtual-tab
2ba0: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f  le processing */
2bb0: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 4d  .#define WHERE_M
2bc0: 55 4c 54 49 5f 4f 52 20 20 20 20 20 30 78 31 30  ULTI_OR     0x10
2bd0: 30 30 30 30 30 30 20 20 2f 2a 20 4f 52 20 75 73  000000  /* OR us
2be0: 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64  ing multiple ind
2bf0: 69 63 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ices */.#define 
2c00: 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
2c10: 20 20 20 30 78 32 30 30 30 30 30 30 30 20 20 2f     0x20000000  /
2c20: 2a 20 55 73 65 73 20 61 6e 20 65 70 68 65 6d 65  * Uses an epheme
2c30: 72 61 6c 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65  ral index */.#de
2c40: 66 69 6e 65 20 57 48 45 52 45 5f 44 49 53 54 49  fine WHERE_DISTI
2c50: 4e 43 54 20 20 20 20 20 30 78 34 30 30 30 30 30  NCT     0x400000
2c60: 30 30 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 6f  00  /* Correct o
2c70: 72 64 65 72 20 66 6f 72 20 44 49 53 54 49 4e 43  rder for DISTINC
2c80: 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  T */../*.** Init
2c90: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
2ca0: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
2cb0: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2cd0: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
2ce0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2d00: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
2d10: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2d20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2d30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2d40: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2d50: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2d60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
2d70: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
2d80: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
2d90: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
2da0: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
2db0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2dc0: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
2dd0: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
2de0: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
2df0: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
2e00: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
2e10: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2e20: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
2e30: 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a  pWC->vmask = 0;.
2e40: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2e50: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2e60: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2e70: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2e80: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2e90: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2ea0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2eb0: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2ec0: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2ed0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2ee0: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2ef0: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2f00: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2f10: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2f20: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2f30: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2f40: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2f50: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2f60: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2f70: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2f80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2f90: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2fa0: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2fb0: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2fc0: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2fd0: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2fe0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ff0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
3000: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
3010: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
3020: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
3030: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
3040: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
3050: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
3060: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
3070: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
3080: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
3090: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
30a0: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
30b0: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
30c0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
30d0: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
30e0: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
30f0: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
3100: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
3110: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
3120: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
3130: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
3140: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
3150: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3160: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
3170: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
3180: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
3190: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
31a0: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
31b0: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
31c0: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
31d0: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
31e0: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
31f0: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
3200: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
3210: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
3220: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3230: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
3240: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
3250: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
3260: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
3270: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
3280: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
3290: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
32a0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
32b0: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
32c0: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
32d0: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
32e0: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
32f0: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3300: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3310: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3320: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3330: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
3340: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
3350: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
3360: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
3370: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
3380: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
3390: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
33a0: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
33b0: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
33c0: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
33d0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
33e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
33f0: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3400: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3410: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3420: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3430: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
3440: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
3450: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
3460: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
3470: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
3480: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
3490: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
34a0: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
34b0: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
34c0: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
34d0: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
34e0: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
34f0: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3500: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3510: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3520: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3530: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
3540: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
3550: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
3560: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
3570: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
3580: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
3590: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
35a0: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
35b0: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
35c0: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
35d0: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
35e0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
35f0: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3600: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3610: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3620: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3630: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
3640: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
3650: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
3660: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
3670: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
3680: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
3690: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
36a0: 0a 20 20 74 65 73 74 63 61 73 65 28 20 77 74 46  .  testcase( wtF
36b0: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
36c0: 55 41 4c 20 29 3b 20 20 2f 2a 20 45 56 3a 20 52  UAL );  /* EV: R
36d0: 2d 30 30 32 31 31 2d 31 35 31 30 30 20 2a 2f 0a  -00211-15100 */.
36e0: 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72 6d    if( pWC->nTerm
36f0: 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a  >=pWC->nSlot ){.
3700: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
3710: 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20 20  Old = pWC->a;.  
3720: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
3730: 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 3b  pWC->pParse->db;
3740: 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73 71  .    pWC->a = sq
3750: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
3760: 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43 2d  (db, sizeof(pWC-
3770: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
3780: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
3790: 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20  WC->a==0 ){.    
37a0: 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26 20    if( wtFlags & 
37b0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
37c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
37d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 29  xprDelete(db, p)
37e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
37f0: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
3800: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3810: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
3820: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
3830: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
3840: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
3850: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
3860: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
3870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
3880: 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d 0a  b, pOld);.    }.
3890: 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d      pWC->nSlot =
38a0: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
38b0: 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61 29  Size(db, pWC->a)
38c0: 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30  /sizeof(pWC->a[0
38d0: 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 20  ]);.  }.  pTerm 
38e0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d 20  = &pWC->a[idx = 
38f0: 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20  pWC->nTerm++];. 
3900: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d 20   pTerm->pExpr = 
3910: 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  p;.  pTerm->wtFl
3920: 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a 20  ags = wtFlags;. 
3930: 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57   pTerm->pWC = pW
3940: 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72  C;.  pTerm->iPar
3950: 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ent = -1;.  retu
3960: 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn idx;.}../*.**
3970: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
3980: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
3990: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
39a0: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
39b0: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
39c0: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
39d0: 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20  ated by the AND 
39e0: 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65  operator or some
39f0: 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74   other.** operat
3a00: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
3a10: 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72  the op parameter
3a20: 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75  .  The WhereClau
3a30: 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  se structure.** 
3a40: 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  is filled with p
3a50: 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78  ointers to subex
3a60: 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20  pressions.  For 
3a70: 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20  example:.**.**  
3a80: 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c    WHERE  a=='hel
3a90: 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65  lo' AND coalesce
3aa0: 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63  (b,11)<10 AND (c
3ab0: 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29  +12!=d OR c==22)
3ac0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f  .**           \_
3ad0: 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f  _______/     \__
3ae0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20  _____________/  
3af0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
3b00: 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20  ____/.**        
3b10: 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20      slot[0]     
3b20: 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20         slot[1]  
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f               slo
3b40: 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  t[2].**.** The o
3b50: 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c  riginal WHERE cl
3b60: 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73  ause in pExpr is
3b70: 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c   unaltered.  All
3b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
3b90: 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c   does is make sl
3ba0: 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69  ot[] entries poi
3bb0: 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75  nt to substructu
3bc0: 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e  re within pExpr.
3bd0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72  .**.** In the pr
3be0: 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20  evious sentence 
3bf0: 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72  and in the diagr
3c00: 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66  am, "slot[]" ref
3c10: 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68  ers to.** the Wh
3c20: 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72  ereClause.a[] ar
3c30: 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b 5d  ray.  The slot[]
3c40: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
3c50: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
3c60: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
3c70: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
3c80: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
3c90: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
3ca0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
3cb0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
3cc0: 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70 20   op){.  pWC->op 
3cd0: 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28 20  = (u8)op;.  if( 
3ce0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
3cf0: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  n;.  if( pExpr->
3d00: 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77 68  op!=op ){.    wh
3d10: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
3d20: 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b 0a  pWC, pExpr, 0);.
3d30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 65    }else{.    whe
3d40: 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78  reSplit(pWC, pEx
3d50: 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b 0a  pr->pLeft, op);.
3d60: 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 70      whereSplit(p
3d70: 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  WC, pExpr->pRigh
3d80: 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  t, op);.  }.}../
3d90: 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
3da0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  an expression ma
3db0: 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65 4d  sk set (a WhereM
3dc0: 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a 2a  askSet object).*
3dd0: 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d 61  /.#define initMa
3de0: 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65 74  skSet(P)  memset
3df0: 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50  (P, 0, sizeof(*P
3e00: 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ))../*.** Return
3e10: 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
3e20: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
3e30: 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  r number.  Retur
3e40: 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f  n 0 if.** iCurso
3e50: 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  r is not in the 
3e60: 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  set..*/.static B
3e70: 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28 57  itmask getMask(W
3e80: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
3e90: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
3ea0: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
3eb0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
3ec0: 2d 3e 6e 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66  ->n<=(int)sizeof
3ed0: 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 3b 0a 20  (Bitmask)*8 );. 
3ee0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
3ef0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
3f00: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
3f10: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
3f20: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
3f30: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
3f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3f50: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3f60: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
3f70: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
3f80: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
3f90: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
3fa0: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
3fb0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
3fc0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
3fd0: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
3fe0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
3ff0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
4000: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
4010: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4020: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
4030: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
4040: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
4050: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
4060: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
4070: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
4080: 61 74 65 4d 61 73 6b 28 57 68 65 72 65 4d 61 73  ateMask(WhereMas
4090: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
40a0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
40b0: 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74  assert( pMaskSet
40c0: 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65 28  ->n < ArraySize(
40d0: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b  pMaskSet->ix) );
40e0: 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  .  pMaskSet->ix[
40f0: 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d  pMaskSet->n++] =
4100: 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a   iCursor;.}../*.
4110: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4120: 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65  walks (recursive
4130: 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ly) an expressio
4140: 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72  n tree and gener
4150: 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73  ates.** a bitmas
4160: 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69  k indicating whi
4170: 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73  ch tables are us
4180: 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65  ed in that expre
4190: 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a  ssion.** tree..*
41a0: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
41b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  r this routine t
41c0: 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c  o work, the call
41d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
41e0: 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f  t have.** previo
41f0: 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c  usly invoked sql
4200: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
4210: 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78  ames() on the ex
4220: 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a  pression.  See.*
4230: 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d  * the header com
4240: 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75  ment on that rou
4250: 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f  tine for additio
4260: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
4270: 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 52  .** The sqlite3R
4280: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
4290: 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73  ) routines looks
42a0: 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   for column name
42b0: 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68  s and.** sets th
42c0: 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54  eir opcodes to T
42d0: 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65  K_COLUMN and the
42e0: 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  ir Expr.iTable f
42f0: 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20  ields to.** the 
4300: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
4310: 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  er of the table.
4320: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a    This routine j
4330: 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72  ust has to.** tr
4340: 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73  anslate the curs
4350: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
4360: 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61  bitmask values a
4370: 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65  nd OR all.** the
4380: 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68   bitmasks togeth
4390: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  er..*/.static Bi
43a0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
43b0: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
43c0: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
43d0: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
43e0: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
43f0: 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61 73  leUsage(WhereMas
4400: 6b 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b  kSet*, Select*);
4410: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
4420: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 57  exprTableUsage(W
4430: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
4440: 73 6b 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b  skSet, Expr *p){
4450: 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20  .  Bitmask mask 
4460: 3d 20 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  = 0;.  if( p==0 
4470: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
4480: 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  ( p->op==TK_COLU
4490: 4d 4e 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d  MN ){.    mask =
44a0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
44b0: 74 2c 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  t, p->iTable);. 
44c0: 20 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a     return mask;.
44d0: 20 20 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70    }.  mask = exp
44e0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44f0: 6b 53 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29  kSet, p->pRight)
4500: 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72  ;.  mask |= expr
4510: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4520: 53 65 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a  Set, p->pLeft);.
4530: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
4540: 70 65 72 74 79 28 70 2c 20 45 50 5f 78 49 73 53  perty(p, EP_xIsS
4550: 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6d 61  elect) ){.    ma
4560: 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65 63 74  sk |= exprSelect
4570: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4580: 53 65 74 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63  Set, p->x.pSelec
4590: 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  t);.  }else{.   
45a0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
45b0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
45c0: 6b 53 65 74 2c 20 70 2d 3e 78 2e 70 4c 69 73 74  kSet, p->x.pList
45d0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
45e0: 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42  mask;.}.static B
45f0: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
4600: 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d  ableUsage(WhereM
4610: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
4620: 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  , ExprList *pLis
4630: 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  t){.  int i;.  B
4640: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4650: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
4660: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
4670: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
4680: 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d  ){.      mask |=
4690: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
46a0: 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d  pMaskSet, pList-
46b0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
46c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
46d0: 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20   mask;.}.static 
46e0: 42 69 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65  Bitmask exprSele
46f0: 63 74 54 61 62 6c 65 55 73 61 67 65 28 57 68 65  ctTableUsage(Whe
4700: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
4710: 53 65 74 2c 20 53 65 6c 65 63 74 20 2a 70 53 29  Set, Select *pS)
4720: 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b  {.  Bitmask mask
4730: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
4740: 53 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74  S ){.    SrcList
4750: 20 2a 70 53 72 63 3b 0a 20 20 20 20 6d 61 73 6b   *pSrc;.    mask
4760: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
4770: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4780: 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20   pS->pEList);.  
4790: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69    mask |= exprLi
47a0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  stTableUsage(pMa
47b0: 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75  skSet, pS->pGrou
47c0: 70 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c  pBy);.    mask |
47d0: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
47e0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
47f0: 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20  S->pOrderBy);.  
4800: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
4810: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4820: 74 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a  t, pS->pWhere);.
4830: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
4840: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
4850: 53 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67  Set, pS->pHaving
4860: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 53 72 63  );.    if( (pSrc
4870: 20 3d 20 70 53 2d 3e 70 53 72 63 29 21 3d 30 20   = pS->pSrc)!=0 
4880: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
4890: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
48a0: 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  <pSrc->nSrc; i++
48b0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20  ){.        mask 
48c0: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
48d0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
48e0: 2c 20 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 53 65  , pSrc->a[i].pSe
48f0: 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 6d  lect);.        m
4900: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4910: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4920: 70 53 72 63 2d 3e 61 5b 69 5d 2e 70 4f 6e 29 3b  pSrc->a[i].pOn);
4930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4940: 20 20 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69     pS = pS->pPri
4950: 6f 72 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  or;.  }.  return
4960: 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   mask;.}../*.** 
4970: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
4980: 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f  he given operato
4990: 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20  r is one of the 
49a0: 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20 69  operators that i
49b0: 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72  s.** allowed for
49c0: 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48   an indexable WH
49d0: 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e  ERE clause term.
49e0: 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70    The allowed op
49f0: 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22  erators are.** "
4a00: 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c  =", "<", ">", "<
4a10: 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49  =", ">=", and "I
4a20: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50 4c 45 4d  N"..**.** IMPLEM
4a30: 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 35  ENTATION-OF: R-5
4a40: 39 39 32 36 2d 32 36 33 39 33 20 54 6f 20 62 65  9926-26393 To be
4a50: 20 75 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e   usable by an in
4a60: 64 65 78 20 61 20 74 65 72 6d 20 6d 75 73 74 20  dex a term must 
4a70: 62 65 0a 2a 2a 20 6f 66 20 6f 6e 65 20 6f 66 20  be.** of one of 
4a80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f  the following fo
4a90: 72 6d 73 3a 20 63 6f 6c 75 6d 6e 20 3d 20 65 78  rms: column = ex
4aa0: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
4ab0: 3e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  > expression.** 
4ac0: 63 6f 6c 75 6d 6e 20 3e 3d 20 65 78 70 72 65 73  column >= expres
4ad0: 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20 3c 20 65 78  sion column < ex
4ae0: 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d 6e 20  pression column 
4af0: 3c 3d 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  <= expression.**
4b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 3d 20 63 6f   expression = co
4b10: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
4b20: 3e 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65 73 73  > column express
4b30: 69 6f 6e 20 3e 3d 20 63 6f 6c 75 6d 6e 0a 2a 2a  ion >= column.**
4b40: 20 65 78 70 72 65 73 73 69 6f 6e 20 3c 20 63 6f   expression < co
4b50: 6c 75 6d 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lumn expression 
4b60: 3c 3d 20 63 6f 6c 75 6d 6e 20 63 6f 6c 75 6d 6e  <= column column
4b70: 20 49 4e 0a 2a 2a 20 28 65 78 70 72 65 73 73 69   IN.** (expressi
4b80: 6f 6e 2d 6c 69 73 74 29 20 63 6f 6c 75 6d 6e 20  on-list) column 
4b90: 49 4e 20 28 73 75 62 71 75 65 72 79 29 20 63 6f  IN (subquery) co
4ba0: 6c 75 6d 6e 20 49 53 20 4e 55 4c 4c 0a 2a 2f 0a  lumn IS NULL.*/.
4bb0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
4bc0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
4bd0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
4be0: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
4bf0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4c00: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
4c10: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
4c20: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
4c30: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
4c40: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
4c50: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
4c60: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
4c70: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
4c80: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
4c90: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c   || op==TK_ISNUL
4ca0: 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70  L;.}../*.** Swap
4cb0: 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20   two objects of 
4cc0: 74 79 70 65 20 54 59 50 45 2e 0a 2a 2f 0a 23 64  type TYPE..*/.#d
4cd0: 65 66 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c  efine SWAP(TYPE,
4ce0: 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20  A,B) {TYPE t=A; 
4cf0: 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a  A=B; B=t;}../*.*
4d00: 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f 6d 70  * Commute a comp
4d10: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
4d20: 20 20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66    Expressions of
4d30: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 6f 70 20   the form "X op 
4d40: 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72  Y".** are conver
4d50: 74 65 64 20 69 6e 74 6f 20 22 59 20 6f 70 20 58  ted into "Y op X
4d60: 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 63 6f  "..**.** If a co
4d70: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
4d80: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
4d90: 69 74 68 20 65 69 74 68 65 72 20 74 68 65 20 6c  ith either the l
4da0: 65 66 74 20 6f 72 20 72 69 67 68 74 0a 2a 2a 20  eft or right.** 
4db0: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
4dc0: 61 72 69 73 6f 6e 2c 20 69 74 20 72 65 6d 61 69  arison, it remai
4dd0: 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
4de0: 74 68 20 74 68 65 20 73 61 6d 65 20 73 69 64 65  th the same side
4df0: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 63 6f   after.** the co
4e00: 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f 20 22 59  mmutation. So "Y
4e10: 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41 53 45 20   collate NOCASE 
4e20: 6f 70 20 58 22 20 62 65 63 6f 6d 65 73 20 0a 2a  op X" becomes .*
4e30: 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  * "X collate NOC
4e40: 41 53 45 20 6f 70 20 59 22 2e 20 54 68 69 73 20  ASE op Y". This 
4e50: 69 73 20 62 65 63 61 75 73 65 20 61 6e 79 20 63  is because any c
4e60: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4e70: 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c 65 66 74  e on.** the left
4e80: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20   hand side of a 
4e90: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76 65 72 72  comparison overr
4ea0: 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c 61 74 69  ides any collati
4eb0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a 2a 2a 20  on sequence .** 
4ec0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
4ed0: 72 69 67 68 74 2e 20 46 6f 72 20 74 68 65 20 73  right. For the s
4ee0: 61 6d 65 20 72 65 61 73 6f 6e 20 74 68 65 20 45  ame reason the E
4ef0: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20 66 6c 61  P_ExpCollate fla
4f00: 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6d 6d  g.** is not comm
4f10: 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uted..*/.static 
4f20: 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d 75 74 65  void exprCommute
4f30: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
4f40: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4f50: 75 31 36 20 65 78 70 52 69 67 68 74 20 3d 20 28  u16 expRight = (
4f60: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66  pExpr->pRight->f
4f70: 6c 61 67 73 20 26 20 45 50 5f 45 78 70 43 6f 6c  lags & EP_ExpCol
4f80: 6c 61 74 65 29 3b 0a 20 20 75 31 36 20 65 78 70  late);.  u16 exp
4f90: 4c 65 66 74 20 3d 20 28 70 45 78 70 72 2d 3e 70  Left = (pExpr->p
4fa0: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 45 50  Left->flags & EP
4fb0: 5f 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20  _ExpCollate);.  
4fc0: 61 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f  assert( allowedO
4fd0: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
4fe0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  pExpr->op!=TK_IN
4ff0: 20 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69   );.  pExpr->pRi
5000: 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d 20 73 71 6c  ght->pColl = sql
5010: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
5020: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
5030: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
5040: 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 20 3d 20  >pLeft->pColl = 
5050: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
5060: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
5070: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 53 57 41 50  ->pLeft);.  SWAP
5080: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
5090: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
50a0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
50b0: 6c 6c 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ll);.  pExpr->pR
50c0: 69 67 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70  ight->flags = (p
50d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c  Expr->pRight->fl
50e0: 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c  ags & ~EP_ExpCol
50f0: 6c 61 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b  late) | expLeft;
5100: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  .  pExpr->pLeft-
5110: 3e 66 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d  >flags = (pExpr-
5120: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
5130: 7e 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20  ~EP_ExpCollate) 
5140: 7c 20 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57  | expRight;.  SW
5150: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
5160: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
5170: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
5180: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a  r->op>=TK_GT ){.
5190: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
51a0: 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20  T==TK_GT+2 );.  
51b0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
51c0: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
51d0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
51e0: 5f 45 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _EQ );.    asser
51f0: 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29  t( TK_GT<TK_LE )
5200: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
5210: 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26  xpr->op>=TK_GT &
5220: 26 20 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f  & pExpr->op<=TK_
5230: 47 45 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d  GE );.    pExpr-
5240: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
5250: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
5260: 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  T;.  }.}../*.** 
5270: 54 72 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54  Translate from T
5280: 4b 5f 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f  K_xx operator to
5290: 20 57 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a   WO_xx bitmask..
52a0: 2a 2f 0a 73 74 61 74 69 63 20 75 31 36 20 6f 70  */.static u16 op
52b0: 65 72 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f  eratorMask(int o
52c0: 70 29 7b 0a 20 20 75 31 36 20 63 3b 0a 20 20 61  p){.  u16 c;.  a
52d0: 73 73 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70  ssert( allowedOp
52e0: 28 6f 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70  (op) );.  if( op
52f0: 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63  ==TK_IN ){.    c
5300: 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73   = WO_IN;.  }els
5310: 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e  e if( op==TK_ISN
5320: 55 4c 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57  ULL ){.    c = W
5330: 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73  O_ISNULL;.  }els
5340: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e{.    assert( (
5350: 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51  WO_EQ<<(op-TK_EQ
5360: 29 29 20 3c 20 30 78 37 66 66 66 20 29 3b 0a 20  )) < 0x7fff );. 
5370: 20 20 20 63 20 3d 20 28 75 31 36 29 28 57 4f 5f     c = (u16)(WO_
5380: 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45 51 29 29 3b  EQ<<(op-TK_EQ));
5390: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f  .  }.  assert( o
53a0: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
53b0: 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a  c==WO_ISNULL );.
53c0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
53d0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
53e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
53f0: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
5400: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
5410: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
5420: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
5430: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
5440: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
5450: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
5460: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
5470: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5480: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
5490: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
54a0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
54b0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
54c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
54d0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
54e0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
54f0: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
5500: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
5510: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
5520: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
5530: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
5540: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
5550: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
5560: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
5570: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
5580: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
5590: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
55a0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
55b0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
55c0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
55d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
55e0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
55f0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
5600: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
5610: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
5620: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
5630: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
5640: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
5650: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
5660: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
5670: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
5680: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
5690: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
56a0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
56b0: 20 2a 2f 0a 20 20 75 33 32 20 6f 70 2c 20 20 20   */.  u32 op,   
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
56d0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
56e0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
56f0: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
5700: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
5710: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
5720: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
5730: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
5740: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
5750: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
5760: 20 20 69 6e 74 20 6b 3b 0a 20 20 61 73 73 65 72    int k;.  asser
5770: 74 28 20 69 43 75 72 3e 3d 30 20 29 3b 0a 20 20  t( iCur>=0 );.  
5780: 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c 3b 0a 20 20  op &= WO_ALL;.  
5790: 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
57a0: 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , k=pWC->nTerm; 
57b0: 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
57c0: 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
57d0: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
57e0: 72 0a 20 20 20 20 20 20 20 26 26 20 28 70 54 65  r.       && (pTe
57f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
5800: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20  & notReady)==0. 
5810: 20 20 20 20 20 20 26 26 20 70 54 65 72 6d 2d 3e        && pTerm->
5820: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  u.leftColumn==iC
5830: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 20 26 26 20  olumn.       && 
5840: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
5850: 72 20 26 20 6f 70 29 21 3d 30 0a 20 20 20 20 29  r & op)!=0.    )
5860: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  {.      if( pIdx
5870: 20 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72   && pTerm->eOper
5880: 61 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator!=WO_ISNULL 
5890: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
58a0: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
58b0: 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  pr;.        Coll
58c0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
58d0: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
58e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
58f0: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
5900: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
5910: 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64  rse;..        id
5920: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
5930: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
5940: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
5950: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
5960: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
5970: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
5980: 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20  ontinue;..      
5990: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
59a0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
59b0: 71 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20  quence required 
59c0: 66 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f  from an index fo
59d0: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  r.        ** it 
59e0: 74 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72  to be useful for
59f0: 20 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72   optimising expr
5a00: 65 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65  ession pX. Store
5a10: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a   this.        **
5a20: 20 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62   value in variab
5a30: 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20  le pColl..      
5a40: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
5a50: 65 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  ert(pX->pLeft);.
5a60: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20          pColl = 
5a70: 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d  sqlite3BinaryCom
5a80: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
5a90: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70  se, pX->pLeft, p
5aa0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
5ab0: 20 20 20 20 61 73 73 65 72 74 28 70 43 6f 6c 6c      assert(pColl
5ac0: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 6e 45 72 72   || pParse->nErr
5ad0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  );..        for(
5ae0: 6a 3d 30 3b 20 70 49 64 78 2d 3e 61 69 43 6f 6c  j=0; pIdx->aiCol
5af0: 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d 6e 3b  umn[j]!=iColumn;
5b00: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5b10: 20 69 66 28 20 4e 45 56 45 52 28 6a 3e 3d 70 49   if( NEVER(j>=pI
5b20: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 20 29 20 72  dx->nColumn) ) r
5b30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
5b40: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
5b50: 43 6f 6c 6c 20 26 26 20 73 71 6c 69 74 65 33 53  Coll && sqlite3S
5b60: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
5b70: 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ame, pIdx->azCol
5b80: 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  l[j]) ) continue
5b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5ba0: 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20 20  return pTerm;.  
5bb0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
5bc0: 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72   0;.}../* Forwar
5bd0: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
5be0: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
5bf0: 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a 2c  nalyze(SrcList*,
5c00: 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69   WhereClause*, i
5c10: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  nt);../*.** Call
5c20: 20 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20   exprAnalyze on 
5c30: 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57  all terms in a W
5c40: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a  HERE clause.  .*
5c50: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
5c60: 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  oid exprAnalyzeA
5c70: 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  ll(.  SrcList *p
5c80: 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f  TabList,       /
5c90: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
5ca0: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  e */.  WhereClau
5cb0: 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20 20  se *pWC         
5cc0: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
5cd0: 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  use to be analyz
5ce0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ed */.){.  int i
5cf0: 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e  ;.  for(i=pWC->n
5d00: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
5d10: 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  -){.    exprAnal
5d20: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70 57  yze(pTabList, pW
5d30: 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  C, i);.  }.}..#i
5d40: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
5d50: 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54  T_LIKE_OPTIMIZAT
5d60: 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  ION./*.** Check 
5d70: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
5d80: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
5d90: 73 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  s a LIKE or GLOB
5da0: 20 6f 70 65 72 61 74 6f 72 20 74 68 61 74 0a 2a   operator that.*
5db0: 2a 20 63 61 6e 20 62 65 20 6f 70 74 69 6d 69 7a  * can be optimiz
5dc0: 65 64 20 75 73 69 6e 67 20 69 6e 65 71 75 61 6c  ed using inequal
5dd0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
5de0: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
5df0: 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20 61 6e 64   it is.** so and
5e00: 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
5e10: 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f  *.** In order fo
5e20: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 74  r the operator t
5e30: 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69 62 6c 65  o be optimizible
5e40: 2c 20 74 68 65 20 52 48 53 20 6d 75 73 74 20 62  , the RHS must b
5e50: 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a 20 6c 69  e a string.** li
5e60: 74 65 72 61 6c 20 74 68 61 74 20 64 6f 65 73 20  teral that does 
5e70: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  not begin with a
5e80: 20 77 69 6c 64 63 61 72 64 2e 20 20 0a 2a 2f 0a   wildcard.  .*/.
5e90: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4c 69 6b  static int isLik
5ea0: 65 4f 72 47 6c 6f 62 28 0a 20 20 50 61 72 73 65  eOrGlob(.  Parse
5eb0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a 20   *pParse,    /* 
5ec0: 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
5ed0: 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
5ee0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
5ef0: 45 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65  Expr,      /* Te
5f00: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
5f10: 6f 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 2a 70  on */.  Expr **p
5f20: 70 50 72 65 66 69 78 2c 20 20 2f 2a 20 50 6f 69  pPrefix,  /* Poi
5f30: 6e 74 65 72 20 74 6f 20 54 4b 5f 53 54 52 49 4e  nter to TK_STRIN
5f40: 47 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  G expression wit
5f50: 68 20 70 61 74 74 65 72 6e 20 70 72 65 66 69 78  h pattern prefix
5f60: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43 6f   */.  int *pisCo
5f70: 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65 20  mplete, /* True 
5f80: 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c 64  if the only wild
5f90: 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68 65  card is % in the
5fa0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
5fb0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61 73  */.  int *pnoCas
5fc0: 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  e      /* True i
5fd0: 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20 65  f uppercase is e
5fe0: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f 77  quivalent to low
5ff0: 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 63  ercase */.){.  c
6000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
6010: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ;         /* Str
6020: 69 6e 67 20 6f 6e 20 52 48 53 20 6f 66 20 4c 49  ing on RHS of LI
6030: 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  KE operator */. 
6040: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
6050: 70 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 52  pLeft;      /* R
6060: 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69  ight and left si
6070: 7a 65 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61  ze of LIKE opera
6080: 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  tor */.  ExprLis
6090: 74 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  t *pList;       
60a0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 6f      /* List of o
60b0: 70 65 72 61 6e 64 73 20 74 6f 20 74 68 65 20 4c  perands to the L
60c0: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
60d0: 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20    int c;        
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
60f0: 4f 6e 65 20 63 68 61 72 61 63 74 65 72 20 69 6e  One character in
6100: 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 63 6e   z[] */.  int cn
6110: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
6120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6130: 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20 70  f non-wildcard p
6140: 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72 73  refix characters
6150: 20 2a 2f 0a 20 20 63 68 61 72 20 77 63 5b 33 5d   */.  char wc[3]
6160: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6170: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 63 68 61   /* Wildcard cha
6180: 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 73 71 6c  racters */.  sql
6190: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
61a0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74 61 62  e->db;  /* Datab
61b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
61c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
61d0: 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20 20 69  e *pVal = 0;.  i
61e0: 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
61f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 63            /* Opc
6200: 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20 2a 2f  ode of pRight */
6210: 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ..  if( !sqlite3
6220: 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28 64  IsLikeFunction(d
6230: 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43 61 73  b, pExpr, pnoCas
6240: 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72 65  e, wc) ){.    re
6250: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69 66 64  turn 0;.  }.#ifd
6260: 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44 49 43  ef SQLITE_EBCDIC
6270: 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73 65 20  .  if( *pnoCase 
6280: 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64  ) return 0;.#end
6290: 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78  if.  pList = pEx
62a0: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 70  pr->x.pList;.  p
62b0: 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b  Left = pList->a[
62c0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  1].pExpr;.  if( 
62d0: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pLeft->op!=TK_CO
62e0: 4c 55 4d 4e 20 7c 7c 20 73 71 6c 69 74 65 33 45  LUMN || sqlite3E
62f0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
6300: 74 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  t)!=SQLITE_AFF_T
6310: 45 58 54 20 29 7b 0a 20 20 20 20 2f 2a 20 49 4d  EXT ){.    /* IM
6320: 50 3a 20 52 2d 30 32 30 36 35 2d 34 39 34 36 35  P: R-02065-49465
6330: 20 54 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73   The left-hand s
6340: 69 64 65 20 6f 66 20 74 68 65 20 4c 49 4b 45 20  ide of the LIKE 
6350: 6f 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  or GLOB operator
6360: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
6370: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 69  the name of an i
6380: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 77 69  ndexed column wi
6390: 74 68 20 54 45 58 54 20 61 66 66 69 6e 69 74 79  th TEXT affinity
63a0: 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  . */.    return 
63b0: 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
63c0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 21   pLeft->iColumn!
63d0: 3d 28 2d 31 29 20 29 3b 20 2f 2a 20 42 65 63 61  =(-1) ); /* Beca
63e0: 75 73 65 20 49 50 4b 20 6e 65 76 65 72 20 68 61  use IPK never ha
63f0: 73 20 41 46 46 5f 54 45 58 54 20 2a 2f 0a 0a 20  s AFF_TEXT */.. 
6400: 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74 2d   pRight = pList-
6410: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 6f  >a[0].pExpr;.  o
6420: 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b 0a  p = pRight->op;.
6430: 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45 47    if( op==TK_REG
6440: 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70 20  ISTER ){.    op 
6450: 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a 20  = pRight->op2;. 
6460: 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f   }.  if( op==TK_
6470: 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20 20  VARIABLE ){.    
6480: 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72 65  Vdbe *pReprepare
6490: 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70 72   = pParse->pRepr
64a0: 65 70 61 72 65 3b 0a 20 20 20 20 69 6e 74 20 69  epare;.    int i
64b0: 43 6f 6c 20 3d 20 70 52 69 67 68 74 2d 3e 69 43  Col = pRight->iC
64c0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 56 61 6c 20  olumn;.    pVal 
64d0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
64e0: 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72 65  Value(pReprepare
64f0: 2c 20 69 43 6f 6c 2c 20 53 51 4c 49 54 45 5f 41  , iCol, SQLITE_A
6500: 46 46 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 69 66  FF_NONE);.    if
6510: 28 20 70 56 61 6c 20 26 26 20 73 71 6c 69 74 65  ( pVal && sqlite
6520: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56 61  3_value_type(pVa
6530: 6c 29 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  l)==SQLITE_TEXT 
6540: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 28 63 68  ){.      z = (ch
6550: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  ar *)sqlite3_val
6560: 75 65 5f 74 65 78 74 28 70 56 61 6c 29 3b 0a 20  ue_text(pVal);. 
6570: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6580: 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
6590: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 43  Parse->pVdbe, iC
65a0: 6f 6c 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32  ol); /* IMP: R-2
65b0: 33 32 35 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20  3257-02778 */.  
65c0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
65d0: 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c  ->op==TK_VARIABL
65e0: 45 20 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d  E || pRight->op=
65f0: 3d 54 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a  =TK_REGISTER );.
6600: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
6610: 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20  TK_STRING ){.   
6620: 20 7a 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a   z = pRight->u.z
6630: 54 6f 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  Token;.  }.  if(
6640: 20 7a 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20   z ){.    cnt = 
6650: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63  0;.    while( (c
6660: 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63  =z[cnt])!=0 && c
6670: 21 3d 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63  !=wc[0] && c!=wc
6680: 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20  [1] && c!=wc[2] 
6690: 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
66a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e      }.    if( cn
66b0: 74 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75 38  t!=0 && 255!=(u8
66c0: 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20 20  )z[cnt-1] ){.   
66d0: 20 20 20 45 78 70 72 20 2a 70 50 72 65 66 69 78     Expr *pPrefix
66e0: 3b 0a 20 20 20 20 20 20 2a 70 69 73 43 6f 6d 70  ;.      *pisComp
66f0: 6c 65 74 65 20 3d 20 63 3d 3d 77 63 5b 30 5d 20  lete = c==wc[0] 
6700: 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a  && z[cnt+1]==0;.
6710: 20 20 20 20 20 20 70 50 72 65 66 69 78 20 3d 20        pPrefix = 
6720: 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20  sqlite3Expr(db, 
6730: 54 4b 5f 53 54 52 49 4e 47 2c 20 7a 29 3b 0a 20  TK_STRING, z);. 
6740: 20 20 20 20 20 69 66 28 20 70 50 72 65 66 69 78       if( pPrefix
6750: 20 29 20 70 50 72 65 66 69 78 2d 3e 75 2e 7a 54   ) pPrefix->u.zT
6760: 6f 6b 65 6e 5b 63 6e 74 5d 20 3d 20 30 3b 0a 20  oken[cnt] = 0;. 
6770: 20 20 20 20 20 2a 70 70 50 72 65 66 69 78 20 3d       *ppPrefix =
6780: 20 70 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20   pPrefix;.      
6790: 69 66 28 20 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  if( op==TK_VARIA
67a0: 42 4c 45 20 29 7b 0a 20 20 20 20 20 20 20 20 56  BLE ){.        V
67b0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
67c0: 3e 70 56 64 62 65 3b 0a 20 20 20 20 20 20 20 20  >pVdbe;.        
67d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
67e0: 72 6d 61 73 6b 28 76 2c 20 70 52 69 67 68 74 2d  rmask(v, pRight-
67f0: 3e 69 43 6f 6c 75 6d 6e 29 3b 20 2f 2a 20 49 4d  >iColumn); /* IM
6800: 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38  P: R-23257-02778
6810: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
6820: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26 26 20  *pisComplete && 
6830: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
6840: 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [1] ){.         
6850: 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73 20 6f   /* If the rhs o
6860: 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70 72 65  f the LIKE expre
6870: 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72 69 61  ssion is a varia
6880: 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63 75 72  ble, and the cur
6890: 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20 20 2a  rent.          *
68a0: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 76  * value of the v
68b0: 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20 74 68  ariable means th
68c0: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74  ere is no need t
68d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c 49 4b  o invoke the LIK
68e0: 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  E.          ** f
68f0: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 6e 6f  unction, then no
6900: 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77 69 6c   OP_Variable wil
6910: 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  l be added to th
6920: 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20 20 20  e program..     
6930: 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 75       ** This cau
6940: 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66 6f 72  ses problems for
6950: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
6960: 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
6970: 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ().          ** 
6980: 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72 6f 75  API. To workarou
6990: 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61 20 64  nd them, add a d
69a0: 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62 6c 65  ummy OP_Variable
69b0: 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20 20 20   here..         
69c0: 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 69   */ .          i
69d0: 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47  nt r1 = sqlite3G
69e0: 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
69f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6a00: 69 74 65 33 45 78 70 72 43 6f 64 65 54 61 72 67  ite3ExprCodeTarg
6a10: 65 74 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  et(pParse, pRigh
6a20: 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  t, r1);.        
6a30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6a40: 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74 65 33  ngeP3(v, sqlite3
6a50: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6a60: 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  v)-1, 0);.      
6a70: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
6a80: 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
6a90: 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , r1);.        }
6aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
6ab0: 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 30 3b  se{.      z = 0;
6ac0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71  .    }.  }..  sq
6ad0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
6ae0: 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  Val);.  return (
6af0: 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  z!=0);.}.#endif 
6b00: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  /* SQLITE_OMIT_L
6b10: 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  IKE_OPTIMIZATION
6b20: 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
6b30: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6b40: 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 68 65  LTABLE./*.** Che
6b50: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
6b60: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
6b70: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
6b80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 63  .**.**         c
6b90: 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72  olumn MATCH expr
6ba0: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  .**.** If it is 
6bb0: 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52 55 45  then return TRUE
6bc0: 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74 75 72  .  If not, retur
6bd0: 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74  n FALSE..*/.stat
6be0: 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68 4f 66  ic int isMatchOf
6bf0: 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a  Column(.  Expr *
6c00: 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20 54 65  pExpr      /* Te
6c10: 73 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69  st this expressi
6c20: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c  on */.){.  ExprL
6c30: 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69  ist *pList;..  i
6c40: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
6c50: 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
6c60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
6c70: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6c80: 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Cmp(pExpr->u.zTo
6c90: 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d 30 20  ken,"match")!=0 
6ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6cb0: 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70  .  }.  pList = p
6cc0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
6cd0: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70   if( pList->nExp
6ce0: 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74 75  r!=2 ){.    retu
6cf0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
6d00: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
6d10: 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c 55  r->op != TK_COLU
6d20: 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  MN ){.    return
6d30: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
6d40: 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   1;.}.#endif /* 
6d50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6d60: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a  UALTABLE */../*.
6d70: 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65 20  ** If the pBase 
6d80: 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67 69  expression origi
6d90: 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e 20  nated in the ON 
6da0: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  or USING clause 
6db0: 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74 68  of.** a join, th
6dc0: 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
6dd0: 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72 6b  appropriate mark
6de0: 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65 72  ings over to der
6df0: 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ived..*/.static 
6e00: 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f 69  void transferJoi
6e10: 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20 2a  nMarkings(Expr *
6e20: 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20 2a  pDerived, Expr *
6e30: 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69 76  pBase){.  pDeriv
6e40: 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42 61  ed->flags |= pBa
6e50: 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 46  se->flags & EP_F
6e60: 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72 69  romJoin;.  pDeri
6e70: 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54  ved->iRightJoinT
6e80: 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69 52  able = pBase->iR
6e90: 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d  ightJoinTable;.}
6ea0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
6eb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
6ec0: 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20 21  TIMIZATION) && !
6ed0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ee0: 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f 2a  MIT_SUBQUERY)./*
6ef0: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65  .** Analyze a te
6f00: 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73 74 73  rm that consists
6f10: 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   of two or more 
6f20: 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a 20  OR-connected.** 
6f30: 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20 69 6e  subterms.  So in
6f40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e 2e 20  :.**.**     ... 
6f50: 57 48 45 52 45 20 20 28 61 3d 35 29 20 41 4e 44  WHERE  (a=5) AND
6f60: 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f 52 20   (b=7 OR c=9 OR 
6f70: 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31 33 29  d=13) AND (d=13)
6f80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 5e 5e 5e               ^^^
6fa0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6fb0: 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ^.**.** This rou
6fc0: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 65  tine analyzes te
6fd0: 72 6d 73 20 73 75 63 68 20 61 73 20 74 68 65 20  rms such as the 
6fe0: 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e 20 74  middle term in t
6ff0: 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70 6c 65  he above example
7000: 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72 54 65  ..** A WhereOrTe
7010: 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6d  rm object is com
7020: 70 75 74 65 64 20 61 6e 64 20 61 74 74 61 63 68  puted and attach
7030: 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d 20 75  ed to the term u
7040: 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73 69 73  nder.** analysis
7050: 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20  , regardless of 
7060: 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66 20 74  the outcome of t
7070: 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20 48 65  he analysis.  He
7080: 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57  nce:.**.**     W
7090: 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73  hereTerm.wtFlags
70a0: 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52 49 4e     |=  TERM_ORIN
70b0: 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54  FO.**     WhereT
70c0: 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20 20 3d  erm.u.pOrInfo  =
70d0: 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20    a dynamically 
70e0: 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 4f  allocated WhereO
70f0: 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a 2a 0a  rTerm object.**.
7100: 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65 69 6e  ** The term bein
7110: 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73 74 20  g analyzed must 
7120: 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65  have two or more
7130: 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64   of OR-connected
7140: 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20 41 20   subterms..** A 
7150: 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d 20 6d  single subterm m
7160: 69 67 68 74 20 62 65 20 61 20 73 65 74 20 6f 66  ight be a set of
7170: 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64 20 73   AND-connected s
7180: 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ub-subterms..** 
7190: 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65 72 6d  Examples of term
71a0: 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73 69 73  s under analysis
71b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41 29 20  :.**.**     (A) 
71c0: 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52      t1.x=t2.y OR
71d0: 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20 74 31   t1.x=t2.z OR t1
71e0: 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d 74 33  .y=15 OR t1.z=t3
71f0: 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42 29 20  .a+5.**     (B) 
7200: 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20 65      x=expr1 OR e
7210: 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78 70 72  xpr2=x OR x=expr
7220: 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20 20 20  3.**     (C)    
7230: 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20 28 74   t1.x=t2.y OR (t
7240: 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74 31 2e  1.x=t2.z AND t1.
7250: 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28 44 29  y=15).**     (D)
7260: 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52 20       x=expr1 OR 
7270: 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32 20 41  (y>11 AND y<22 A
7280: 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65 6c 6c  ND z LIKE '*hell
7290: 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45 29 20  o*').**     (E) 
72a0: 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44 20 71      (p.a=1 AND q
72b0: 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33 29 20  .b=2 AND r.c=3) 
72c0: 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20 71 2e  OR (p.x=4 AND q.
72d0: 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29 0a 2a  y=5 AND r.z=6).*
72e0: 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a 2a 0a  *.** CASE 1:.**.
72f0: 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72  ** If all subter
7300: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
7310: 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f 72 20  rm T.C=expr for 
7320: 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f 6c 75  some single colu
7330: 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73 69 6e  mn of C.** a sin
7340: 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61 73 20  gle table T (as 
7350: 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70 6c 65  shown in example
7360: 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e 20 63   B above) then c
7370: 72 65 61 74 65 20 61 20 6e 65 77 20 76 69 72 74  reate a new virt
7380: 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68 61 74  ual.** term that
7390: 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c 65 6e   is an equivalen
73a0: 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f 6e 2e  t IN expression.
73b0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
73c0: 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a 2a 2a  , if the term.**
73d0: 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20   being analyzed 
73e0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 78  is:.**.**      x
73f0: 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20 65 78   = expr1  OR  ex
7400: 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78 20 3d  pr2 = x  OR  x =
7410: 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74 68 65   expr3.**.** the
7420: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76  n create a new v
7430: 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69 6b 65  irtual term like
7440: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
7450: 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c 65 78    x IN (expr1,ex
7460: 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a 2a 2a  pr2,expr3).**.**
7470: 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a 20 49   CASE 2:.**.** I
7480: 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73 20 61  f all subterms a
7490: 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62 79 20  re indexable by 
74a0: 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 54  a single table T
74b0: 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a 2a 2a  , then set.**.**
74c0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 65       WhereTerm.e
74d0: 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20 20 20  Operator        
74e0: 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52 0a 2a        =  WO_OR.*
74f0: 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e  *     WhereTerm.
7500: 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78  u.pOrInfo->index
7510: 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20 63 75  able  |=  the cu
7520: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
7530: 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20 41 20  table T.**.** A 
7540: 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e 64 65  subterm is "inde
7550: 78 61 62 6c 65 22 20 69 66 20 69 74 20 69 73 20  xable" if it is 
7560: 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22  of the form.** "
7570: 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22  T.C <op> <expr>"
7580: 20 77 68 65 72 65 20 43 20 69 73 20 61 6e 79 20   where C is any 
7590: 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20  column of table 
75a0: 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e 20 69  T and .** <op> i
75b0: 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20 22 3c  s one of "=", "<
75c0: 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20 22 3e  ", "<=", ">", ">
75d0: 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c 20 6f  =", "IS NULL", o
75e0: 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73 75 62  r "IN"..** A sub
75f0: 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69 6e 64  term is also ind
7600: 65 78 61 62 6c 65 20 69 66 20 69 74 20 69 73 20  exable if it is 
7610: 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20 6f 72  an AND of two or
7620: 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75 62 74   more.** subsubt
7630: 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  erms at least on
7640: 65 20 6f 66 20 77 68 69 63 68 20 69 73 20 69 6e  e of which is in
7650: 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65 78 61  dexable.  Indexa
7660: 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75 62 74  ble AND .** subt
7670: 65 72 6d 73 20 68 61 76 65 20 74 68 65 69 72 20  erms have their 
7680: 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f  eOperator set to
7690: 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68 65 79   WO_AND and they
76a0: 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e 64 49   have.** u.pAndI
76b0: 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64 79 6e  nfo set to a dyn
76c0: 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
76d0: 65 64 20 57 68 65 72 65 41 6e 64 54 65 72 6d 20  ed WhereAndTerm 
76e0: 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 46 72  object..**.** Fr
76f0: 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69 6e 74  om another point
7700: 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64 65 78   of view, "index
7710: 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68 61 74  able" means that
7720: 20 74 68 65 20 73 75 62 74 65 72 6d 20 63 6f 75   the subterm cou
7730: 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61 6c 6c  ld.** potentiall
7740: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  y be used with a
7750: 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20 61 70  n index if an ap
7760: 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65 78 20  propriate index 
7770: 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69 73 20  exists..** This 
7780: 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20 6e 6f  analysis does no
7790: 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65 74 68  t consider wheth
77a0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 69 6e  er or not the in
77b0: 64 65 78 20 65 78 69 73 74 73 3b 20 74 68 61 74  dex exists; that
77c0: 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  .** is something
77d0: 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
77e0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 65   routine will de
77f0: 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73 20 61  termine.  This a
7800: 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c 79 20  nalysis.** only 
7810: 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68 65 72  looks at whether
7820: 20 73 75 62 74 65 72 6d 73 20 61 70 70 72 6f 70   subterms approp
7830: 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78 69  riate for indexi
7840: 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ng exist..**.** 
7850: 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41 20 74  All examples A t
7860: 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65 20 61  hrough E above a
7870: 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73 65 20  ll satisfy case 
7880: 32 2e 20 20 42 75 74 20 69 66 20 61 20 74 65 72  2.  But if a ter
7890: 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74 69 73  m.** also statis
78a0: 66 69 65 73 20 63 61 73 65 20 31 20 28 73 75 63  fies case 1 (suc
78b0: 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f 77 20  h as B) we know 
78c0: 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
78d0: 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77 61 79  er will.** alway
78e0: 73 20 70 72 65 66 65 72 20 63 61 73 65 20 31 2c  s prefer case 1,
78f0: 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61 73 65   so in that case
7900: 20 77 65 20 70 72 65 74 65 6e 64 20 74 68 61 74   we pretend that
7910: 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74 0a 2a   case 2 is not.*
7920: 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a 2a 0a  * satisfied..**.
7930: 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65 20 74  ** It might be t
7940: 68 65 20 63 61 73 65 20 74 68 61 74 20 6d 75 6c  he case that mul
7950: 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61 72 65  tiple tables are
7960: 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46 6f 72   indexable.  For
7970: 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28 45 29   example,.** (E)
7980: 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65 78 61   above is indexa
7990: 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20 50 2c  ble on tables P,
79a0: 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a 2a 2a   Q, and R..**.**
79b0: 20 54 65 72 6d 73 20 74 68 61 74 20 73 61 74 69   Terms that sati
79c0: 73 66 79 20 63 61 73 65 20 32 20 61 72 65 20 63  sfy case 2 are c
79d0: 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6c 6f  andidates for lo
79e0: 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a 2a 2a  okup by using.**
79f0: 20 73 65 70 61 72 61 74 65 20 69 6e 64 69 63 65   separate indice
7a00: 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69 64 73  s to find rowids
7a10: 20 66 6f 72 20 65 61 63 68 20 73 75 62 74 65 72   for each subter
7a20: 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e 67 0a  m and composing.
7a30: 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f 66 20  ** the union of 
7a40: 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69 6e 67  all rowids using
7a50: 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74   a RowSet object
7a60: 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  .  This is simil
7a70: 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d 61 70  ar.** to "bitmap
7a80: 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f 74 68   indices" in oth
7a90: 65 72 20 64 61 74 61 62 61 73 65 20 65 6e 67 69  er database engi
7aa0: 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48 45 52  nes..**.** OTHER
7ab0: 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  WISE:.**.** If n
7ac0: 65 69 74 68 65 72 20 63 61 73 65 20 31 20 6e 6f  either case 1 no
7ad0: 72 20 63 61 73 65 20 32 20 61 70 70 6c 79 2c 20  r case 2 apply, 
7ae0: 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65 20 65  then leave the e
7af0: 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74 6f 0a  Operator set to.
7b00: 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73 20 74  ** zero.  This t
7b10: 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65 66 75  erm is not usefu
7b20: 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a 2a 2f  l for search..*/
7b30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
7b40: 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28 0a  rAnalyzeOrTerm(.
7b50: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
7b60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
7b70: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
7b80: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
7b90: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a  *pWC,         /*
7ba0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 57 48   the complete WH
7bb0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
7bc0: 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20  int idxTerm     
7bd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
7be0: 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74 65 72  ex of the OR-ter
7bf0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
7c00: 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65 20 2a   */.){.  Parse *
7c10: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
7c20: 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
7c30: 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e 74 65   /* Parser conte
7c40: 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  xt */.  sqlite3 
7c50: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
7c60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7c70: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
7c80: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68 65 72  ection */.  Wher
7c90: 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26  eTerm *pTerm = &
7ca0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
7cb0: 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20      /* The term 
7cc0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
7cd0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
7ce0: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 20  = pTerm->pExpr; 
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7d00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
7d10: 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20 20 57   the term */.  W
7d20: 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61  hereMaskSet *pMa
7d30: 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
7d40: 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c 65 20  skSet; /* Table 
7d50: 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 69  use masks */.  i
7d60: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d80: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
7d90: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57 68 65  ounters */.  Whe
7da0: 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b  reClause *pOrWc;
7db0: 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61 6b 75         /* Breaku
7dc0: 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74 6f 20  p of pTerm into 
7dd0: 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 57 68  subterms */.  Wh
7de0: 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
7df0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53 75 62  ;       /* A Sub
7e00: 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65  -term within the
7e10: 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68 65 72   pOrWc */.  Wher
7e20: 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f  eOrInfo *pOrInfo
7e30: 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f  ;     /* Additio
7e40: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
7e50: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
7e60: 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74 6d 61  pTerm */.  Bitma
7e70: 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20 20 20  sk chngToIN;    
7e80: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 74       /* Tables t
7e90: 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73 66  hat might satisf
7ea0: 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20 42 69  y case 1 */.  Bi
7eb0: 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c 65 3b  tmask indexable;
7ec0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
7ed0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 64 65 78  s that are index
7ee0: 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69 6e 67  able, satisfying
7ef0: 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20 2f 2a   case 2 */..  /*
7f00: 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68 65 20  .  ** Break the 
7f10: 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 69  OR clause into i
7f20: 74 73 20 73 65 70 61 72 61 74 65 20 73 75 62 74  ts separate subt
7f30: 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62 74 65  erms.  The subte
7f40: 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73 74 6f  rms are.  ** sto
7f50: 72 65 64 20 69 6e 20 61 20 57 68 65 72 65 43 6c  red in a WhereCl
7f60: 61 75 73 65 20 73 74 72 75 63 74 75 72 65 20 63  ause structure c
7f70: 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68 69 6e  ontaining within
7f80: 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e 66 6f   the WhereOrInfo
7f90: 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  .  ** object tha
7fa0: 74 20 69 73 20 61 74 74 61 63 68 65 64 20 74 6f  t is attached to
7fb0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 4f 52   the original OR
7fc0: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a 20 20   clause term..  
7fd0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  */.  assert( (pT
7fe0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
7ff0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45 52  TERM_DYNAMIC|TER
8000: 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f 41 4e  M_ORINFO|TERM_AN
8010: 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20  DINFO))==0 );.  
8020: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
8030: 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 70 54  p==TK_OR );.  pT
8040: 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 20 3d  erm->u.pOrInfo =
8050: 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c 69 74   pOrInfo = sqlit
8060: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
8070: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72 49 6e  b, sizeof(*pOrIn
8080: 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f 72 49  fo));.  if( pOrI
8090: 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  nfo==0 ) return;
80a0: 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  .  pTerm->wtFlag
80b0: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  s |= TERM_ORINFO
80c0: 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70 4f 72  ;.  pOrWc = &pOr
80d0: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68 65 72  Info->wc;.  wher
80e0: 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f 72 57  eClauseInit(pOrW
80f0: 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20  c, pWC->pParse, 
8100: 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65  pMaskSet);.  whe
8110: 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c 20 70  reSplit(pOrWc, p
8120: 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20  Expr, TK_OR);.  
8130: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
8140: 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20 20 69  Src, pOrWc);.  i
8150: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
8160: 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  led ) return;.  
8170: 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d 3e 6e  assert( pOrWc->n
8180: 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20 2f 2a  Term>=2 );..  /*
8190: 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  .  ** Compute th
81a0: 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20  e set of tables 
81b0: 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69 73  that might satis
81c0: 66 79 20 63 61 73 65 73 20 31 20 6f 72 20 32 2e  fy cases 1 or 2.
81d0: 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61 62 6c  .  */.  indexabl
81e0: 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  e = ~(Bitmask)0;
81f0: 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 7e 28  .  chngToIN = ~(
8200: 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20 20 66  pWC->vmask);.  f
8210: 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  or(i=pOrWc->nTer
8220: 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72  m-1, pOrTerm=pOr
8230: 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26 20 69  Wc->a; i>=0 && i
8240: 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c 20 70  ndexable; i--, p
8250: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69  OrTerm++){.    i
8260: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  f( (pOrTerm->eOp
8270: 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49 4e 47  erator & WO_SING
8280: 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  LE)==0 ){.      
8290: 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a 70 41  WhereAndInfo *pA
82a0: 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  ndInfo;.      as
82b0: 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65  sert( pOrTerm->e
82c0: 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b 0a 20  Operator==0 );. 
82d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
82e0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
82f0: 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 7c 54   (TERM_ANDINFO|T
8300: 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d 30 20  ERM_ORINFO))==0 
8310: 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54 6f 49  );.      chngToI
8320: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 6e  N = 0;.      pAn
8330: 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  dInfo = sqlite3D
8340: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73  bMallocRaw(db, s
8350: 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66 6f 29  izeof(*pAndInfo)
8360: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 6e  );.      if( pAn
8370: 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  dInfo ){.       
8380: 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41   WhereClause *pA
8390: 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20 57 68  ndWC;.        Wh
83a0: 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54 65 72  ereTerm *pAndTer
83b0: 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  m;.        int j
83c0: 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73  ;.        Bitmas
83d0: 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  k b = 0;.       
83e0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64   pOrTerm->u.pAnd
83f0: 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66 6f 3b  Info = pAndInfo;
8400: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
8410: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
8420: 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20 20 20  M_ANDINFO;.     
8430: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65     pOrTerm->eOpe
8440: 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44 3b 0a  rator = WO_AND;.
8450: 20 20 20 20 20 20 20 20 70 41 6e 64 57 43 20 3d          pAndWC =
8460: 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a   &pAndInfo->wc;.
8470: 20 20 20 20 20 20 20 20 77 68 65 72 65 43 6c 61          whereCla
8480: 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43 2c 20  useInit(pAndWC, 
8490: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4d 61  pWC->pParse, pMa
84a0: 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20 20 20  skSet);.        
84b0: 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e 64 57  whereSplit(pAndW
84c0: 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70  C, pOrTerm->pExp
84d0: 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20 20  r, TK_AND);.    
84e0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41      exprAnalyzeA
84f0: 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57 43 29  ll(pSrc, pAndWC)
8500: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
8510: 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se( db->mallocFa
8520: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
8530: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
8540: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ailed ){.       
8550: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41 6e 64     for(j=0, pAnd
8560: 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61 3b 20  Term=pAndWC->a; 
8570: 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72 6d 3b  j<pAndWC->nTerm;
8580: 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d 2b 2b   j++, pAndTerm++
8590: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
85a0: 73 73 65 72 74 28 20 70 41 6e 64 54 65 72 6d 2d  ssert( pAndTerm-
85b0: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
85c0: 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f 77 65        if( allowe
85d0: 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e 70 45  dOp(pAndTerm->pE
85e0: 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20 20 20  xpr->op) ){.    
85f0: 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67            b |= g
8600: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
8610: 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66 74 43   pAndTerm->leftC
8620: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
8630: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8640: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8650: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
8660: 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   b;.      }.    
8670: 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
8680: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8690: 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20  M_COPIED ){.    
86a0: 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73 20 74    /* Skip this t
86b0: 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20 57 65  erm for now.  We
86c0: 20 72 65 76 69 73 69 74 20 69 74 20 77 68 65 6e   revisit it when
86d0: 20 77 65 20 70 72 6f 63 65 73 73 20 74 68 65 0a   we process the.
86e0: 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70        ** corresp
86f0: 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49 52 54  onding TERM_VIRT
8700: 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  UAL term */.    
8710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42 69 74  }else{.      Bit
8720: 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20 62 20  mask b;.      b 
8730: 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
8740: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
8750: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8760: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  if( pOrTerm->wtF
8770: 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
8780: 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 57  UAL ){.        W
8790: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
87a0: 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70 4f 72   = &pOrWc->a[pOr
87b0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
87c0: 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67 65 74          b |= get
87d0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
87e0: 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72 73 6f  Other->leftCurso
87f0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
8800: 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d 20 62    indexable &= b
8810: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
8820: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21 3d  erm->eOperator!=
8830: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  WO_EQ ){.       
8840: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
8850: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
8860: 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26 3d 20      chngToIN &= 
8870: 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  b;.      }.    }
8880: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
8890: 52 65 63 6f 72 64 20 74 68 65 20 73 65 74 20 6f  Record the set o
88a0: 66 20 74 61 62 6c 65 73 20 74 68 61 74 20 73 61  f tables that sa
88b0: 74 69 73 66 79 20 63 61 73 65 20 32 2e 20 20 54  tisfy case 2.  T
88c0: 68 65 20 73 65 74 20 6d 69 67 68 74 20 62 65 0a  he set might be.
88d0: 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20 2a 2f    ** empty..  */
88e0: 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65  .  pOrInfo->inde
88f0: 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61 62 6c  xable = indexabl
8900: 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65  e;.  pTerm->eOpe
8910: 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61 62 6c  rator = indexabl
8920: 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f 4f 52  e==0 ? 0 : WO_OR
8930: 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 68 6e  ;..  /*.  ** chn
8940: 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20 73 65  gToIN holds a se
8950: 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74  t of tables that
8960: 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73 66 79   *might* satisfy
8970: 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a 20 20   case 1.  But.  
8980: 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20 64 6f  ** we have to do
8990: 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c   some additional
89a0: 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73 65 65   checking to see
89b0: 20 69 66 20 63 61 73 65 20 31 20 72 65 61 6c 6c   if case 1 reall
89c0: 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69 73 66  y.  ** is satisf
89d0: 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 63  ied..  **.  ** c
89e0: 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68 6f 6c  hngToIN will hol
89f0: 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c 20 6f  d either 0, 1, o
8a00: 72 20 32 20 62 69 74 73 2e 20 20 54 68 65 20 30  r 2 bits.  The 0
8a10: 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e 73 0a  -bit case means.
8a20: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72 65 20    ** that there 
8a30: 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c 69 74  is no possibilit
8a40: 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e  y of transformin
8a50: 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  g the OR clause 
8a60: 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49 4e 20  into an.  ** IN 
8a70: 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75 73 65  operator because
8a80: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74 65 72   one or more ter
8a90: 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61  ms in the OR cla
8aa0: 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20 2a 2a  use contain.  **
8ab0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
8ac0: 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20 63 6f   than == on a co
8ad0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69 6e 67  lumn in the sing
8ae0: 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 31  le table.  The 1
8af0: 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65 20 6d  -bit.  ** case m
8b00: 65 61 6e 73 20 74 68 61 74 20 65 76 65 72 79 20  eans that every 
8b10: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 20 63  term of the OR c
8b20: 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 20  lause is of the 
8b30: 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62 6c 65  form.  ** "table
8b40: 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20 66 6f  .column=expr" fo
8b50: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 74 61  r some single ta
8b60: 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20 62 69  ble.  The one bi
8b70: 74 20 74 68 61 74 20 69 73 20 73 65 74 0a 20 20  t that is set.  
8b80: 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73 70 6f  ** will correspo
8b90: 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e  nd to the common
8ba0: 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74 69 6c   table.  We stil
8bb0: 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20  l need to check 
8bc0: 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73 75 72  to make.  ** sur
8bd0: 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d  e the same colum
8be0: 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61 6c 6c  n is used on all
8bf0: 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32 2d 62   terms.  The 2-b
8c00: 69 74 20 63 61 73 65 20 69 73 20 77 68 65 6e 0a  it case is when.
8c10: 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74 65 72    ** the all ter
8c20: 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20 66 6f  ms are of the fo
8c30: 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c 75 6d  rm "table1.colum
8c40: 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d 6e 22  n=table2.column"
8c50: 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67 68 74  .  It.  ** might
8c60: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
8c70: 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65 72 61  form an IN opera
8c80: 74 6f 72 20 77 69 74 68 20 65 69 74 68 65 72 20  tor with either 
8c90: 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a 20 20  table1.column.  
8ca0: 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63 6f 6c  ** or table2.col
8cb0: 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53 20 69  umn as the LHS i
8cc0: 66 20 65 69 74 68 65 72 20 69 73 20 63 6f 6d 6d  f either is comm
8cd0: 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d  on to every term
8ce0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f 52 20   of.  ** the OR 
8cf0: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
8d00: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65 72 6d  * Note that term
8d10: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 74  s of the form "t
8d20: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74 61 62  able.column1=tab
8d30: 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74 68 65  le.column2" (the
8d40: 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65  .  ** same table
8d50: 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73 20 6f   on both sizes o
8d60: 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e 6f 74  f the ==) cannot
8d70: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e 0a 20   be optimized.. 
8d80: 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67 54 6f   */.  if( chngTo
8d90: 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6b  IN ){.    int ok
8da0: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 20  ToChngToIN = 0; 
8db0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
8dc0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 6f  he conversion to
8dd0: 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a   IN is valid */.
8de0: 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20      int iColumn 
8df0: 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a  = -1;         /*
8e00: 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 6e   Column index on
8e10: 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65 72 61   lhs of IN opera
8e20: 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  tor */.    int i
8e30: 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20 20 20  Cursor = -1;    
8e40: 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 63 75       /* Table cu
8e50: 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  rsor common to a
8e60: 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20  ll terms */.    
8e70: 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20 20 20  int j = 0;      
8e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
8e90: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20  p counter */..  
8ea0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
8eb0: 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  a table and colu
8ec0: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
8ed0: 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72 20 74  on one side or t
8ee0: 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  he.    ** other 
8ef0: 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72 61 74  of the == operat
8f00: 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75 62 74  or in every subt
8f10: 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62 6c 65  erm.  That table
8f20: 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20 20 20   and column.    
8f30: 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72  ** will be recor
8f40: 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72 20 61  ded in iCursor a
8f50: 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54 68 65  nd iColumn.  The
8f60: 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  re might not be 
8f70: 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63 68 20  any.    ** such 
8f80: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
8f90: 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e 67 54  .  Set okToChngT
8fa0: 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72 6f 70  oIN if an approp
8fb0: 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20 20 20  riate table.    
8fc0: 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73  ** and column is
8fd0: 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61 76 65   found but leave
8fe0: 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 66 61   okToChngToIN fa
8ff0: 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  lse if not found
9000: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
9010: 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21 6f 6b  (j=0; j<2 && !ok
9020: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b 2b 29  ToChngToIN; j++)
9030: 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72 6d 20  {.      pOrTerm 
9040: 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20 20 20  = pOrWc->a;.    
9050: 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e    for(i=pOrWc->n
9060: 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  Term-1; i>=0; i-
9070: 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20  -, pOrTerm++){. 
9080: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9090: 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  OrTerm->eOperato
90a0: 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20  r==WO_EQ );.    
90b0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
90c0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
90d0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  _OK;.        if(
90e0: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
90f0: 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29 7b  rsor==iCursor ){
9100: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
9110: 69 73 20 69 73 20 74 68 65 20 32 2d 62 69 74 20  is is the 2-bit 
9120: 63 61 73 65 20 61 6e 64 20 77 65 20 61 72 65 20  case and we are 
9130: 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74  on the second it
9140: 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20  eration and.    
9150: 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74        ** current
9160: 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20 74 68   term is from th
9170: 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f  e first iteratio
9180: 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68 69 73  n.  So skip this
9190: 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20   term. */.      
91a0: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 31      assert( j==1
91b0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   );.          co
91c0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
91d0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  }.        if( (c
91e0: 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d 61 73  hngToIN & getMas
91f0: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
9200: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
9210: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
9220: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 6d    /* This term m
9230: 75 73 74 20 62 65 20 6f 66 20 74 68 65 20 66 6f  ust be of the fo
9240: 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20 77 68  rm t1.a==t2.b wh
9250: 65 72 65 20 74 32 20 69 73 20 69 6e 20 74 68 65  ere t2 is in the
9260: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 68  .          ** ch
9270: 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74 20 74  ngToIN set but t
9280: 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69 73 20  1 is not.  This 
9290: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65 69 74  term will be eit
92a0: 68 65 72 20 70 72 65 63 65 65 64 65 64 0a 20 20  her preceeded.  
92b0: 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 66 6f          ** or fo
92c0: 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e 76 65  llwed by an inve
92d0: 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e 62 3d  rted copy (t2.b=
92e0: 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20 74 68  =t1.a).  Skip th
92f0: 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20 20 20  is term .       
9300: 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20 69 74     ** and use it
9310: 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a 2f 0a  s inversion. */.
9320: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
9330: 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46  se( pOrTerm->wtF
9340: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49  lags & TERM_COPI
9350: 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ED );.          
9360: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
9370: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
9380: 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20 20  M_VIRTUAL );.   
9390: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
93a0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
93b0: 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44 7c 54  & (TERM_COPIED|T
93c0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29 3b 0a  ERM_VIRTUAL) );.
93d0: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
93e0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
93f0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
9400: 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  pOrTerm->u.leftC
9410: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20 69  olumn;.        i
9420: 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65 72 6d  Cursor = pOrTerm
9430: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ->leftCursor;.  
9440: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9450: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
9460: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  <0 ){.        /*
9470: 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20 74 61   No candidate ta
9480: 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73 20 66  ble+column was f
9490: 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61 6e 20  ound.  This can 
94a0: 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20 20 20  only occur.     
94b0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 65 63     ** on the sec
94c0: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2a 2f  ond iteration */
94d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
94e0: 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   j==1 );.       
94f0: 20 61 73 73 65 72 74 28 20 28 63 68 6e 67 54 6f   assert( (chngTo
9500: 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31 29 29  IN&(chngToIN-1))
9510: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==0 );.        a
9520: 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49 4e 3d  ssert( chngToIN=
9530: 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65  =getMask(pMaskSe
9540: 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  t, iCursor) );. 
9550: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9560: 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65 73 74      }.      test
9570: 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a 0a 20  case( j==1 );.. 
9580: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
9590: 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64 61 74  found a candidat
95a0: 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  e table and colu
95b0: 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65  mn.  Check to se
95c0: 65 20 69 66 20 74 68 61 74 0a 20 20 20 20 20 20  e if that.      
95d0: 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  ** table and col
95e0: 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  umn is common to
95f0: 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
9600: 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a 2f 0a  he OR clause */.
9610: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
9620: 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f  IN = 1;.      fo
9630: 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 54 6f  r(; i>=0 && okTo
9640: 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c 20 70  ChngToIN; i--, p
9650: 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  OrTerm++){.     
9660: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9670: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
9680: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
9690: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
96a0: 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73 6f 72  tCursor!=iCursor
96b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
96c0: 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  rTerm->wtFlags &
96d0: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
96e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
96f0: 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   pOrTerm->u.left
9700: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
9710: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 54  ){.          okT
9720: 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20  oChngToIN = 0;. 
9730: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
9740: 20 20 20 20 20 20 20 20 69 6e 74 20 61 66 66 4c          int affL
9750: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
9760: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
9770: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
9780: 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c  de is also a col
9790: 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66  umn, then the af
97a0: 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20 20 20  finities.       
97b0: 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20 72 69     ** of both ri
97c0: 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73 69 64  ght and left sid
97d0: 65 73 20 6d 75 73 74 20 62 65 20 73 75 63 68 20  es must be such 
97e0: 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20 20 20  that no type.   
97f0: 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76 65 72         ** conver
9800: 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75 69 72  sions are requir
9810: 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2e  ed on the right.
9820: 20 20 28 54 69 63 6b 65 74 20 23 32 32 34 39 29    (Ticket #2249)
9830: 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
9840: 20 20 20 20 20 20 20 20 61 66 66 52 69 67 68 74          affRight
9850: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
9860: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
9870: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9880: 20 20 20 20 20 20 20 20 20 20 61 66 66 4c 65 66            affLef
9890: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  t = sqlite3ExprA
98a0: 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d  ffinity(pOrTerm-
98b0: 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  >pExpr->pLeft);.
98c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 66            if( af
98d0: 66 52 69 67 68 74 21 3d 30 20 26 26 20 61 66 66  fRight!=0 && aff
98e0: 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74 20 29  Right!=affLeft )
98f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 6b  {.            ok
9900: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a  ToChngToIN = 0;.
9910: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
9920: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 72  .            pOr
9930: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
9940: 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20   TERM_OR_OK;.   
9950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9960: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9970: 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73  ..    /* At this
9980: 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68 6e 67   point, okToChng
9990: 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69 66 20  ToIN is true if 
99a0: 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d 20 73  original pTerm s
99b0: 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a 2a 20  atisfies.    ** 
99c0: 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68 61 74  case 1.  In that
99d0: 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75 63 74   case, construct
99e0: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
99f0: 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20 20 20  erm that is .   
9a00: 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76 65 72   ** pTerm conver
9a10: 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  ted into an IN o
9a20: 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a 2a 0a  perator..    **.
9a30: 20 20 20 20 2a 2a 20 45 56 3a 20 52 2d 30 30 32      ** EV: R-002
9a40: 31 31 2d 31 35 31 30 30 0a 20 20 20 20 2a 2f 0a  11-15100.    */.
9a50: 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68 6e 67      if( okToChng
9a60: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20 45 78  ToIN ){.      Ex
9a70: 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20  pr *pDup;       
9a80: 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e 73 69       /* A transi
9a90: 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20 65 78  ent duplicate ex
9aa0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
9ab0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
9ac0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68 65 20  t = 0;   /* The 
9ad0: 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  RHS of the IN op
9ae0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
9af0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b  Expr *pLeft = 0;
9b00: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4c 48         /* The LH
9b10: 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  S of the IN oper
9b20: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  ator */.      Ex
9b30: 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20  pr *pNew;       
9b40: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70       /* The comp
9b50: 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74 6f 72  lete IN operator
9b60: 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   */..      for(i
9b70: 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c  =pOrWc->nTerm-1,
9b80: 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63 2d 3e   pOrTerm=pOrWc->
9b90: 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f  a; i>=0; i--, pO
9ba0: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
9bb0: 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e    if( (pOrTerm->
9bc0: 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
9bd0: 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e 74 69  R_OK)==0 ) conti
9be0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73  nue;.        ass
9bf0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
9c00: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
9c10: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9c20: 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  ( pOrTerm->leftC
9c30: 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20 29  ursor==iCursor )
9c40: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
9c50: 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  ( pOrTerm->u.lef
9c60: 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e  tColumn==iColumn
9c70: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70   );.        pDup
9c80: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
9c90: 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70  p(db, pOrTerm->p
9ca0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29  Expr->pRight, 0)
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
9cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
9cd0: 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70 50 61  tAppend(pWC->pPa
9ce0: 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 75 70  rse, pList, pDup
9cf0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 66 74  );.        pLeft
9d00: 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70   = pOrTerm->pExp
9d10: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
9d20: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
9d30: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
9d40: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9d50: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66  ExprDup(db, pLef
9d60: 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4e 65  t, 0);.      pNe
9d70: 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72  w = sqlite3PExpr
9d80: 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e 2c 20  (pParse, TK_IN, 
9d90: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
9da0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
9db0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
9dc0: 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73  w;.        trans
9dd0: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
9de0: 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
9df0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
9e00: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9e10: 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  New, EP_xIsSelec
9e20: 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  t) );.        pN
9e30: 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20 70 4c  ew->x.pList = pL
9e40: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
9e50: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
9e60: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
9e70: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
9e80: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
9e90: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
9ea0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
9eb0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
9ec0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
9ed0: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70 54  New);.        pT
9ee0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64  erm = &pWC->a[id
9ef0: 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20  xTerm];.        
9f00: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e 69  pWC->a[idxNew].i
9f10: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
9f20: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
9f30: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
9f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9f50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
9f60: 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c 69 73  tDelete(db, pLis
9f70: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9f80: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
9f90: 6f 72 20 3d 20 57 4f 5f 4e 4f 4f 50 3b 20 20 2f  or = WO_NOOP;  /
9fa0: 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70 73 20  * case 1 trumps 
9fb0: 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20 7d 0a  case 2 */.    }.
9fc0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
9fd0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  !SQLITE_OMIT_OR_
9fe0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26 26 20  OPTIMIZATION && 
9ff0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  !SQLITE_OMIT_SUB
a000: 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  QUERY */.../*.**
a010: 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68   The input to th
a020: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e  is routine is an
a030: 20 57 68 65 72 65 54 65 72 6d 20 73 74 72 75 63   WhereTerm struc
a040: 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74  ture with only t
a050: 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20 66 69  he.** "pExpr" fi
a060: 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20  eld filled in.  
a070: 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  The job of this 
a080: 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e  routine is to an
a090: 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62  alyze the.** sub
a0a0: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70  expression and p
a0b0: 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20  opulate all the 
a0c0: 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20  other fields of 
a0d0: 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a  the WhereTerm.**
a0e0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a   structure..**.*
a0f0: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
a100: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
a110: 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70 3e 20  rm "<expr> <op> 
a120: 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d 6d 75  X" it gets commu
a130: 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74  ted.** to the st
a140: 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66 20 22  andard form of "
a150: 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 2e 0a  X <op> <expr>"..
a160: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
a170: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
a180: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 59  e form "X <op> Y
a190: 22 20 77 68 65 72 65 20 62 6f 74 68 20 58 20 61  " where both X a
a1a0: 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f 6c 75  nd Y are.** colu
a1b0: 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72  mns, then the or
a1c0: 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73 69 6f  iginal expressio
a1d0: 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  n is unchanged a
a1e0: 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  nd a new virtual
a1f0: 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68 65 20  .** term of the 
a200: 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58 22 20  form "Y <op> X" 
a210: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
a220: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64  WHERE clause and
a230: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73 65 70  .** analyzed sep
a240: 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20 6f 72  arately.  The or
a250: 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73 20 6d  iginal term is m
a260: 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f  arked with TERM_
a270: 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20 74 68  COPIED.** and th
a280: 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20 6d 61  e new term is ma
a290: 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d 5f 44  rked with TERM_D
a2a0: 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73 65 20  YNAMIC (because 
a2b0: 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20 6e 65  it's pExpr.** ne
a2c0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
a2d0: 77 69 74 68 20 74 68 65 20 57 68 65 72 65 43 6c  with the WhereCl
a2e0: 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d 5f 56  ause) and TERM_V
a2f0: 49 52 54 55 41 4c 20 28 62 65 63 61 75 73 65 20  IRTUAL (because 
a300: 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d 6d 75  it.** is a commu
a310: 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20 70 72  ted copy of a pr
a320: 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68 65 20  ior term.)  The 
a330: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 68 61  original term ha
a340: 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e  s nChild=1.** an
a350: 64 20 74 68 65 20 63 6f 70 79 20 68 61 73 20 69  d the copy has i
a360: 64 78 50 61 72 65 6e 74 20 73 65 74 20 74 6f 20  dxParent set to 
a370: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
a380: 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 2e 0a   original term..
a390: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
a3a0: 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72  xprAnalyze(.  Sr
a3b0: 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20  cList *pSrc,    
a3c0: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46          /* the F
a3d0: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
a3e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
a3f0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65  ,         /* the
a400: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
a410: 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20  .  int idxTerm  
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a430: 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65 72  Index of the ter
a440: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
a450: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
a460: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
a470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
a480: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
a490: 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d  yzed */.  WhereM
a4a0: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
a4b0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ;          /* Se
a4c0: 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 65 78  t of table index
a4d0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78 70 72   masks */.  Expr
a4e0: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 20   *pExpr;        
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a500: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
a510: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f  o be analyzed */
a520: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
a530: 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20 20 20  qLeft;          
a540: 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65 73      /* Prereques
a550: 69 74 65 73 20 6f 66 20 74 68 65 20 70 45 78 70  ites of the pExp
a560: 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  r->pLeft */.  Bi
a570: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
a580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a590: 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73 20  * Prerequesites 
a5a0: 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20 42 69  of pExpr */.  Bi
a5b0: 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67 68 74  tmask extraRight
a5c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
a5d0: 2a 20 45 78 74 72 61 20 64 65 70 65 6e 64 65 6e  * Extra dependen
a5e0: 63 69 65 73 20 6f 6e 20 4c 45 46 54 20 4a 4f 49  cies on LEFT JOI
a5f0: 4e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 53 74  N */.  Expr *pSt
a600: 72 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  r1 = 0;         
a610: 20 20 20 20 20 20 20 20 2f 2a 20 52 48 53 20 6f          /* RHS o
a620: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
a630: 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73  ator */.  int is
a640: 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b 20 20 20  Complete = 0;   
a650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 48             /* RH
a660: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 65  S of LIKE/GLOB e
a670: 6e 64 73 20 77 69 74 68 20 77 69 6c 64 63 61 72  nds with wildcar
a680: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 61 73  d */.  int noCas
a690: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
a6a0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 49 4b 45 2f          /* LIKE/
a6b0: 47 4c 4f 42 20 64 69 73 74 69 6e 67 75 69 73 68  GLOB distinguish
a6c0: 65 73 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74  es case */.  int
a6d0: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6f0: 20 54 6f 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61   Top-level opera
a700: 74 6f 72 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20  tor.  pExpr->op 
a710: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
a720: 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
a730: 3b 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ;     /* Parsing
a740: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
a750: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
a760: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 2f  se->db;        /
a770: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a780: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
a790: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a7a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
a7b0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
a7c0: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
a7d0: 20 20 70 4d 61 73 6b 53 65 74 20 3d 20 70 57 43    pMaskSet = pWC
a7e0: 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45  ->pMaskSet;.  pE
a7f0: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
a800: 70 72 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74  pr;.  prereqLeft
a810: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
a820: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a830: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20  r->pLeft);.  op 
a840: 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69  = pExpr->op;.  i
a850: 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a  f( op==TK_IN ){.
a860: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
a870: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
a880: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
a890: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
a8a0: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a  P_xIsSelect) ){.
a8b0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65        pTerm->pre
a8c0: 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72 53  reqRight = exprS
a8d0: 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28  electTableUsage(
a8e0: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
a8f0: 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
a900: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 54   }else{.      pT
a910: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a920: 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65   = exprListTable
a930: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a940: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b  pExpr->x.pList);
a950: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
a960: 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  f( op==TK_ISNULL
a970: 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70   ){.    pTerm->p
a980: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
a990: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 65    }else{.    pTe
a9a0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a9b0: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
a9c0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
a9d0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20  ->pRight);.  }. 
a9e0: 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78 70   prereqAll = exp
a9f0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
aa00: 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20 20  kSet, pExpr);.  
aa10: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
aa20: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72  rty(pExpr, EP_Fr
aa30: 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42  omJoin) ){.    B
aa40: 69 74 6d 61 73 6b 20 78 20 3d 20 67 65 74 4d 61  itmask x = getMa
aa50: 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  sk(pMaskSet, pEx
aa60: 70 72 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  pr->iRightJoinTa
aa70: 62 6c 65 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ble);.    prereq
aa80: 41 6c 6c 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78  All |= x;.    ex
aa90: 74 72 61 52 69 67 68 74 20 3d 20 78 2d 31 3b 20  traRight = x-1; 
aaa0: 20 2f 2a 20 4f 4e 20 63 6c 61 75 73 65 20 74 65   /* ON clause te
aab0: 72 6d 73 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  rms may not be u
aac0: 73 65 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65  sed with an inde
aad0: 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x.              
aae0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c           ** on l
aaf0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  eft table of a L
ab00: 45 46 54 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65  EFT JOIN.  Ticke
ab10: 74 20 23 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20  t #3015 */.  }. 
ab20: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
ab30: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
ab40: 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73   pTerm->leftCurs
ab50: 6f 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  or = -1;.  pTerm
ab60: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
ab70: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
ab80: 6f 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c  or = 0;.  if( al
ab90: 6c 6f 77 65 64 4f 70 28 6f 70 29 20 26 26 20 28  lowedOp(op) && (
aba0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
abb0: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
abc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
abd0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
abe0: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
abf0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
ac00: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
ac10: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
ac20: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
ac30: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ac40: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ac50: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 75  ;.      pTerm->u
ac60: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
ac70: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
ac80: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
ac90: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
aca0: 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  ask(op);.    }. 
acb0: 20 20 20 69 66 28 20 70 52 69 67 68 74 20 26 26     if( pRight &&
acc0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
acd0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20  COLUMN ){.      
ace0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b  WhereTerm *pNew;
acf0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75  .      Expr *pDu
ad00: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  p;.      if( pTe
ad10: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d  rm->leftCursor>=
ad20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
ad30: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
ad40: 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45   pDup = sqlite3E
ad50: 78 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72  xprDup(db, pExpr
ad60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
ad70: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
ad80: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
ad90: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
ada0: 65 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20  e(db, pDup);.   
adb0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
adc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
add0: 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43   idxNew = whereC
ade0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
adf0: 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52 54   pDup, TERM_VIRT
ae00: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
ae10: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
ae20: 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72  dxNew==0 ) retur
ae30: 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  n;.        pNew 
ae40: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77  = &pWC->a[idxNew
ae50: 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ];.        pNew-
ae60: 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  >iParent = idxTe
ae70: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
ae80: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
ae90: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  erm];.        pT
aea0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b  erm->nChild = 1;
aeb0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
aec0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
aed0: 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65  COPIED;.      }e
aee0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75  lse{.        pDu
aef0: 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  p = pExpr;.     
af00: 20 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b     pNew = pTerm;
af10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
af20: 78 70 72 43 6f 6d 6d 75 74 65 28 70 50 61 72 73  xprCommute(pPars
af30: 65 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  e, pDup);.      
af40: 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c  pLeft = pDup->pL
af50: 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  eft;.      pNew-
af60: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c  >leftCursor = pL
af70: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
af80: 20 20 20 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43     pNew->u.leftC
af90: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
afa0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 74 65  Column;.      te
afb0: 73 74 63 61 73 65 28 20 28 70 72 65 72 65 71 4c  stcase( (prereqL
afc0: 65 66 74 20 7c 20 65 78 74 72 61 52 69 67 68 74  eft | extraRight
afd0: 29 20 21 3d 20 70 72 65 72 65 71 4c 65 66 74 20  ) != prereqLeft 
afe0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  );.      pNew->p
aff0: 72 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65  rereqRight = pre
b000: 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72 61 52  reqLeft | extraR
b010: 69 67 68 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  ight;.      pNew
b020: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72  ->prereqAll = pr
b030: 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70  ereqAll;.      p
b040: 4e 65 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d  New->eOperator =
b050: 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44   operatorMask(pD
b060: 75 70 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  up->op);.    }. 
b070: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
b080: 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f  TE_OMIT_BETWEEN_
b090: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f  OPTIMIZATION.  /
b0a0: 2a 20 49 66 20 61 20 74 65 72 6d 20 69 73 20 74  * If a term is t
b0b0: 68 65 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61  he BETWEEN opera
b0c0: 74 6f 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20  tor, create two 
b0d0: 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d  new virtual term
b0e0: 73 0a 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69  s.  ** that defi
b0f0: 6e 65 20 74 68 65 20 72 61 6e 67 65 20 74 68 61  ne the range tha
b100: 74 20 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d  t the BETWEEN im
b110: 70 6c 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65  plements.  For e
b120: 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a  xample:.  **.  *
b130: 2a 20 20 20 20 20 20 61 20 42 45 54 57 45 45 4e  *      a BETWEEN
b140: 20 62 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20   b AND c.  **.  
b150: 2a 2a 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20  ** is converted 
b160: 69 6e 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  into:.  **.  ** 
b170: 20 20 20 20 20 28 61 20 42 45 54 57 45 45 4e 20       (a BETWEEN 
b180: 62 20 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e  b AND c) AND (a>
b190: 3d 62 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20  =b) AND (a<=c). 
b1a0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f   **.  ** The two
b1b0: 20 6e 65 77 20 74 65 72 6d 73 20 61 72 65 20 61   new terms are a
b1c0: 64 64 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e  dded onto the en
b1d0: 64 20 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c  d of the WhereCl
b1e0: 61 75 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a  ause object..  *
b1f0: 2a 20 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20  * The new terms 
b200: 61 72 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e  are "dynamic" an
b210: 64 20 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f  d are children o
b220: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42  f the original B
b230: 45 54 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d  ETWEEN.  ** term
b240: 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68  .  That means th
b250: 61 74 20 69 66 20 74 68 65 20 42 45 54 57 45 45  at if the BETWEE
b260: 4e 20 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c  N term is coded,
b270: 20 74 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72   the children ar
b280: 65 0a 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20  e.  ** skipped. 
b290: 20 4f 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c   Or, if the chil
b2a0: 64 72 65 6e 20 61 72 65 20 73 61 74 69 73 66 69  dren are satisfi
b2b0: 65 64 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20  ed by an index, 
b2c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a  the original.  *
b2d0: 2a 20 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69  * BETWEEN term i
b2e0: 73 20 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a  s skipped..  */.
b2f0: 20 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72    else if( pExpr
b300: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
b310: 20 26 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f   && pWC->op==TK_
b320: 41 4e 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c  AND ){.    ExprL
b330: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b340: 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
b350: 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74   int i;.    stat
b360: 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b  ic const u8 ops[
b370: 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c  ] = {TK_GE, TK_L
b380: 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  E};.    assert( 
b390: 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  pList!=0 );.    
b3a0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
b3b0: 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66  Expr==2 );.    f
b3c0: 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
b3d0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
b3e0: 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69  NewExpr;.      i
b3f0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
b400: 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69   pNewExpr = sqli
b410: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
b420: 20 6f 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20   ops[i], .      
b430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b440: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b450: 70 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d  prDup(db, pExpr-
b460: 3e 70 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20  >pLeft, 0),.    
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b490: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73  ExprDup(db, pLis
b4a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30  t->a[i].pExpr, 0
b4b0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
b4c0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
b4d0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b4e0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
b4f0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
b500: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
b510: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
b520: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
b530: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
b540: 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72  New);.      pTer
b550: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
b560: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d  erm];.      pWC-
b570: 3e 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65  >a[idxNew].iPare
b580: 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20  nt = idxTerm;.  
b590: 20 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e    }.    pTerm->n
b5a0: 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23  Child = 2;.  }.#
b5b0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b5c0: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
b5d0: 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  IMIZATION */..#i
b5e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
b5f0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
b600: 5a 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69  ZATION) && !defi
b610: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
b620: 53 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41  SUBQUERY).  /* A
b630: 6e 61 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68  nalyze a term th
b640: 61 74 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f  at is composed o
b650: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75  f two or more su
b660: 62 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64  bterms connected
b670: 20 62 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f   by.  ** an OR o
b680: 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
b690: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
b6a0: 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20  op==TK_OR ){.   
b6b0: 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70   assert( pWC->op
b6c0: 3d 3d 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20  ==TK_AND );.    
b6d0: 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72  exprAnalyzeOrTer
b6e0: 6d 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  m(pSrc, pWC, idx
b6f0: 54 65 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d  Term);.    pTerm
b700: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
b710: 72 6d 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  rm];.  }.#endif 
b720: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  /* SQLITE_OMIT_O
b730: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  R_OPTIMIZATION *
b740: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
b750: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
b760: 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64  MIZATION.  /* Ad
b770: 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  d constraints to
b780: 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61 72   reduce the sear
b790: 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49  ch space on a LI
b7a0: 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20  KE or GLOB.  ** 
b7b0: 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20  operator..  **. 
b7c0: 20 2a 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65   ** A like patte
b7d0: 72 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  rn of the form "
b7e0: 78 20 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69  x LIKE 'abc%'" i
b7f0: 73 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63  s changed into c
b800: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a  onstraints.  **.
b810: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e    **          x>
b820: 3d 27 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62  ='abc' AND x<'ab
b830: 64 27 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61  d' AND x LIKE 'a
b840: 62 63 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  bc%'.  **.  ** T
b850: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
b860: 72 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20  r of the prefix 
b870: 22 61 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65  "abc" is increme
b880: 6e 74 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65  nted to form the
b890: 0a 20 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f  .  ** terminatio
b8a0: 6e 20 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64  n condition "abd
b8b0: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  "..  */.  if( pW
b8c0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20  C->op==TK_AND . 
b8d0: 20 20 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f    && isLikeOrGlo
b8e0: 62 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  b(pParse, pExpr,
b8f0: 20 26 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70   &pStr1, &isComp
b900: 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20  lete, &noCase). 
b910: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
b920: 65 66 74 3b 20 20 20 20 20 20 20 2f 2a 20 4c 48  eft;       /* LH
b930: 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f  S of LIKE/GLOB o
b940: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45  perator */.    E
b950: 78 70 72 20 2a 70 53 74 72 32 3b 20 20 20 20 20  xpr *pStr2;     
b960: 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 53 74    /* Copy of pSt
b970: 72 31 20 2d 20 52 48 53 20 6f 66 20 4c 49 4b 45  r1 - RHS of LIKE
b980: 2f 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a  /GLOB operator *
b990: 2f 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  /.    Expr *pNew
b9a0: 45 78 70 72 31 3b 0a 20 20 20 20 45 78 70 72 20  Expr1;.    Expr 
b9b0: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
b9c0: 69 6e 74 20 69 64 78 4e 65 77 31 3b 0a 20 20 20  int idxNew1;.   
b9d0: 20 69 6e 74 20 69 64 78 4e 65 77 32 3b 0a 20 20   int idxNew2;.  
b9e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
b9f0: 3b 20 20 20 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e  ;    /* Collatin
ba00: 67 20 73 65 71 75 65 6e 63 65 20 74 6f 20 75 73  g sequence to us
ba10: 65 20 2a 2f 0a 0a 20 20 20 20 70 4c 65 66 74 20  e */..    pLeft 
ba20: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
ba30: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
ba40: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
ba50: 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53 74  3ExprDup(db, pSt
ba60: 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  r1, 0);.    if( 
ba70: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
ba80: 64 20 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c  d ){.      u8 c,
ba90: 20 2a 70 43 3b 20 20 20 20 20 20 20 2f 2a 20 4c   *pC;       /* L
baa0: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
bab0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 77  fore the first w
bac0: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 20 20 20  ildcard */.     
bad0: 20 70 43 20 3d 20 28 75 38 2a 29 26 70 53 74 72   pC = (u8*)&pStr
bae0: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 73 71 6c 69  2->u.zToken[sqli
baf0: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 53 74 72  te3Strlen30(pStr
bb00: 32 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2d 31 5d 3b  2->u.zToken)-1];
bb10: 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43 3b 0a  .      c = *pC;.
bb20: 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61 73 65        if( noCase
bb30: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
bb40: 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 69  he point is to i
bb50: 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c 61 73  ncrement the las
bb60: 74 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  t character befo
bb70: 72 65 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  re the first.   
bb80: 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61 72 64       ** wildcard
bb90: 2e 20 20 42 75 74 20 69 66 20 77 65 20 69 6e 63  .  But if we inc
bba0: 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68 61 74  rement '@', that
bbb0: 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20 69 6e   will push it in
bbc0: 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  to the.        *
bbd0: 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72 61 6e  * alphabetic ran
bbe0: 67 65 20 77 68 65 72 65 20 63 61 73 65 20 63 6f  ge where case co
bbf0: 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c 20 6d  nversions will m
bc00: 65 73 73 20 75 70 20 74 68 65 20 0a 20 20 20 20  ess up the .    
bc10: 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c 69 74      ** inequalit
bc20: 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74 68 69  y.  To avoid thi
bc30: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 6f 20  s, make sure to 
bc40: 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66 75 6c  also run the ful
bc50: 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c 49 4b  l.        ** LIK
bc60: 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69 64 61  E on all candida
bc70: 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  te expressions b
bc80: 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65 20 69  y clearing the i
bc90: 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67 0a 20  sComplete flag. 
bca0: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
bcb0: 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31 20 29    if( c=='A'-1 )
bcc0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 30 3b   isComplete = 0;
bcd0: 20 20 20 2f 2a 20 45 56 3a 20 52 2d 36 34 33 33     /* EV: R-6433
bce0: 39 2d 30 38 32 30 37 20 2a 2f 0a 0a 0a 20 20 20  9-08207 */...   
bcf0: 20 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33       c = sqlite3
bd00: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
bd10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
bd20: 70 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20  pC = c + 1;.    
bd30: 7d 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  }.    pColl = sq
bd40: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
bd50: 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  (db, SQLITE_UTF8
bd60: 2c 20 6e 6f 43 61 73 65 20 3f 20 22 4e 4f 43 41  , noCase ? "NOCA
bd70: 53 45 22 20 3a 20 22 42 49 4e 41 52 59 22 2c 30  SE" : "BINARY",0
bd80: 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31  );.    pNewExpr1
bd90: 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28   = sqlite3PExpr(
bda0: 70 50 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 0a  pParse, TK_GE, .
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bdd0: 53 65 74 43 6f 6c 6c 28 73 71 6c 69 74 65 33 45  SetColl(sqlite3E
bde0: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 2c  xprDup(db,pLeft,
bdf0: 30 29 2c 20 70 43 6f 6c 6c 29 2c 0a 20 20 20 20  0), pColl),.    
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be10: 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20   pStr1, 0);.    
be20: 69 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43  idxNew1 = whereC
be30: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
be40: 20 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d   pNewExpr1, TERM
be50: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
be60: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74  NAMIC);.    test
be70: 63 61 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30  case( idxNew1==0
be80: 20 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c   );.    exprAnal
be90: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
bea0: 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65  dxNew1);.    pNe
beb0: 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33  wExpr2 = sqlite3
bec0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bed0: 5f 4c 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _LT,.           
bee0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bef0: 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71 6c  3ExprSetColl(sql
bf00: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
bf10: 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29 2c  Left,0), pColl),
bf20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf30: 20 20 20 20 20 20 70 53 74 72 32 2c 20 30 29 3b        pStr2, 0);
bf40: 0a 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77  .    idxNew2 = w
bf50: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
bf60: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c  (pWC, pNewExpr2,
bf70: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45   TERM_VIRTUAL|TE
bf80: 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20  RM_DYNAMIC);.   
bf90: 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65   testcase( idxNe
bfa0: 77 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70  w2==0 );.    exp
bfb0: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
bfc0: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
bfd0: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
bfe0: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
bff0: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
c000: 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
c010: 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
c020: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
c030: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
c040: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
c050: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
c060: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
c070: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
c080: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
c090: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
c0a0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
c0b0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
c0c0: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
c0d0: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
c0e0: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
c0f0: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
c100: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
c110: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
c120: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
c130: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
c140: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
c150: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
c160: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
c170: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
c180: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
c190: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
c1a0: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
c1b0: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
c1c0: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
c1d0: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
c1e0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
c1f0: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
c200: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
c210: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
c220: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
c230: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
c240: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
c250: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
c260: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
c270: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
c280: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
c290: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c2a0: 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72     pLeft = pExpr
c2b0: 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
c2c0: 70 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65  pExpr;.    prere
c2d0: 71 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c  qExpr = exprTabl
c2e0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
c2f0: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72   pRight);.    pr
c300: 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70  ereqColumn = exp
c310: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
c320: 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20  kSet, pLeft);.  
c330: 20 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70    if( (prereqExp
c340: 72 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e  r & prereqColumn
c350: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78  )==0 ){.      Ex
c360: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
c370: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
c380: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
c390: 73 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20  se, TK_MATCH, . 
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
c3c0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
c3d0: 62 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30  b, pRight, 0), 0
c3e0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
c3f0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
c400: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
c410: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
c420: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
c430: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
c440: 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20  dxNew==0 );.    
c450: 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57    pNewTerm = &pW
c460: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
c470: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
c480: 65 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72  ereqRight = prer
c490: 65 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e  eqExpr;.      pN
c4a0: 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  ewTerm->leftCurs
c4b0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
c4c0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  le;.      pNewTe
c4d0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
c4e0: 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d   = pLeft->iColum
c4f0: 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  n;.      pNewTer
c500: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57  m->eOperator = W
c510: 4f 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70  O_MATCH;.      p
c520: 4e 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  NewTerm->iParent
c530: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
c540: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
c550: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
c560: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
c570: 3d 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  = 1;.      pTerm
c580: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
c590: 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20  M_COPIED;.      
c5a0: 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71  pNewTerm->prereq
c5b0: 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65  All = pTerm->pre
c5c0: 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20  reqAll;.    }.  
c5d0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c5e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
c5f0: 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ABLE */..#ifdef 
c600: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
c610: 41 54 32 0a 20 20 2f 2a 20 57 68 65 6e 20 73 71  AT2.  /* When sq
c620: 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74 6f  lite_stat2 histo
c630: 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
c640: 69 6c 61 62 6c 65 20 61 6e 20 6f 70 65 72 61 74  ilable an operat
c650: 6f 72 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66  or of the.  ** f
c660: 6f 72 6d 20 22 78 20 49 53 20 4e 4f 54 20 4e 55  orm "x IS NOT NU
c670: 4c 4c 22 20 63 61 6e 20 73 6f 6d 65 74 69 6d 65  LL" can sometime
c680: 73 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 6d  s be evaluated m
c690: 6f 72 65 20 65 66 66 69 63 69 65 6e 74 6c 79 0a  ore efficiently.
c6a0: 20 20 2a 2a 20 61 73 20 22 78 3e 4e 55 4c 4c 22    ** as "x>NULL"
c6b0: 20 69 66 20 78 20 69 73 20 6e 6f 74 20 61 6e 20   if x is not an 
c6c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
c6d0: 4b 45 59 2e 20 20 53 6f 20 63 6f 6e 73 74 72 75  KEY.  So constru
c6e0: 63 74 20 61 0a 20 20 2a 2a 20 76 69 72 74 75 61  ct a.  ** virtua
c6f0: 6c 20 74 65 72 6d 20 6f 66 20 74 68 61 74 20 66  l term of that f
c700: 6f 72 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  orm..  **.  ** N
c710: 6f 74 65 20 74 68 61 74 20 74 68 65 20 76 69 72  ote that the vir
c720: 74 75 61 6c 20 74 65 72 6d 20 6d 75 73 74 20 62  tual term must b
c730: 65 20 74 61 67 67 65 64 20 77 69 74 68 20 54 45  e tagged with TE
c740: 52 4d 5f 56 4e 55 4c 4c 2e 20 20 54 68 69 73 0a  RM_VNULL.  This.
c750: 20 20 2a 2a 20 54 45 52 4d 5f 56 4e 55 4c 4c 20    ** TERM_VNULL 
c760: 74 61 67 20 77 69 6c 6c 20 73 75 70 70 72 65 73  tag will suppres
c770: 73 20 74 68 65 20 6e 6f 74 2d 6e 75 6c 6c 20 63  s the not-null c
c780: 68 65 63 6b 20 61 74 20 74 68 65 20 62 65 67 69  heck at the begi
c790: 6e 6e 69 6e 67 0a 20 20 2a 2a 20 6f 66 20 74 68  nning.  ** of th
c7a0: 65 20 6c 6f 6f 70 2e 20 20 57 69 74 68 6f 75 74  e loop.  Without
c7b0: 20 74 68 65 20 54 45 52 4d 5f 56 4e 55 4c 4c 20   the TERM_VNULL 
c7c0: 66 6c 61 67 2c 20 74 68 65 20 6e 6f 74 2d 6e 75  flag, the not-nu
c7d0: 6c 6c 20 63 68 65 63 6b 20 61 74 0a 20 20 2a 2a  ll check at.  **
c7e0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
c7f0: 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 70 72 65 76  e loop will prev
c800: 65 6e 74 20 61 6e 79 20 72 65 73 75 6c 74 73 20  ent any results 
c810: 66 72 6f 6d 20 62 65 69 6e 67 20 72 65 74 75 72  from being retur
c820: 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ned..  */.  if( 
c830: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 4f  pExpr->op==TK_NO
c840: 54 4e 55 4c 4c 0a 20 20 20 26 26 20 70 45 78 70  TNULL.   && pExp
c850: 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  r->pLeft->op==TK
c860: 5f 43 4f 4c 55 4d 4e 0a 20 20 20 26 26 20 70 45  _COLUMN.   && pE
c870: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c  xpr->pLeft->iCol
c880: 75 6d 6e 3e 3d 30 0a 20 20 29 7b 0a 20 20 20 20  umn>=0.  ){.    
c890: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
c8a0: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c8b0: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c8c0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
c8d0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
c8e0: 4e 65 77 54 65 72 6d 3b 0a 0a 20 20 20 20 70 4e  NewTerm;..    pN
c8f0: 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33  ewExpr = sqlite3
c900: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
c910: 5f 47 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  _GT,.           
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
c940: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 2c 0a 20  db, pLeft, 0),. 
c950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c960: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
c970: 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20  e3PExpr(pParse, 
c980: 54 4b 5f 4e 55 4c 4c 2c 20 30 2c 20 30 2c 20 30  TK_NULL, 0, 0, 0
c990: 29 2c 20 30 29 3b 0a 0a 20 20 20 20 69 64 78 4e  ), 0);..    idxN
c9a0: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
c9b0: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
c9c0: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 54 45 52 4d 5f 56 49 52 54 55 41 4c      TERM_VIRTUAL
c9f0: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54 45  |TERM_DYNAMIC|TE
ca00: 52 4d 5f 56 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  RM_VNULL);.    i
ca10: 66 28 20 69 64 78 4e 65 77 20 29 7b 0a 20 20 20  f( idxNew ){.   
ca20: 20 20 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70     pNewTerm = &p
ca30: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
ca40: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
ca50: 72 65 72 65 71 52 69 67 68 74 20 3d 20 30 3b 0a  rereqRight = 0;.
ca60: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
ca70: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
ca80: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
ca90: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65    pNewTerm->u.le
caa0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
cab0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
cac0: 20 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72   pNewTerm->eOper
cad0: 61 74 6f 72 20 3d 20 57 4f 5f 47 54 3b 0a 20 20  ator = WO_GT;.  
cae0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
caf0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
cb00: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
cb10: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
cb20: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
cb30: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
cb40: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
cb50: 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20  = TERM_COPIED;. 
cb60: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70       pNewTerm->p
cb70: 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d  rereqAll = pTerm
cb80: 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20  ->prereqAll;.   
cb90: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
cba0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
cbb0: 54 41 54 32 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72  TAT2 */..  /* Pr
cbc0: 65 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20  event ON clause 
cbd0: 74 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20  terms of a LEFT 
cbe0: 4a 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20  JOIN from being 
cbf0: 75 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20  used to drive.  
cc00: 2a 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20  ** an index for 
cc10: 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
cc20: 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  ft of the join..
cc30: 20 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72    */.  pTerm->pr
cc40: 65 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74  ereqRight |= ext
cc50: 72 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  raRight;.}../*.*
cc60: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
cc70: 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72   any of the expr
cc80: 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74  essions in pList
cc90: 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63  ->a[iFirst...] c
cca0: 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65  ontain.** a refe
ccb0: 72 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62  rence to any tab
ccc0: 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  le other than th
ccd0: 65 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a  e iBase table..*
cce0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 66  /.static int ref
ccf0: 65 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c  erencesOtherTabl
cd00: 65 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  es(.  ExprList *
cd10: 70 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20  pList,          
cd20: 2f 2a 20 53 65 61 72 63 68 20 65 78 70 72 65 73  /* Search expres
cd30: 73 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73  sions in ths lis
cd40: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
cd50: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20  Set *pMaskSet,  
cd60: 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d   /* Mapping from
cd70: 20 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61   tables to bitma
cd80: 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  ps */.  int iFir
cd90: 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
cda0: 20 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e    /* Be searchin
cdb0: 67 20 77 69 74 68 20 74 68 65 20 69 46 69 72 73  g with the iFirs
cdc0: 74 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20  t-th expression 
cdd0: 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20  */.  int iBase  
cde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
cdf0: 2a 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e  * Ignore referen
ce00: 63 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c  ces to this tabl
ce10: 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73  e */.){.  Bitmas
ce20: 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74  k allowed = ~get
ce30: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69  Mask(pMaskSet, i
ce40: 42 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20  Base);.  while( 
ce50: 69 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45  iFirst<pList->nE
ce60: 78 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  xpr ){.    if( (
ce70: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
ce80: 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e  MaskSet, pList->
ce90: 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70  a[iFirst++].pExp
cea0: 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29  r)&allowed)!=0 )
ceb0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
cec0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
ced0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cee0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
cef0: 65 61 72 63 68 65 73 20 74 68 65 20 65 78 70 72  earches the expr
cf00: 65 73 73 69 6f 6e 20 6c 69 73 74 20 70 61 73 73  ession list pass
cf10: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
cf20: 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 66 6f 72   argument.** for
cf30: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f   an expression o
cf40: 66 20 74 79 70 65 20 54 4b 5f 43 4f 4c 55 4d 4e  f type TK_COLUMN
cf50: 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
cf60: 74 68 65 20 73 61 6d 65 20 63 6f 6c 75 6d 6e 20  the same column 
cf70: 61 6e 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20  and.** uses the 
cf80: 73 61 6d 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  same collation s
cf90: 65 71 75 65 6e 63 65 20 61 73 20 74 68 65 20 69  equence as the i
cfa0: 43 6f 6c 27 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  Col'th column of
cfb0: 20 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2a 20   index pIdx..** 
cfc0: 41 72 67 75 6d 65 6e 74 20 69 42 61 73 65 20 69  Argument iBase i
cfd0: 73 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  s the cursor num
cfe0: 62 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 65  ber used for the
cff0: 20 74 61 62 6c 65 20 74 68 61 74 20 70 49 64 78   table that pIdx
d000: 20 72 65 66 65 72 73 0a 2a 2a 20 74 6f 2e 0a 2a   refers.** to..*
d010: 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 6e 20  *.** If such an 
d020: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 6f  expression is fo
d030: 75 6e 64 2c 20 69 74 73 20 69 6e 64 65 78 20 69  und, its index i
d040: 6e 20 70 4c 69 73 74 2d 3e 61 5b 5d 20 69 73 20  n pList->a[] is 
d050: 72 65 74 75 72 6e 65 64 2e 20 49 66 0a 2a 2a 20  returned. If.** 
d060: 6e 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  no expression is
d070: 20 66 6f 75 6e 64 2c 20 2d 31 20 69 73 20 72 65   found, -1 is re
d080: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
d090: 63 20 69 6e 74 20 66 69 6e 64 49 6e 64 65 78 43  c int findIndexC
d0a0: 6f 6c 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ol(.  Parse *pPa
d0b0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
d0c0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 20 63        /* Parse c
d0d0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
d0e0: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
d0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
d100: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74  xpression list t
d110: 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 69 6e  o search */.  in
d120: 74 20 69 42 61 73 65 2c 20 20 20 20 20 20 20 20  t iBase,        
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d140: 20 43 75 72 73 6f 72 20 66 6f 72 20 74 61 62 6c   Cursor for tabl
d150: 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
d160: 68 20 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65  h pIdx */.  Inde
d170: 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20  x *pIdx,        
d180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
d190: 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 63 6f  ndex to match co
d1a0: 6c 75 6d 6e 20 6f 66 20 2a 2f 0a 20 20 69 6e 74  lumn of */.  int
d1b0: 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1d0: 43 6f 6c 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20  Column of index 
d1e0: 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20  to match */.){. 
d1f0: 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20   int i;.  const 
d200: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 49  char *zColl = pI
d210: 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 43 6f 6c 5d  dx->azColl[iCol]
d220: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
d230: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
d240: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
d250: 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  = pList->a[i].pE
d260: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  xpr;.    if( p->
d270: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
d280: 20 20 20 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e     && p->iColumn
d290: 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
d2a0: 5b 69 43 6f 6c 5d 0a 20 20 20 20 20 26 26 20 70  [iCol].     && p
d2b0: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 0a  ->iTable==iBase.
d2c0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c      ){.      Col
d2d0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71  lSeq *pColl = sq
d2e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
d2f0: 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20  (pParse, p);.   
d300: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 43     if( ALWAYS(pC
d310: 6f 6c 6c 29 20 26 26 20 30 3d 3d 73 71 6c 69 74  oll) && 0==sqlit
d320: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
d330: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29  >zName, zColl) )
d340: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
d350: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
d360: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
d370: 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  -1;.}../*.** Thi
d380: 73 20 72 6f 75 74 69 6e 65 20 64 65 74 65 72 6d  s routine determ
d390: 69 6e 65 73 20 69 66 20 70 49 64 78 20 63 61 6e  ines if pIdx can
d3a0: 20 62 65 20 75 73 65 64 20 74 6f 20 61 73 73 69   be used to assi
d3b0: 73 74 20 69 6e 20 70 72 6f 63 65 73 73 69 6e 67  st in processing
d3c0: 20 61 0a 2a 2a 20 44 49 53 54 49 4e 43 54 20 71   a.** DISTINCT q
d3d0: 75 61 6c 69 66 69 65 72 2e 20 49 6e 20 6f 74 68  ualifier. In oth
d3e0: 65 72 20 77 6f 72 64 73 2c 20 69 74 20 74 65 73  er words, it tes
d3f0: 74 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ts whether or no
d400: 74 20 75 73 69 6e 67 20 74 68 69 73 0a 2a 2a 20  t using this.** 
d410: 69 6e 64 65 78 20 66 6f 72 20 74 68 65 20 6f 75  index for the ou
d420: 74 65 72 20 6c 6f 6f 70 20 67 75 61 72 61 6e 74  ter loop guarant
d430: 65 65 73 20 74 68 61 74 20 72 6f 77 73 20 77 69  ees that rows wi
d440: 74 68 20 65 71 75 61 6c 20 76 61 6c 75 65 73 20  th equal values 
d450: 66 6f 72 0a 2a 2a 20 61 6c 6c 20 65 78 70 72 65  for.** all expre
d460: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 70 44  ssions in the pD
d470: 69 73 74 69 6e 63 74 20 6c 69 73 74 20 61 72 65  istinct list are
d480: 20 64 65 6c 69 76 65 72 65 64 20 67 72 6f 75 70   delivered group
d490: 65 64 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2a 0a  ed together..**.
d4a0: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
d4b0: 74 68 65 20 71 75 65 72 79 20 0a 2a 2a 0a 2a 2a  the query .**.**
d4c0: 20 20 20 53 45 4c 45 43 54 20 44 49 53 54 49 4e     SELECT DISTIN
d4d0: 43 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20  CT a, b, c FROM 
d4e0: 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 3f 0a  tbl WHERE a = ?.
d4f0: 2a 2a 0a 2a 2a 20 63 61 6e 20 62 65 6e 65 66 69  **.** can benefi
d500: 74 20 66 72 6f 6d 20 61 6e 79 20 69 6e 64 65 78  t from any index
d510: 20 6f 6e 20 63 6f 6c 75 6d 6e 73 20 22 62 22 20   on columns "b" 
d520: 61 6e 64 20 22 63 22 2e 0a 2a 2f 0a 73 74 61 74  and "c"..*/.stat
d530: 69 63 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63  ic int isDistinc
d540: 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
d550: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
d560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
d570: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
d580: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
d590: 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  WC,             
d5a0: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
d5b0: 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  lause */.  Index
d5c0: 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
d5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d5e0: 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f  e index being co
d5f0: 6e 73 69 64 65 72 65 64 20 2a 2f 0a 20 20 69 6e  nsidered */.  in
d600: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d620: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
d630: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 70 49 64  or the table pId
d640: 78 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 45 78 70  x is on */.  Exp
d650: 72 4c 69 73 74 20 2a 70 44 69 73 74 69 6e 63 74  rList *pDistinct
d660: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
d670: 54 68 65 20 44 49 53 54 49 4e 43 54 20 65 78 70  The DISTINCT exp
d680: 72 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ressions */.  in
d690: 74 20 6e 45 71 43 6f 6c 20 20 20 20 20 20 20 20  t nEqCol        
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6b0: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   Number of index
d6c0: 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d   columns with ==
d6d0: 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b   */.){.  Bitmask
d6e0: 20 6d 61 73 6b 20 3d 20 30 3b 20 20 20 20 20 20   mask = 0;      
d6f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
d700: 20 6f 66 20 75 6e 61 63 63 6f 75 6e 74 65 64 20   of unaccounted 
d710: 66 6f 72 20 70 44 69 73 74 69 6e 63 74 20 65 78  for pDistinct ex
d720: 70 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  prs */.  int i; 
d730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d740: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
d750: 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
d760: 0a 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e  ..  if( pIdx->zN
d770: 61 6d 65 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69  ame==0 || pDisti
d780: 6e 63 74 3d 3d 30 20 7c 7c 20 70 44 69 73 74 69  nct==0 || pDisti
d790: 6e 63 74 2d 3e 6e 45 78 70 72 3e 3d 42 4d 53 20  nct->nExpr>=BMS 
d7a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 74 65  ) return 0;.  te
d7b0: 73 74 63 61 73 65 28 20 70 44 69 73 74 69 6e 63  stcase( pDistinc
d7c0: 74 2d 3e 6e 45 78 70 72 3d 3d 42 4d 53 2d 31 20  t->nExpr==BMS-1 
d7d0: 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  );..  /* Loop th
d7e0: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 65 78  rough all the ex
d7f0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
d800: 20 64 69 73 74 69 6e 63 74 20 6c 69 73 74 2e 20   distinct list. 
d810: 49 66 20 61 6e 79 20 6f 66 20 74 68 65 6d 0a 20  If any of them. 
d820: 20 2a 2a 20 61 72 65 20 6e 6f 74 20 73 69 6d 70   ** are not simp
d830: 6c 65 20 63 6f 6c 75 6d 6e 20 72 65 66 65 72 65  le column refere
d840: 6e 63 65 73 2c 20 72 65 74 75 72 6e 20 65 61 72  nces, return ear
d850: 6c 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ly. Otherwise, t
d860: 65 73 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  est if the.  ** 
d870: 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e  WHERE clause con
d880: 74 61 69 6e 73 20 61 20 22 63 6f 6c 3d 58 22 20  tains a "col=X" 
d890: 63 6c 61 75 73 65 2e 20 49 66 20 69 74 20 64 6f  clause. If it do
d8a0: 65 73 2c 20 74 68 65 20 65 78 70 72 65 73 73 69  es, the expressi
d8b0: 6f 6e 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 69  on.  ** can be i
d8c0: 67 6e 6f 72 65 64 2e 20 49 66 20 69 74 20 64 6f  gnored. If it do
d8d0: 65 73 20 6e 6f 74 2c 20 61 6e 64 20 74 68 65 20  es not, and the 
d8e0: 63 6f 6c 75 6d 6e 20 64 6f 65 73 20 6e 6f 74 20  column does not 
d8f0: 62 65 6c 6f 6e 67 20 74 6f 20 74 68 65 0a 20 20  belong to the.  
d900: 2a 2a 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73  ** same table as
d910: 20 69 6e 64 65 78 20 70 49 64 78 2c 20 72 65 74   index pIdx, ret
d920: 75 72 6e 20 65 61 72 6c 79 2e 20 46 69 6e 61 6c  urn early. Final
d930: 6c 79 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  ly, if there is 
d940: 6e 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 69 6e 67  no.  ** matching
d950: 20 22 63 6f 6c 3d 58 22 20 65 78 70 72 65 73 73   "col=X" express
d960: 69 6f 6e 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  ion and the colu
d970: 6d 6e 20 69 73 20 6f 6e 20 74 68 65 20 73 61 6d  mn is on the sam
d980: 65 20 74 61 62 6c 65 20 61 73 20 70 49 64 78 2c  e table as pIdx,
d990: 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 63 6f  .  ** set the co
d9a0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
d9b0: 69 6e 20 76 61 72 69 61 62 6c 65 20 6d 61 73 6b  in variable mask
d9c0: 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
d9d0: 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d 3e 6e  ; i<pDistinct->n
d9e0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
d9f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
da00: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 20 3d 20  ;.    Expr *p = 
da10: 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e  pDistinct->a[i].
da20: 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
da30: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
da40: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
da50: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
da60: 28 70 57 43 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  (pWC, p->iTable,
da70: 20 70 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 7e 28 42   p->iColumn, ~(B
da80: 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45 51 2c  itmask)0, WO_EQ,
da90: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65   0);.    if( pTe
daa0: 72 6d 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  rm ){.      Expr
dab0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
dac0: 78 70 72 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  xpr;.      CollS
dad0: 65 71 20 2a 70 31 20 3d 20 73 71 6c 69 74 65 33  eq *p1 = sqlite3
dae0: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
daf0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d  lSeq(pParse, pX-
db00: 3e 70 4c 65 66 74 2c 20 70 58 2d 3e 70 52 69 67  >pLeft, pX->pRig
db10: 68 74 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ht);.      CollS
db20: 65 71 20 2a 70 32 20 3d 20 73 71 6c 69 74 65 33  eq *p2 = sqlite3
db30: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
db40: 73 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66  se, p);.      if
db50: 28 20 70 31 3d 3d 70 32 20 29 20 63 6f 6e 74 69  ( p1==p2 ) conti
db60: 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  nue;.    }.    i
db70: 66 28 20 70 2d 3e 69 54 61 62 6c 65 21 3d 62 61  f( p->iTable!=ba
db80: 73 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  se ) return 0;. 
db90: 20 20 20 6d 61 73 6b 20 7c 3d 20 28 28 28 42 69     mask |= (((Bi
dba0: 74 6d 61 73 6b 29 31 29 20 3c 3c 20 69 29 3b 0a  tmask)1) << i);.
dbb0: 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 6e 45 71    }..  for(i=nEq
dbc0: 43 6f 6c 3b 20 6d 61 73 6b 20 26 26 20 69 3c 70  Col; mask && i<p
dbd0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b  Idx->nColumn; i+
dbe0: 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 78 70  +){.    int iExp
dbf0: 72 20 3d 20 66 69 6e 64 49 6e 64 65 78 43 6f 6c  r = findIndexCol
dc00: 28 70 50 61 72 73 65 2c 20 70 44 69 73 74 69 6e  (pParse, pDistin
dc10: 63 74 2c 20 62 61 73 65 2c 20 70 49 64 78 2c 20  ct, base, pIdx, 
dc20: 69 29 3b 0a 20 20 20 20 69 66 28 20 69 45 78 70  i);.    if( iExp
dc30: 72 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  r<0 ) break;.   
dc40: 20 6d 61 73 6b 20 26 3d 20 7e 28 28 28 42 69 74   mask &= ~(((Bit
dc50: 6d 61 73 6b 29 31 29 20 3c 3c 20 69 45 78 70 72  mask)1) << iExpr
dc60: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
dc70: 20 28 6d 61 73 6b 3d 3d 30 29 3b 0a 7d 0a 0a 0a   (mask==0);.}...
dc80: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
dc90: 65 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43  e if the DISTINC
dca0: 54 20 65 78 70 72 65 73 73 69 6f 6e 2d 6c 69 73  T expression-lis
dcb0: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
dcc0: 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 0a 2a  third argument.*
dcd0: 2a 20 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20  * is redundant. 
dce0: 41 20 44 49 53 54 49 4e 43 54 20 6c 69 73 74 20  A DISTINCT list 
dcf0: 69 73 20 72 65 64 75 6e 64 61 6e 74 20 69 66 20  is redundant if 
dd00: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
dd10: 74 61 69 6e 73 20 61 0a 2a 2a 20 55 4e 49 51 55  tains a.** UNIQU
dd20: 45 20 69 6e 64 65 78 20 74 68 61 74 20 67 75 61  E index that gua
dd30: 72 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65  rantees that the
dd40: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 71   result of the q
dd50: 75 65 72 79 20 77 69 6c 6c 20 62 65 20 64 69 73  uery will be dis
dd60: 74 69 6e 63 74 0a 2a 2a 20 61 6e 79 77 61 79 2e  tinct.** anyway.
dd70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
dd80: 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
dd90: 6e 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  nt(.  Parse *pPa
dda0: 72 73 65 2c 0a 20 20 53 72 63 4c 69 73 74 20 2a  rse,.  SrcList *
ddb0: 70 54 61 62 4c 69 73 74 2c 0a 20 20 57 68 65 72  pTabList,.  Wher
ddc0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20  eClause *pWC,.  
ddd0: 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 69  ExprList *pDisti
dde0: 6e 63 74 0a 29 7b 0a 20 20 54 61 62 6c 65 20 2a  nct.){.  Table *
ddf0: 70 54 61 62 3b 0a 20 20 49 6e 64 65 78 20 2a 70  pTab;.  Index *p
de00: 49 64 78 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20  Idx;.  int i;   
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 42         .  int iB
de30: 61 73 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ase;..  /* If th
de40: 65 72 65 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ere is more than
de50: 20 6f 6e 65 20 74 61 62 6c 65 20 6f 72 20 73 75   one table or su
de60: 62 2d 73 65 6c 65 63 74 20 69 6e 20 74 68 65 20  b-select in the 
de70: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 0a 20  FROM clause of. 
de80: 20 2a 2a 20 74 68 69 73 20 71 75 65 72 79 2c 20   ** this query, 
de90: 74 68 65 6e 20 69 74 20 77 69 6c 6c 20 6e 6f 74  then it will not
dea0: 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
deb0: 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 44 49  show that the DI
dec0: 53 54 49 4e 43 54 20 0a 20 20 2a 2a 20 63 6c 61  STINCT .  ** cla
ded0: 75 73 65 20 69 73 20 72 65 64 75 6e 64 61 6e 74  use is redundant
dee0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c  . */.  if( pTabL
def0: 69 73 74 2d 3e 6e 53 72 63 21 3d 31 20 29 20 72  ist->nSrc!=1 ) r
df00: 65 74 75 72 6e 20 30 3b 0a 20 20 69 42 61 73 65  eturn 0;.  iBase
df10: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
df20: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 70 54 61  ].iCursor;.  pTa
df30: 62 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  b = pTabList->a[
df40: 30 5d 2e 70 54 61 62 3b 0a 0a 20 20 2f 2a 20 49  0].pTab;..  /* I
df50: 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70  f any of the exp
df60: 72 65 73 73 69 6f 6e 73 20 69 73 20 61 6e 20 49  ressions is an I
df70: 50 4b 20 63 6f 6c 75 6d 6e 20 6f 6e 20 74 61 62  PK column on tab
df80: 6c 65 20 69 42 61 73 65 2c 20 74 68 65 6e 20 72  le iBase, then r
df90: 65 74 75 72 6e 20 0a 20 20 2a 2a 20 74 72 75 65  eturn .  ** true
dfa0: 2e 20 4e 6f 74 65 3a 20 54 68 65 20 28 70 2d 3e  . Note: The (p->
dfb0: 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 29 20 70  iTable==iBase) p
dfc0: 61 72 74 20 6f 66 20 74 68 69 73 20 74 65 73 74  art of this test
dfd0: 20 6d 61 79 20 62 65 20 66 61 6c 73 65 20 69 66   may be false if
dfe0: 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e   the.  ** curren
dff0: 74 20 53 45 4c 45 43 54 20 69 73 20 61 20 63 6f  t SELECT is a co
e000: 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71 75 65  rrelated sub-que
e010: 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ry..  */.  for(i
e020: 3d 30 3b 20 69 3c 70 44 69 73 74 69 6e 63 74 2d  =0; i<pDistinct-
e030: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
e040: 20 20 45 78 70 72 20 2a 70 20 3d 20 70 44 69 73    Expr *p = pDis
e050: 74 69 6e 63 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  tinct->a[i].pExp
e060: 72 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  r;.    if( p->op
e070: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70  ==TK_COLUMN && p
e080: 2d 3e 69 54 61 62 6c 65 3d 3d 69 42 61 73 65 20  ->iTable==iBase 
e090: 26 26 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20  && p->iColumn<0 
e0a0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
e0b0: 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75  .  /* Loop throu
e0c0: 67 68 20 61 6c 6c 20 69 6e 64 69 63 65 73 20 6f  gh all indices o
e0d0: 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 63 68 65  n the table, che
e0e0: 63 6b 69 6e 67 20 65 61 63 68 20 74 6f 20 73 65  cking each to se
e0f0: 65 20 69 66 20 69 74 20 6d 61 6b 65 73 0a 20 20  e if it makes.  
e100: 2a 2a 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  ** the DISTINCT 
e110: 71 75 61 6c 69 66 69 65 72 20 72 65 64 75 6e 64  qualifier redund
e120: 61 6e 74 2e 20 49 74 20 64 6f 65 73 20 73 6f 20  ant. It does so 
e130: 69 66 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  if:.  **.  **   
e140: 31 2e 20 54 68 65 20 69 6e 64 65 78 20 69 73 20  1. The index is 
e150: 69 74 73 65 6c 66 20 55 4e 49 51 55 45 2c 20 61  itself UNIQUE, a
e160: 6e 64 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 32  nd.  **.  **   2
e170: 2e 20 41 6c 6c 20 6f 66 20 74 68 65 20 63 6f 6c  . All of the col
e180: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
e190: 78 20 61 72 65 20 65 69 74 68 65 72 20 70 61 72  x are either par
e1a0: 74 20 6f 66 20 74 68 65 20 70 44 69 73 74 69 6e  t of the pDistin
e1b0: 63 74 0a 20 20 2a 2a 20 20 20 20 20 20 6c 69 73  ct.  **      lis
e1c0: 74 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 57  t, or else the W
e1d0: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 74  HERE clause cont
e1e0: 61 69 6e 73 20 61 20 74 65 72 6d 20 6f 66 20 74  ains a term of t
e1f0: 68 65 20 66 6f 72 6d 20 22 63 6f 6c 3d 58 22 2c  he form "col=X",
e200: 0a 20 20 2a 2a 20 20 20 20 20 20 77 68 65 72 65  .  **      where
e210: 20 58 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74   X is a constant
e220: 20 76 61 6c 75 65 2e 20 54 68 65 20 63 6f 6c 6c   value. The coll
e230: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
e240: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 20 20 20 20  of the.  **     
e250: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 6e 64 20   comparison and 
e260: 73 65 6c 65 63 74 2d 6c 69 73 74 20 65 78 70 72  select-list expr
e270: 65 73 73 69 6f 6e 73 20 6d 75 73 74 20 6d 61 74  essions must mat
e280: 63 68 20 74 68 6f 73 65 20 6f 66 20 74 68 65 20  ch those of the 
e290: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
e2a0: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
e2b0: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
e2c0: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
e2d0: 20 20 69 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72    if( pIdx->onEr
e2e0: 72 6f 72 3d 3d 4f 45 5f 4e 6f 6e 65 20 29 20 63  ror==OE_None ) c
e2f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 6f 72  ontinue;.    for
e300: 28 69 3d 30 3b 20 69 3c 70 49 64 78 2d 3e 6e 43  (i=0; i<pIdx->nC
e310: 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  olumn; i++){.   
e320: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 49     int iCol = pI
e330: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b  dx->aiColumn[i];
e340: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 66 69  .      if( 0==fi
e350: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 42 61 73  ndTerm(pWC, iBas
e360: 65 2c 20 69 43 6f 6c 2c 20 7e 28 42 69 74 6d 61  e, iCol, ~(Bitma
e370: 73 6b 29 30 2c 20 57 4f 5f 45 51 2c 20 70 49 64  sk)0, WO_EQ, pId
e380: 78 29 20 0a 20 20 20 20 20 20 20 26 26 20 30 3e  x) .       && 0>
e390: 66 69 6e 64 49 6e 64 65 78 43 6f 6c 28 70 50 61  findIndexCol(pPa
e3a0: 72 73 65 2c 20 70 44 69 73 74 69 6e 63 74 2c 20  rse, pDistinct, 
e3b0: 69 42 61 73 65 2c 20 70 49 64 78 2c 20 69 29 0a  iBase, pIdx, i).
e3c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
e3d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e3e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
e3f0: 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  =pIdx->nColumn )
e400: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
e410: 69 6e 64 65 78 20 69 6d 70 6c 69 65 73 20 74 68  index implies th
e420: 61 74 20 74 68 65 20 44 49 53 54 49 4e 43 54 20  at the DISTINCT 
e430: 71 75 61 6c 69 66 69 65 72 20 69 73 20 72 65 64  qualifier is red
e440: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  undant. */.     
e450: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
e460: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
e470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
e480: 72 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20  routine decides 
e490: 69 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75  if pIdx can be u
e4a0: 73 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  sed to satisfy t
e4b0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
e4c0: 6c 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61  lause.  If it ca
e4d0: 6e 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e  n, it returns 1.
e4e0: 20 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74    If pIdx cannot
e4f0: 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20   satisfy the.** 
e500: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c  ORDER BY clause,
e510: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
e520: 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  turns 0..**.** p
e530: 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52  OrderBy is an OR
e540: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72  DER BY clause fr
e550: 6f 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  om a SELECT stat
e560: 65 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20  ement.  pTab is 
e570: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74  the.** left-most
e580: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
e590: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61  OM clause of tha
e5a0: 74 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74  t same SELECT st
e5b0: 61 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74  atement and.** t
e5c0: 68 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63  he table has a c
e5d0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
e5e0: 22 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73  "base".  pIdx is
e5f0: 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61   an index on pTa
e600: 62 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20  b..**.** nEqCol 
e610: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
e620: 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78   columns of pIdx
e630: 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61   that are used a
e640: 73 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f  s equality.** co
e650: 6e 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20  nstraints.  Any 
e660: 6f 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  of these columns
e670: 20 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20   may be missing 
e680: 66 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42  from the ORDER B
e690: 59 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20  Y.** clause and 
e6a0: 74 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74  the match can st
e6b0: 69 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73  ill be a success
e6c0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d  ..**.** All term
e6d0: 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  s of the ORDER B
e6e0: 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67 61  Y that match aga
e6f0: 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d  inst the index m
e700: 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a  ust be either.**
e710: 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28   ASC or DESC.  (
e720: 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  Terms of the ORD
e730: 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61 73  ER BY clause pas
e740: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55  t the end of a U
e750: 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64  NIQUE.** index d
e760: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61  o not need to sa
e770: 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74  tisfy this const
e780: 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62  raint.)  The *pb
e790: 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20  Rev value is.** 
e7a0: 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65 20  set to 1 if the 
e7b0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
e7c0: 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20  is all DESC and 
e7d0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  it is set to 0 i
e7e0: 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42  f.** the ORDER B
e7f0: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
e800: 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ASC..*/.static i
e810: 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65  nt isSortingInde
e820: 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  x(.  Parse *pPar
e830: 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se,          /* 
e840: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
e850: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
e860: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20  t *pMaskSet, /* 
e870: 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62  Mapping from tab
e880: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
e890: 73 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a  s to bitmaps */.
e8a0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
e8b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e8c0: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
e8d0: 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62  sting */.  int b
e8e0: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
e8f0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
e900: 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c  ber for the tabl
e910: 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a  e to be sorted *
e920: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
e930: 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54  rderBy,     /* T
e940: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
e950: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43  se */.  int nEqC
e960: 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ol,             
e970: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
e980: 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20  ex columns with 
e990: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
e9a0: 2f 0a 20 20 69 6e 74 20 77 73 46 6c 61 67 73 2c  /.  int wsFlags,
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e9c0: 6e 64 65 78 20 75 73 61 67 65 73 20 66 6c 61 67  ndex usages flag
e9d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
e9e0: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
e9f0: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
ea00: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
ea10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
ea20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea30: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
ea40: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
ea50: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
ea60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea70: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
ea80: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
ea90: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
eaa0: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
eac0: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
ead0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
eae0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
eaf0: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
eb00: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
eb10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
eb20: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
eb30: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
eb40: 20 20 69 66 28 20 21 70 4f 72 64 65 72 42 79 20    if( !pOrderBy 
eb50: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
eb60: 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
eb70: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 20 72 65  E_COLUMN_IN ) re
eb80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 49  turn 0;.  if( pI
eb90: 64 78 2d 3e 62 55 6e 6f 72 64 65 72 65 64 20 29  dx->bUnordered )
eba0: 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 6e 54   return 0;..  nT
ebb0: 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
ebc0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
ebd0: 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
ebe0: 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
ebf0: 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e  must either poin
ec00: 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61  t to a 'real' na
ec10: 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74  med index struct
ec20: 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e  ure, .  ** or an
ec30: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
ec40: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
ec50: 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42  e stack by bestB
ec60: 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20  treeIndex() to. 
ec70: 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68   ** represent th
ec80: 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68  e rowid index th
ec90: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76  at is part of ev
eca0: 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ery table.  */. 
ecb0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a   assert( pIdx->z
ecc0: 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  Name || (pIdx->n
ecd0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
ece0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ecf0: 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  -1) );..  /* Mat
ed00: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
ed10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ed20: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
ed30: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
ed40: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  x..  **.  ** Not
ed50: 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68  e that indices h
ed60: 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ave pIdx->nColum
ed70: 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  n regular column
ed80: 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20  s plus.  ** one 
ed90: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
eda0: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
edb0: 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77   rowid.  The row
edc0: 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  id column.  ** o
edd0: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
ede0: 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d  lso allowed to m
edf0: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
ee00: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
ee10: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  lause..  */.  fo
ee20: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
ee30: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
ee40: 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
ee50: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
ee60: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
ee70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
ee80: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f  ression of the O
ee90: 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f  RDER BY pTerm */
eea0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
eeb0: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  oll;    /* The c
eec0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
eed0: 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  e of pExpr */.  
eee0: 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72    int termSortOr
eef0: 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64  der; /* Sort ord
ef00: 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  er for this term
ef10: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
ef20: 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  umn;       /* Th
ef30: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
ef40: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20   the index.  -1 
ef50: 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  for rowid */.   
ef60: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b   int iSortOrder;
ef70: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53      /* 1 for DES
ef80: 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20  C, 0 for ASC on 
ef90: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74  the i-th index t
efa0: 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  erm */.    const
efb0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a   char *zColl; /*
efc0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
efd0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
efe0: 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74  for i-th index t
eff0: 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  erm */..    pExp
f000: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
f010: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
f020: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
f030: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
f040: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
f050: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
f060: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
f070: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
f080: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
f090: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
f0a0: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
f0b0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
f0c0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
f0d0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
f0e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
f0f0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
f100: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
f110: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
f120: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
f130: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
f140: 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26  ( pIdx->zName &&
f150: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
f160: 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d   ){.      iColum
f170: 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  n = pIdx->aiColu
f180: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
f190: 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e   iColumn==pIdx->
f1a0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b  pTable->iPKey ){
f1b0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
f1c0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
f1d0: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
f1e0: 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
f1f0: 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f  er[i];.      zCo
f200: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
f210: 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l[i];.    }else{
f220: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
f230: 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74   -1;.      iSort
f240: 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Order = 0;.     
f250: 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e   zColl = pColl->
f260: 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20  zName;.    }.   
f270: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
f280: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20  umn!=iColumn || 
f290: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
f2a0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
f2b0: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ll) ){.      /* 
f2c0: 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52  Term j of the OR
f2d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f  DER BY clause do
f2e0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c  es not match col
f2f0: 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64  umn i of the ind
f300: 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
f310: 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i<nEqCol ){.    
f320: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
f330: 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69  ex column that i
f340: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
f350: 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74   == fails to mat
f360: 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ch an.        **
f370: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20   ORDER BY term, 
f380: 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73  that is OK.  Jus
f390: 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f  t ignore that co
f3a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
f3b0: 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  x.        */.   
f3c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
f3d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f3e0: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
f3f0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
f400: 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20  dex column i is 
f410: 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20  the rowid.  All 
f420: 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63  other terms matc
f430: 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  h. */.        br
f440: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
f450: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f460: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
f470: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
f480: 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72  nd is not constr
f490: 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20  ained by ==.    
f4a0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
f4b0: 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74  index cannot sat
f4c0: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
f4d0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  Y constraint..  
f4e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
f4f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
f500: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
f510: 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74  ert( pIdx->aSort
f520: 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c  Order!=0 || iCol
f530: 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  umn==-1 );.    a
f540: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f  ssert( pTerm->so
f550: 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54  rtOrder==0 || pT
f560: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
f570: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
f580: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c   iSortOrder==0 |
f590: 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20  | iSortOrder==1 
f5a0: 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
f5b0: 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65  rder = iSortOrde
f5c0: 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  r ^ pTerm->sortO
f5d0: 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e  rder;.    if( i>
f5e0: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
f5f0: 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
f600: 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  r!=sortOrder ){.
f610: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
f620: 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  es can only be u
f630: 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52  sed if all ORDER
f640: 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74   BY terms past t
f650: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71  he.        ** eq
f660: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
f670: 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ts are all eithe
f680: 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a  r DESC or ASC. *
f690: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
f6a0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
f6b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72  }else{.      sor
f6c0: 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
f6d0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
f6e0: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
f6f0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
f700: 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65  umn<0 && !refere
f710: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
f720: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
f730: 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a  et, j, base) ){.
f740: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
f750: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69  indexed column i
f760: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
f770: 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67  y and everything
f780: 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a   matches.      *
f790: 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e  * so far and non
f7a0: 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  e of the ORDER B
f7b0: 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72  Y terms to the r
f7c0: 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f  ight reference o
f7d0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61  ther.      ** ta
f7e0: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
f7f0: 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73  , then we are as
f800: 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69  sured that the i
f810: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
f820: 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f   .      ** to so
f830: 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  rt because the p
f840: 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e  rimary key is un
f850: 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65  ique and so none
f860: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20   of the other.  
f870: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77      ** columns w
f880: 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66  ill make any dif
f890: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f  ference.      */
f8a0: 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d  .      j = nTerm
f8b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
f8c0: 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
f8d0: 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e  r!=0;.  if( j>=n
f8e0: 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Term ){.    /* A
f8f0: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
f900: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
f910: 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
f920: 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20  his index so.   
f930: 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63   ** this index c
f940: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
f950: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  orting. */.    r
f960: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
f970: 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
f980: 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d  !=OE_None && i==
f990: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  pIdx->nColumn.  
f9a0: 20 20 20 20 26 26 20 28 77 73 46 6c 61 67 73 20      && (wsFlags 
f9b0: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e  & WHERE_COLUMN_N
f9c0: 55 4c 4c 29 3d 3d 30 0a 20 20 20 20 20 20 26 26  ULL)==0.      &&
f9d0: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
f9e0: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
f9f0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
fa00: 61 73 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ase) ){.    /* A
fa10: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73  ll terms of this
fa20: 20 69 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d   index match som
fa30: 65 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  e prefix of the 
fa40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
fa50: 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69      ** and the i
fa60: 6e 64 65 78 20 69 73 20 55 4e 49 51 55 45 20 61  ndex is UNIQUE a
fa70: 6e 64 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74  nd no terms on t
fa80: 68 65 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f  he tail of the O
fa90: 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
faa0: 6c 61 75 73 65 20 72 65 66 65 72 65 6e 63 65 20  lause reference 
fab0: 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20  other tables in 
fac0: 61 20 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73  a join.  If this
fad0: 20 69 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65   is all true the
fae0: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64  n.    ** the ord
faf0: 65 72 20 62 79 20 63 6c 61 75 73 65 20 69 73 20  er by clause is 
fb00: 73 75 70 65 72 66 6c 75 6f 75 73 2e 20 20 4e 6f  superfluous.  No
fb10: 74 20 74 68 61 74 20 69 66 20 74 68 65 20 6d 61  t that if the ma
fb20: 74 63 68 69 6e 67 0a 20 20 20 20 2a 2a 20 63 6f  tching.    ** co
fb30: 6e 64 69 74 69 6f 6e 20 69 73 20 49 53 20 4e 55  ndition is IS NU
fb40: 4c 4c 20 74 68 65 6e 20 74 68 65 20 72 65 73 75  LL then the resu
fb50: 6c 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73  lt is not necess
fb60: 61 72 69 6c 79 20 75 6e 69 71 75 65 0a 20 20 20  arily unique.   
fb70: 20 2a 2a 20 65 76 65 6e 20 6f 6e 20 61 20 55 4e   ** even on a UN
fb80: 49 51 55 45 20 69 6e 64 65 78 2c 20 73 6f 20 64  IQUE index, so d
fb90: 69 73 61 6c 6c 6f 77 20 74 68 6f 73 65 20 63 61  isallow those ca
fba0: 73 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ses. */.    retu
fbb0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
fbc0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
fbd0: 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65  repare a crude e
fbe0: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c  stimate of the l
fbf0: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
fc00: 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  input value..** 
fc10: 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64  The results need
fc20: 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20   not be exact.  
fc30: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  This is only use
fc40: 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  d for estimating
fc50: 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  .** the total co
fc60: 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67  st of performing
fc70: 20 6f 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68   operations with
fc80: 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c   O(logN) or O(Nl
fc90: 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69  ogN).** complexi
fca0: 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69  ty.  Because N i
fcb0: 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20  s just a guess, 
fcc0: 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74  it is no great t
fcd0: 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67  ragedy if.** log
fce0: 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66  N is a little of
fcf0: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  f..*/.static dou
fd00: 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c  ble estLog(doubl
fd10: 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c  e N){.  double l
fd20: 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c  ogN = 1;.  doubl
fd30: 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c  e x = 10;.  whil
fd40: 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f  e( N>x ){.    lo
fd50: 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a  gN += 1;.    x *
fd60: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = 10;.  }.  retu
fd70: 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn logN;.}../*.*
fd80: 2a 20 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66  * Two routines f
fd90: 6f 72 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20  or printing the 
fda0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71  content of an sq
fdb0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
fdc0: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20  .** structure.  
fdd0: 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  Used for testing
fde0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
fdf0: 6e 6c 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72  nly.  If neither
fe00: 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20  .** SQLITE_TEST 
fe10: 6f 72 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  or SQLITE_DEBUG 
fe20: 61 72 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65  are defined, the
fe30: 6e 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  n these routines
fe40: 0a 2a 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  .** are no-ops..
fe50: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
fe60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
fe70: 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
fe80: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
fe90: 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  G).static void T
fea0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
feb0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
fec0: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
fed0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
fee0: 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
fef0: 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
ff00: 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
ff10: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
ff20: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
ff30: 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a   constraint[%d]:
ff40: 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25   col=%d termid=%
ff50: 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d  d op=%d usabled=
ff60: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
ff70: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
ff80: 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d  traint[i].iColum
ff90: 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  n,.       p->aCo
ffa0: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72  nstraint[i].iTer
ffb0: 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20  mOffset,.       
ffc0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
ffd0: 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ].op,.       p->
ffe0: 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75  aConstraint[i].u
fff0: 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f  sable);.  }.  fo
10000 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64  r(i=0; i<p->nOrd
10010 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
10020 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
10030 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64  tf("  orderby[%d
10040 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25  ]: col=%d desc=%
10050 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a  d\n",.       i,.
10060 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72         p->aOrder
10070 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20  By[i].iColumn,. 
10080 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42        p->aOrderB
10090 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a  y[i].desc);.  }.
100a0 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52  }.static void TR
100b0 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28  ACE_IDX_OUTPUTS(
100c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
100d0 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
100e0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 57  .  if( !sqlite3W
100f0 68 65 72 65 54 72 61 63 65 20 29 20 72 65 74 75  hereTrace ) retu
10100 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  rn;.  for(i=0; i
10110 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
10120 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
10130 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
10140 20 75 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76   usage[%d]: argv
10150 49 64 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e  Idx=%d omit=%d\n
10160 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20  ",.       i,.   
10170 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69      p->aConstrai
10180 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49  ntUsage[i].argvI
10190 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e  ndex,.       p->
101a0 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
101b0 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20  [i].omit);.  }. 
101c0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
101d0 6e 74 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64  ntf("  idxNum=%d
101e0 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b  \n", p->idxNum);
101f0 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
10200 72 69 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d  rintf("  idxStr=
10210 25 73 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72  %s\n", p->idxStr
10220 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  );.  sqlite3Debu
10230 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72  gPrintf("  order
10240 42 79 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22  ByConsumed=%d\n"
10250 2c 20 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  , p->orderByCons
10260 75 6d 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  umed);.  sqlite3
10270 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 65  DebugPrintf("  e
10280 73 74 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c  stimatedCost=%g\
10290 6e 22 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64  n", p->estimated
102a0 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  Cost);.}.#else.#
102b0 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
102c0 5f 49 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69  _INPUTS(A).#defi
102d0 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  ne TRACE_IDX_OUT
102e0 50 55 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a  PUTS(A).#endif..
102f0 2f 2a 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20  /* .** Required 
10300 62 65 63 61 75 73 65 20 62 65 73 74 49 6e 64 65  because bestInde
10310 78 28 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79  x() is called by
10320 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64   bestOrClauseInd
10330 65 78 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ex() .*/.static 
10340 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a  void bestIndex(.
10350 20 20 20 20 50 61 72 73 65 2a 2c 20 57 68 65 72      Parse*, Wher
10360 65 43 6c 61 75 73 65 2a 2c 20 73 74 72 75 63 74  eClause*, struct
10370 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 0a   SrcList_item*,.
10380 20 20 20 20 42 69 74 6d 61 73 6b 2c 20 42 69 74      Bitmask, Bit
10390 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a 2c  mask, ExprList*,
103a0 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a 2f   WhereCost*);../
103b0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
103c0 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66 69  e attempts to fi
103d0 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20 73  nd an scanning s
103e0 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61 6e  trategy that can
103f0 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f 20   be used .** to 
10400 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52 27  optimize an 'OR'
10410 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
10420 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57 48   is part of a WH
10430 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a 0a  ERE clause. .**.
10440 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73 73  ** The table ass
10450 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52 4f  ociated with FRO
10460 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70 53  M clause term pS
10470 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  rc may be either
10480 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42 2d   a.** regular B-
10490 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61 20  Tree table or a 
104a0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a  virtual table..*
104b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
104c0 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28  stOrClauseIndex(
104d0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
104e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
104f0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
10500 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
10510 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
10520 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
10530 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
10540 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
10550 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
10560 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
10570 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
10580 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
10590 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
105a0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
105b0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
105c0 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
105d0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
105e0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id,           /*
105f0 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   Cursors not ava
10600 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70  ilable for any p
10610 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72  urpose */.  Expr
10620 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
10630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
10640 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
10650 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70  /.  WhereCost *p
10660 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20  Cost            
10670 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71  /* Lowest cost q
10680 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a  uery plan */.){.
10690 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
106a0 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
106b0 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  ION.  const int 
106c0 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
106d0 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
106e0 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
106f0 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
10700 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 42 69 74  d */.  const Bit
10710 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20 3d 20 67  mask maskSrc = g
10720 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73  etMask(pWC->pMas
10730 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a  kSet, iCur);  /*
10740 20 42 69 74 6d 61 73 6b 20 66 6f 72 20 70 53 72   Bitmask for pSr
10750 63 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  c */.  WhereTerm
10760 20 2a 20 63 6f 6e 73 74 20 70 57 43 45 6e 64 20   * const pWCEnd 
10770 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e  = &pWC->a[pWC->n
10780 54 65 72 6d 5d 3b 20 20 20 20 20 20 20 20 2f 2a  Term];        /*
10790 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b 5d   End of pWC->a[]
107a0 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
107b0 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
107c0 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
107d0 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
107e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
107f0 0a 20 20 2f 2a 20 4e 6f 20 4f 52 2d 63 6c 61 75  .  /* No OR-clau
10800 73 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  se optimization 
10810 61 6c 6c 6f 77 65 64 20 69 66 20 74 68 65 20 49  allowed if the I
10820 4e 44 45 58 45 44 20 42 59 20 6f 72 20 4e 4f 54  NDEXED BY or NOT
10830 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65 73   INDEXED clauses
10840 0a 20 20 2a 2a 20 61 72 65 20 75 73 65 64 20 2a  .  ** are used *
10850 2f 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f  /.  if( pSrc->no
10860 74 49 6e 64 65 78 65 64 20 7c 7c 20 70 53 72 63  tIndexed || pSrc
10870 2d 3e 70 49 6e 64 65 78 21 3d 30 20 29 7b 0a 20  ->pIndex!=0 ){. 
10880 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
10890 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65 20    /* Search the 
108a0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
108b0 6d 73 20 66 6f 72 20 61 20 75 73 61 62 6c 65 20  ms for a usable 
108c0 57 4f 5f 4f 52 20 74 65 72 6d 2e 20 2a 2f 0a 20  WO_OR term. */. 
108d0 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e   for(pTerm=pWC->
108e0 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b  a; pTerm<pWCEnd;
108f0 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
10900 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
10910 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a 20 20 20 20  tor==WO_OR .    
10920 20 26 26 20 28 28 70 54 65 72 6d 2d 3e 70 72 65   && ((pTerm->pre
10930 72 65 71 41 6c 6c 20 26 20 7e 6d 61 73 6b 53 72  reqAll & ~maskSr
10940 63 29 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d  c) & notReady)==
10950 30 0a 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  0.     && (pTerm
10960 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  ->u.pOrInfo->ind
10970 65 78 61 62 6c 65 20 26 20 6d 61 73 6b 53 72 63  exable & maskSrc
10980 29 21 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20  )!=0 .    ){.   
10990 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
109a0 20 63 6f 6e 73 74 20 70 4f 72 57 43 20 3d 20 26   const pOrWC = &
109b0 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
109c0 2d 3e 77 63 3b 0a 20 20 20 20 20 20 57 68 65 72  ->wc;.      Wher
109d0 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 4f  eTerm * const pO
109e0 72 57 43 45 6e 64 20 3d 20 26 70 4f 72 57 43 2d  rWCEnd = &pOrWC-
109f0 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d  >a[pOrWC->nTerm]
10a00 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
10a10 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20  m *pOrTerm;.    
10a20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 57 48    int flags = WH
10a30 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20  ERE_MULTI_OR;.  
10a40 20 20 20 20 64 6f 75 62 6c 65 20 72 54 6f 74 61      double rTota
10a50 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 64 6f 75  l = 0;.      dou
10a60 62 6c 65 20 6e 52 6f 77 20 3d 20 30 3b 0a 20 20  ble nRow = 0;.  
10a70 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64      Bitmask used
10a80 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 6f 72   = 0;..      for
10a90 28 70 4f 72 54 65 72 6d 3d 70 4f 72 57 43 2d 3e  (pOrTerm=pOrWC->
10aa0 61 3b 20 70 4f 72 54 65 72 6d 3c 70 4f 72 57 43  a; pOrTerm<pOrWC
10ab0 45 6e 64 3b 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  End; pOrTerm++){
10ac0 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f  .        WhereCo
10ad0 73 74 20 73 54 65 72 6d 43 6f 73 74 3b 0a 20 20  st sTermCost;.  
10ae0 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45        WHERETRACE
10af0 28 28 22 2e 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64  (("... Multi-ind
10b00 65 78 20 4f 52 20 74 65 73 74 69 6e 67 20 66 6f  ex OR testing fo
10b10 72 20 74 65 72 6d 20 25 64 20 6f 66 20 25 64 2e  r term %d of %d.
10b20 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  ...\n", .       
10b30 20 20 20 28 70 4f 72 54 65 72 6d 20 2d 20 70 4f     (pOrTerm - pO
10b40 72 57 43 2d 3e 61 29 2c 20 28 70 54 65 72 6d 20  rWC->a), (pTerm 
10b50 2d 20 70 57 43 2d 3e 61 29 0a 20 20 20 20 20 20  - pWC->a).      
10b60 20 20 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66    ));.        if
10b70 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
10b80 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a  ator==WO_AND ){.
10b90 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65 43            WhereC
10ba0 6c 61 75 73 65 20 2a 70 41 6e 64 57 43 20 3d 20  lause *pAndWC = 
10bb0 26 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41 6e 64  &pOrTerm->u.pAnd
10bc0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
10bd0 20 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50      bestIndex(pP
10be0 61 72 73 65 2c 20 70 41 6e 64 57 43 2c 20 70 53  arse, pAndWC, pS
10bf0 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 6f  rc, notReady, no
10c00 74 56 61 6c 69 64 2c 20 30 2c 20 26 73 54 65 72  tValid, 0, &sTer
10c10 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  mCost);.        
10c20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72  }else if( pOrTer
10c30 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
10c40 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Cur ){.         
10c50 20 57 68 65 72 65 43 6c 61 75 73 65 20 74 65 6d   WhereClause tem
10c60 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20 20 74  pWC;.          t
10c70 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d 20 70  empWC.pParse = p
10c80 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20  WC->pParse;.    
10c90 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70 4d 61        tempWC.pMa
10ca0 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d 61  skSet = pWC->pMa
10cb0 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20 20 20  skSet;.         
10cc0 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54 4b 5f   tempWC.op = TK_
10cd0 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20 20 74  AND;.          t
10ce0 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54 65 72  empWC.a = pOrTer
10cf0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d  m;.          tem
10d00 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b 0a 20  pWC.nTerm = 1;. 
10d10 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e 64           bestInd
10d20 65 78 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70  ex(pParse, &temp
10d30 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
10d40 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c  dy, notValid, 0,
10d50 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20   &sTermCost);.  
10d60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
10d70 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
10d80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10d90 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65     rTotal += sTe
10da0 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20  rmCost.rCost;.  
10db0 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54        nRow += sT
10dc0 65 72 6d 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f  ermCost.plan.nRo
10dd0 77 3b 0a 20 20 20 20 20 20 20 20 75 73 65 64 20  w;.        used 
10de0 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e 75 73 65  |= sTermCost.use
10df0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  d;.        if( r
10e00 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d 3e 72 43  Total>=pCost->rC
10e10 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ost ) break;.   
10e20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
10e30 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
10e40 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
10e50 6e 63 72 65 61 73 65 20 74 68 65 20 73 63 61 6e  ncrease the scan
10e60 20 63 6f 73 74 20 74 6f 20 61 63 63 6f 75 6e 74   cost to account
10e70 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74   .      ** for t
10e80 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20 73  he cost of the s
10e90 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ort. */.      if
10ea0 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 7b  ( pOrderBy!=0 ){
10eb0 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
10ec0 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e  ACE(("... sortin
10ed0 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20 63  g increases OR c
10ee0 6f 73 74 20 25 2e 39 67 20 74 6f 20 25 2e 39 67  ost %.9g to %.9g
10ef0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10f00 20 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 2c           rTotal,
10f10 20 72 54 6f 74 61 6c 2b 6e 52 6f 77 2a 65 73 74   rTotal+nRow*est
10f20 4c 6f 67 28 6e 52 6f 77 29 29 29 3b 0a 20 20 20  Log(nRow)));.   
10f30 20 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e       rTotal += n
10f40 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29  Row*estLog(nRow)
10f50 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10f60 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74 20   /* If the cost 
10f70 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e  of scanning usin
10f80 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20 66  g this OR term f
10f90 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
10fa0 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  is.      ** less
10fb0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
10fc0 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69 6e  t cost stored in
10fd0 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65 20   pCost, replace 
10fe0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
10ff0 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20     ** of pCost. 
11000 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
11010 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d  ACE(("... multi-
11020 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e  index OR cost=%.
11030 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c  9g nrow=%.9g\n",
11040 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b   rTotal, nRow));
11050 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61  .      if( rTota
11060 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  l<pCost->rCost )
11070 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  {.        pCost-
11080 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b  >rCost = rTotal;
11090 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
110a0 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20  used = used;.   
110b0 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
110c0 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20  .nRow = nRow;.  
110d0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
110e0 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66 6c 61 67  n.wsFlags = flag
110f0 73 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  s;.        pCost
11100 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 20 3d  ->plan.u.pTerm =
11110 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   pTerm;.      }.
11120 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
11130 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11140 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
11150 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  */.}..#ifndef SQ
11160 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
11170 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
11180 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
11190 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
111a0 74 65 72 6d 20 70 54 65 72 6d 20 69 73 20 6f 66  term pTerm is of
111b0 20 61 20 66 6f 72 6d 20 77 68 65 72 65 20 69 74   a form where it
111c0 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20 75 73 65  .** could be use
111d0 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
111e0 74 6f 20 61 63 63 65 73 73 20 70 53 72 63 2c 20  to access pSrc, 
111f0 61 73 73 75 6d 69 6e 67 20 61 6e 20 61 70 70 72  assuming an appr
11200 6f 70 72 69 61 74 65 0a 2a 2a 20 69 6e 64 65 78  opriate.** index
11210 20 65 78 69 73 74 65 64 2e 0a 2a 2f 0a 73 74 61   existed..*/.sta
11220 74 69 63 20 69 6e 74 20 74 65 72 6d 43 61 6e 44  tic int termCanD
11230 72 69 76 65 49 6e 64 65 78 28 0a 20 20 57 68 65  riveIndex(.  Whe
11240 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20  reTerm *pTerm,  
11250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
11260 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
11270 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 73   to check */.  s
11280 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
11290 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
112a0 20 54 61 62 6c 65 20 77 65 20 61 72 65 20 74 72   Table we are tr
112b0 79 69 6e 67 20 74 6f 20 61 63 63 65 73 73 20 2a  ying to access *
112c0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
112d0 65 61 64 79 20 20 20 20 20 20 20 20 20 20 20 20  eady            
112e0 20 20 20 2f 2a 20 54 61 62 6c 65 73 20 69 6e 20     /* Tables in 
112f0 6f 75 74 65 72 20 6c 6f 6f 70 73 20 6f 66 20 74  outer loops of t
11300 68 65 20 6a 6f 69 6e 20 2a 2f 0a 29 7b 0a 20 20  he join */.){.  
11310 63 68 61 72 20 61 66 66 3b 0a 20 20 69 66 28 20  char aff;.  if( 
11320 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
11330 72 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72  r!=pSrc->iCursor
11340 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11350 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
11360 74 6f 72 21 3d 57 4f 5f 45 51 20 29 20 72 65 74  tor!=WO_EQ ) ret
11370 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 54  urn 0;.  if( (pT
11380 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
11390 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20   & notReady)!=0 
113a0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 66  ) return 0;.  af
113b0 66 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  f = pSrc->pTab->
113c0 61 43 6f 6c 5b 70 54 65 72 6d 2d 3e 75 2e 6c 65  aCol[pTerm->u.le
113d0 66 74 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  ftColumn].affini
113e0 74 79 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74  ty;.  if( !sqlit
113f0 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f  e3IndexAffinityO
11400 6b 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20  k(pTerm->pExpr, 
11410 61 66 66 29 20 29 20 72 65 74 75 72 6e 20 30 3b  aff) ) return 0;
11420 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23  .  return 1;.}.#
11430 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
11440 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
11450 41 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a  ATIC_INDEX./*.**
11460 20 49 66 20 74 68 65 20 71 75 65 72 79 20 70 6c   If the query pl
11470 61 6e 20 66 6f 72 20 70 53 72 63 20 73 70 65 63  an for pSrc spec
11480 69 66 69 65 64 20 69 6e 20 70 43 6f 73 74 20 69  ified in pCost i
11490 73 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  s a full table s
114a0 63 61 6e 0a 2a 2a 20 61 6e 64 20 69 6e 64 65 78  can.** and index
114b0 69 6e 67 20 69 73 20 61 6c 6c 6f 77 73 20 28 69  ing is allows (i
114c0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4e 4f  f there is no NO
114d0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
114e0 29 20 61 6e 64 20 69 74 0a 2a 2a 20 70 6f 73 73  ) and it.** poss
114f0 69 62 6c 65 20 74 6f 20 63 6f 6e 73 74 72 75 63  ible to construc
11500 74 20 61 20 74 72 61 6e 73 69 65 6e 74 20 69 6e  t a transient in
11510 64 65 78 20 74 68 61 74 20 77 6f 75 6c 64 20 70  dex that would p
11520 65 72 66 6f 72 6d 20 62 65 74 74 65 72 0a 2a 2a  erform better.**
11530 20 74 68 61 6e 20 61 20 66 75 6c 6c 20 74 61 62   than a full tab
11540 6c 65 20 73 63 61 6e 20 65 76 65 6e 20 77 68 65  le scan even whe
11550 6e 20 74 68 65 20 63 6f 73 74 20 6f 66 20 63 6f  n the cost of co
11560 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 69  nstructing the i
11570 6e 64 65 78 0a 2a 2a 20 69 73 20 74 61 6b 65 6e  ndex.** is taken
11580 20 69 6e 74 6f 20 61 63 63 6f 75 6e 74 2c 20 74   into account, t
11590 68 65 6e 20 61 6c 74 65 72 20 74 68 65 20 71 75  hen alter the qu
115a0 65 72 79 20 70 6c 61 6e 20 74 6f 20 75 73 65 20  ery plan to use 
115b0 74 68 65 0a 2a 2a 20 74 72 61 6e 73 69 65 6e 74  the.** transient
115c0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
115d0 63 20 76 6f 69 64 20 62 65 73 74 41 75 74 6f 6d  c void bestAutom
115e0 61 74 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72  aticIndex(.  Par
115f0 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
11600 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
11610 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
11620 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
11630 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20   *pWC,          
11640 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
11650 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
11660 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
11670 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f  Src,  /* The FRO
11680 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
11690 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
116a0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
116b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
116c0 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
116d0 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
116e0 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73  le */.  WhereCos
116f0 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20  t *pCost        
11700 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f      /* Lowest co
11710 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f  st query plan */
11720 0a 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6e 54 61  .){.  double nTa
11730 62 6c 65 52 6f 77 3b 20 20 20 20 20 20 20 20 20  bleRow;         
11740 20 20 2f 2a 20 52 6f 77 73 20 69 6e 20 74 68 65    /* Rows in the
11750 20 69 6e 70 75 74 20 74 61 62 6c 65 20 2a 2f 0a   input table */.
11760 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 3b 20 20    double logN;  
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11780 20 6c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29 20   log(nTableRow) 
11790 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74  */.  double cost
117a0 54 65 6d 70 49 64 78 3b 20 20 20 20 20 20 20 20  TempIdx;        
117b0 20 2f 2a 20 70 65 72 2d 71 75 65 72 79 20 63 6f   /* per-query co
117c0 73 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 69  st of the transi
117d0 65 6e 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57  ent index */.  W
117e0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
117f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
11800 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
11810 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
11820 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
11830 70 57 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20  pWCEnd;         
11840 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
11850 61 5b 5d 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  a[] */.  Table *
11860 70 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20  pTable;         
11870 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 68       /* Table th
11880 74 20 6d 69 67 68 74 20 62 65 20 69 6e 64 65 78  t might be index
11890 65 64 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  ed */..  if( pPa
118a0 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3c  rse->nQueryLoop<
118b0 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20 20  =(double)1 ){.  
118c0 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f    /* There is no
118d0 20 70 6f 69 6e 74 20 69 6e 20 62 75 69 6c 64 69   point in buildi
118e0 6e 67 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  ng an automatic 
118f0 69 6e 64 65 78 20 66 6f 72 20 61 20 73 69 6e 67  index for a sing
11900 6c 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72  le scan */.    r
11910 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
11920 20 28 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c   (pParse->db->fl
11930 61 67 73 20 26 20 53 51 4c 49 54 45 5f 41 75 74  ags & SQLITE_Aut
11940 6f 49 6e 64 65 78 29 3d 3d 30 20 29 7b 0a 20 20  oIndex)==0 ){.  
11950 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63 20 69    /* Automatic i
11960 6e 64 69 63 65 73 20 61 72 65 20 64 69 73 61 62  ndices are disab
11970 6c 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65 20  led at run-time 
11980 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11990 20 7d 0a 20 20 69 66 28 20 28 70 43 6f 73 74 2d   }.  if( (pCost-
119a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
119b0 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
119c0 41 4e 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  AN)!=0 ){.    /*
119d0 20 57 65 20 61 6c 72 65 61 64 79 20 68 61 76 65   We already have
119e0 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 69 6e   some kind of in
119f0 64 65 78 20 69 6e 20 75 73 65 20 66 6f 72 20 74  dex in use for t
11a00 68 69 73 20 71 75 65 72 79 2e 20 2a 2f 0a 20 20  his query. */.  
11a10 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
11a20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
11a30 65 78 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54  exed ){.    /* T
11a40 68 65 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  he NOT INDEXED c
11a50 6c 61 75 73 65 20 61 70 70 65 61 72 73 20 69 6e  lause appears in
11a60 20 74 68 65 20 53 51 4c 2e 20 2a 2f 0a 20 20 20   the SQL. */.   
11a70 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
11a80 66 28 20 70 53 72 63 2d 3e 69 73 43 6f 72 72 65  f( pSrc->isCorre
11a90 6c 61 74 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  lated ){.    /* 
11aa0 54 68 65 20 73 6f 75 72 63 65 20 69 73 20 61 20  The source is a 
11ab0 63 6f 72 72 65 6c 61 74 65 64 20 73 75 62 2d 71  correlated sub-q
11ac0 75 65 72 79 2e 20 4e 6f 20 70 6f 69 6e 74 20 69  uery. No point i
11ad0 6e 20 69 6e 64 65 78 69 6e 67 20 69 74 2e 20 2a  n indexing it. *
11ae0 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
11af0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  }..  assert( pPa
11b00 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20  rse->nQueryLoop 
11b10 3e 3d 20 28 64 6f 75 62 6c 65 29 31 20 29 3b 0a  >= (double)1 );.
11b20 20 20 70 54 61 62 6c 65 20 3d 20 70 53 72 63 2d    pTable = pSrc-
11b30 3e 70 54 61 62 3b 0a 20 20 6e 54 61 62 6c 65 52  >pTab;.  nTableR
11b40 6f 77 20 3d 20 70 54 61 62 6c 65 2d 3e 6e 52 6f  ow = pTable->nRo
11b50 77 45 73 74 3b 0a 20 20 6c 6f 67 4e 20 3d 20 65  wEst;.  logN = e
11b60 73 74 4c 6f 67 28 6e 54 61 62 6c 65 52 6f 77 29  stLog(nTableRow)
11b70 3b 0a 20 20 63 6f 73 74 54 65 6d 70 49 64 78 20  ;.  costTempIdx 
11b80 3d 20 32 2a 6c 6f 67 4e 2a 28 6e 54 61 62 6c 65  = 2*logN*(nTable
11b90 52 6f 77 2f 70 50 61 72 73 65 2d 3e 6e 51 75 65  Row/pParse->nQue
11ba0 72 79 4c 6f 6f 70 20 2b 20 31 29 3b 0a 20 20 69  ryLoop + 1);.  i
11bb0 66 28 20 63 6f 73 74 54 65 6d 70 49 64 78 3e 3d  f( costTempIdx>=
11bc0 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a  pCost->rCost ){.
11bd0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20      /* The cost 
11be0 6f 66 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  of creating the 
11bf0 74 72 61 6e 73 69 65 6e 74 20 74 61 62 6c 65 20  transient table 
11c00 77 6f 75 6c 64 20 62 65 20 67 72 65 61 74 65 72  would be greater
11c10 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 64 6f 69   than.    ** doi
11c20 6e 67 20 74 68 65 20 66 75 6c 6c 20 74 61 62 6c  ng the full tabl
11c30 65 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 72 65  e scan */.    re
11c40 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
11c50 53 65 61 72 63 68 20 66 6f 72 20 61 6e 79 20 65  Search for any e
11c60 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73  quality comparis
11c70 6f 6e 20 74 65 72 6d 20 2a 2f 0a 20 20 70 57 43  on term */.  pWC
11c80 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57  End = &pWC->a[pW
11c90 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20 66 6f 72  C->nTerm];.  for
11ca0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
11cb0 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
11cc0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 74  rm++){.    if( t
11cd0 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78  ermCanDriveIndex
11ce0 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e 6f  (pTerm, pSrc, no
11cf0 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20 20  tReady) ){.     
11d00 20 57 48 45 52 45 54 52 41 43 45 28 28 22 61 75   WHERETRACE(("au
11d10 74 6f 2d 69 6e 64 65 78 20 72 65 64 75 63 65 73  to-index reduces
11d20 20 63 6f 73 74 20 66 72 6f 6d 20 25 2e 31 66 20   cost from %.1f 
11d30 74 6f 20 25 2e 31 66 5c 6e 22 2c 0a 20 20 20 20  to %.1f\n",.    
11d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d50 70 43 6f 73 74 2d 3e 72 43 6f 73 74 2c 20 63 6f  pCost->rCost, co
11d60 73 74 54 65 6d 70 49 64 78 29 29 3b 0a 20 20 20  stTempIdx));.   
11d70 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
11d80 3d 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 0a 20  = costTempIdx;. 
11d90 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
11da0 2e 6e 52 6f 77 20 3d 20 6c 6f 67 4e 20 2b 20 31  .nRow = logN + 1
11db0 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70  ;.      pCost->p
11dc0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48  lan.wsFlags = WH
11dd0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 3b 0a  ERE_TEMP_INDEX;.
11de0 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65        pCost->use
11df0 64 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72 65  d = pTerm->prere
11e00 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 62 72  qRight;.      br
11e10 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
11e20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
11e30 62 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64  bestAutomaticInd
11e40 65 78 28 41 2c 42 2c 43 2c 44 2c 45 29 20 20 2f  ex(A,B,C,D,E)  /
11e50 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64 69  * no-op */.#endi
11e60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
11e70 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
11e80 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51   */...#ifndef SQ
11e90 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41  LITE_OMIT_AUTOMA
11ea0 54 49 43 5f 49 4e 44 45 58 0a 2f 2a 0a 2a 2a 20  TIC_INDEX./*.** 
11eb0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
11ec0 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49   construct the I
11ed0 6e 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20  ndex object for 
11ee0 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64  an automatic ind
11ef0 65 78 0a 2a 2a 20 61 6e 64 20 74 6f 20 73 65 74  ex.** and to set
11f00 20 75 70 20 74 68 65 20 57 68 65 72 65 4c 65 76   up the WhereLev
11f10 65 6c 20 6f 62 6a 65 63 74 20 70 4c 65 76 65 6c  el object pLevel
11f20 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 6f 64   so that the cod
11f30 65 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 6d  e generator.** m
11f40 61 6b 65 73 20 75 73 65 20 6f 66 20 74 68 65 20  akes use of the 
11f50 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 2e  automatic index.
11f60 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11f70 63 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74  constructAutomat
11f80 69 63 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  icIndex(.  Parse
11f90 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11fa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
11fb0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
11fc0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
11fd0 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
11fe0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
11ff0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
12000 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
12010 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
12020 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 67  clause term to g
12030 65 74 20 74 68 65 20 6e 65 78 74 20 69 6e 64 65  et the next inde
12040 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
12050 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
12060 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
12070 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
12080 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
12090 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
120a0 65 76 65 6c 20 20 20 20 20 20 20 20 20 20 2f 2a  evel          /*
120b0 20 57 72 69 74 65 20 6e 65 77 20 69 6e 64 65 78   Write new index
120c0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
120d0 74 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t nColumn;      
120e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
120f0 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
12100 6e 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 65  n the constructe
12110 64 20 69 6e 64 65 78 20 2a 2f 0a 20 20 57 68 65  d index */.  Whe
12120 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
12130 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
12140 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65  ngle term of the
12150 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
12160 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 57  .  WhereTerm *pW
12170 43 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  CEnd;          /
12180 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e 61 5b  * End of pWC->a[
12190 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  ] */.  int nByte
121a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
121b0 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 20 6d 65     /* Byte of me
121c0 6d 6f 72 79 20 6e 65 65 64 65 64 20 66 6f 72 20  mory needed for 
121d0 70 49 64 78 20 2a 2f 0a 20 20 49 6e 64 65 78 20  pIdx */.  Index 
121e0 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
121f0 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
12200 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 74  describing the t
12210 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20 2a  ransient index *
12220 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
12230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12240 2f 2a 20 50 72 65 70 61 72 65 64 20 73 74 61 74  /* Prepared stat
12250 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
12260 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  truction */.  in
12270 74 20 72 65 67 49 73 49 6e 69 74 3b 20 20 20 20  t regIsInit;    
12280 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
12290 69 73 74 65 72 20 73 65 74 20 62 79 20 69 6e 69  ister set by ini
122a0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a 20  tialization */. 
122b0 20 69 6e 74 20 61 64 64 72 49 6e 69 74 3b 20 20   int addrInit;  
122c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
122d0 41 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  Address of the i
122e0 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 62 79  nitialization by
122f0 70 61 73 73 20 6a 75 6d 70 20 2a 2f 0a 20 20 54  pass jump */.  T
12300 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
12310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
12320 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 69 6e  e table being in
12330 64 65 78 65 64 20 2a 2f 0a 20 20 4b 65 79 49 6e  dexed */.  KeyIn
12340 66 6f 20 2a 70 4b 65 79 69 6e 66 6f 3b 20 20 20  fo *pKeyinfo;   
12350 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 20 69 6e         /* Key in
12360 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
12370 65 20 69 6e 64 65 78 20 2a 2f 20 20 20 0a 20 20  e index */   .  
12380 69 6e 74 20 61 64 64 72 54 6f 70 3b 20 20 20 20  int addrTop;    
12390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
123a0 6f 70 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  op of the index 
123b0 66 69 6c 6c 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69  fill loop */.  i
123c0 6e 74 20 72 65 67 52 65 63 6f 72 64 3b 20 20 20  nt regRecord;   
123d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
123e0 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 61  gister holding a
123f0 6e 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  n index record *
12400 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  /.  int n;      
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 2f 2a 20 43 6f 6c 75 6d 6e 20 63 6f 75 6e 74 65  /* Column counte
12430 72 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  r */.  int i;   
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
12460 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 42 69  er */.  int mxBi
12470 74 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tCol;           
12480 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 63      /* Maximum c
12490 6f 6c 75 6d 6e 20 69 6e 20 70 53 72 63 2d 3e 63  olumn in pSrc->c
124a0 6f 6c 55 73 65 64 20 2a 2f 0a 20 20 43 6f 6c 6c  olUsed */.  Coll
124b0 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 20  Seq *pColl;     
124c0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 6c 61          /* Colla
124d0 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 6f  ting sequence to
124e0 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   on a column */.
124f0 20 20 42 69 74 6d 61 73 6b 20 69 64 78 43 6f 6c    Bitmask idxCol
12500 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
12510 20 42 69 74 6d 61 70 20 6f 66 20 63 6f 6c 75 6d   Bitmap of colum
12520 6e 73 20 75 73 65 64 20 66 6f 72 20 69 6e 64 65  ns used for inde
12530 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
12540 6b 20 65 78 74 72 61 43 6f 6c 73 3b 20 20 20 20  k extraCols;    
12550 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20        /* Bitmap 
12560 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
12570 6c 75 6d 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 47  lumns */..  /* G
12580 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
12590 73 6b 69 70 20 6f 76 65 72 20 74 68 65 20 63 72  skip over the cr
125a0 65 61 74 69 6f 6e 20 61 6e 64 20 69 6e 69 74 69  eation and initi
125b0 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68 65  alization of the
125c0 0a 20 20 2a 2a 20 74 72 61 6e 73 69 65 6e 74 20  .  ** transient 
125d0 69 6e 64 65 78 20 6f 6e 20 32 6e 64 20 61 6e 64  index on 2nd and
125e0 20 73 75 62 73 65 71 75 65 6e 74 20 69 74 65 72   subsequent iter
125f0 61 74 69 6f 6e 73 20 6f 66 20 74 68 65 20 6c 6f  ations of the lo
12600 6f 70 2e 20 2a 2f 0a 20 20 76 20 3d 20 70 50 61  op. */.  v = pPa
12610 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
12620 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
12630 72 65 67 49 73 49 6e 69 74 20 3d 20 2b 2b 70 50  regIsInit = ++pP
12640 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 61 64  arse->nMem;.  ad
12650 64 72 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33  drInit = sqlite3
12660 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
12670 5f 4f 6e 63 65 2c 20 72 65 67 49 73 49 6e 69 74  _Once, regIsInit
12680 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
12690 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
126a0 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
126b0 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69  e added to the i
126c0 6e 64 65 78 0a 20 20 2a 2a 20 61 6e 64 20 75 73  ndex.  ** and us
126d0 65 64 20 74 6f 20 6d 61 74 63 68 20 57 48 45 52  ed to match WHER
126e0 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61  E clause constra
126f0 69 6e 74 73 20 2a 2f 0a 20 20 6e 43 6f 6c 75 6d  ints */.  nColum
12700 6e 20 3d 20 30 3b 0a 20 20 70 54 61 62 6c 65 20  n = 0;.  pTable 
12710 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
12720 70 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61  pWCEnd = &pWC->a
12730 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  [pWC->nTerm];.  
12740 69 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66  idxCols = 0;.  f
12750 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b  or(pTerm=pWC->a;
12760 20 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70   pTerm<pWCEnd; p
12770 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28  Term++){.    if(
12780 20 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64   termCanDriveInd
12790 65 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20  ex(pTerm, pSrc, 
127a0 6e 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20  notReady) ){.   
127b0 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54     int iCol = pT
127c0 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
127d0 6e 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  n;.      Bitmask
127e0 20 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42   cMask = iCol>=B
127f0 4d 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31  MS ? ((Bitmask)1
12800 29 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42  )<<(BMS-1) : ((B
12810 69 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b  itmask)1)<<iCol;
12820 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
12830 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20   iCol==BMS );.  
12840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
12850 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20  ol==BMS-1 );.   
12860 20 20 20 69 66 28 20 28 69 64 78 43 6f 6c 73 20     if( (idxCols 
12870 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  & cMask)==0 ){. 
12880 20 20 20 20 20 20 20 6e 43 6f 6c 75 6d 6e 2b 2b         nColumn++
12890 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f 6c  ;.        idxCol
128a0 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20 20  s |= cMask;.    
128b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
128c0 61 73 73 65 72 74 28 20 6e 43 6f 6c 75 6d 6e 3e  assert( nColumn>
128d0 30 20 29 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70  0 );.  pLevel->p
128e0 6c 61 6e 2e 6e 45 71 20 3d 20 6e 43 6f 6c 75 6d  lan.nEq = nColum
128f0 6e 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  n;..  /* Count t
12900 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 64 64  he number of add
12910 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20  itional columns 
12920 6e 65 65 64 65 64 20 74 6f 20 63 72 65 61 74 65  needed to create
12930 20 61 0a 20 20 2a 2a 20 63 6f 76 65 72 69 6e 67   a.  ** covering
12940 20 69 6e 64 65 78 2e 20 20 41 20 22 63 6f 76 65   index.  A "cove
12950 72 69 6e 67 20 69 6e 64 65 78 22 20 69 73 20 61  ring index" is a
12960 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  n index that con
12970 74 61 69 6e 73 20 61 6c 6c 0a 20 20 2a 2a 20 63  tains all.  ** c
12980 6f 6c 75 6d 6e 73 20 74 68 61 74 20 61 72 65 20  olumns that are 
12990 6e 65 65 64 65 64 20 62 79 20 74 68 65 20 71 75  needed by the qu
129a0 65 72 79 2e 20 20 57 69 74 68 20 61 20 63 6f 76  ery.  With a cov
129b0 65 72 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65  ering index, the
129c0 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74  .  ** original t
129d0 61 62 6c 65 20 6e 65 76 65 72 20 6e 65 65 64 73  able never needs
129e0 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e   to be accessed.
129f0 20 20 41 75 74 6f 6d 61 74 69 63 20 69 6e 64 69    Automatic indi
12a00 63 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ces must.  ** be
12a10 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
12a20 78 20 62 65 63 61 75 73 65 20 74 68 65 20 69 6e  x because the in
12a30 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  dex will not be 
12a40 75 70 64 61 74 65 64 20 69 66 20 74 68 65 0a 20  updated if the. 
12a50 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 74 61 62   ** original tab
12a60 6c 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 74  le changes and t
12a70 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 61 62  he index and tab
12a80 6c 65 20 63 61 6e 6e 6f 74 20 62 6f 74 68 20 62  le cannot both b
12a90 65 20 75 73 65 64 0a 20 20 2a 2a 20 69 66 20 74  e used.  ** if t
12aa0 68 65 79 20 67 6f 20 6f 75 74 20 6f 66 20 73 79  hey go out of sy
12ab0 6e 63 2e 0a 20 20 2a 2f 0a 20 20 65 78 74 72 61  nc..  */.  extra
12ac0 43 6f 6c 73 20 3d 20 70 53 72 63 2d 3e 63 6f 6c  Cols = pSrc->col
12ad0 55 73 65 64 20 26 20 28 7e 69 64 78 43 6f 6c 73  Used & (~idxCols
12ae0 20 7c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   | (((Bitmask)1)
12af0 3c 3c 28 42 4d 53 2d 31 29 29 29 3b 0a 20 20 6d  <<(BMS-1)));.  m
12b00 78 42 69 74 43 6f 6c 20 3d 20 28 70 54 61 62 6c  xBitCol = (pTabl
12b10 65 2d 3e 6e 43 6f 6c 20 3e 3d 20 42 4d 53 2d 31  e->nCol >= BMS-1
12b20 29 20 3f 20 42 4d 53 2d 31 20 3a 20 70 54 61 62  ) ? BMS-1 : pTab
12b30 6c 65 2d 3e 6e 43 6f 6c 3b 0a 20 20 74 65 73 74  le->nCol;.  test
12b40 63 61 73 65 28 20 70 54 61 62 6c 65 2d 3e 6e 43  case( pTable->nC
12b50 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 74  ol==BMS-1 );.  t
12b60 65 73 74 63 61 73 65 28 20 70 54 61 62 6c 65 2d  estcase( pTable-
12b70 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 32 20 29 3b 0a  >nCol==BMS-2 );.
12b80 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
12b90 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
12ba0 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
12bb0 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
12bc0 69 29 20 29 20 6e 43 6f 6c 75 6d 6e 2b 2b 3b 0a  i) ) nColumn++;.
12bd0 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
12be0 63 6f 6c 55 73 65 64 20 26 20 28 28 28 42 69 74  colUsed & (((Bit
12bf0 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
12c00 29 20 29 7b 0a 20 20 20 20 6e 43 6f 6c 75 6d 6e  ) ){.    nColumn
12c10 20 2b 3d 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c   += pTable->nCol
12c20 20 2d 20 42 4d 53 20 2b 20 31 3b 0a 20 20 7d 0a   - BMS + 1;.  }.
12c30 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77    pLevel->plan.w
12c40 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f  sFlags |= WHERE_
12c50 43 4f 4c 55 4d 4e 5f 45 51 20 7c 20 57 48 45 52  COLUMN_EQ | WHER
12c60 45 5f 49 44 58 5f 4f 4e 4c 59 20 7c 20 57 4f 5f  E_IDX_ONLY | WO_
12c70 45 51 3b 0a 0a 20 20 2f 2a 20 43 6f 6e 73 74 72  EQ;..  /* Constr
12c80 75 63 74 20 74 68 65 20 49 6e 64 65 78 20 6f 62  uct the Index ob
12c90 6a 65 63 74 20 74 6f 20 64 65 73 63 72 69 62 65  ject to describe
12ca0 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f 0a 20   this index */. 
12cb0 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
12cc0 49 6e 64 65 78 29 3b 0a 20 20 6e 42 79 74 65 20  Index);.  nByte 
12cd0 2b 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f  += nColumn*sizeo
12ce0 66 28 69 6e 74 29 3b 20 20 20 20 20 2f 2a 20 49  f(int);     /* I
12cf0 6e 64 65 78 2e 61 69 43 6f 6c 75 6d 6e 20 2a 2f  ndex.aiColumn */
12d00 0a 20 20 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c  .  nByte += nCol
12d10 75 6d 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 2a  umn*sizeof(char*
12d20 29 3b 20 20 20 2f 2a 20 49 6e 64 65 78 2e 61 7a  );   /* Index.az
12d30 43 6f 6c 6c 20 2a 2f 0a 20 20 6e 42 79 74 65 20  Coll */.  nByte 
12d40 2b 3d 20 6e 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  += nColumn;     
12d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12d60 6e 64 65 78 2e 61 53 6f 72 74 4f 72 64 65 72 20  ndex.aSortOrder 
12d70 2a 2f 0a 20 20 70 49 64 78 20 3d 20 73 71 6c 69  */.  pIdx = sqli
12d80 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
12d90 70 50 61 72 73 65 2d 3e 64 62 2c 20 6e 42 79 74  pParse->db, nByt
12da0 65 29 3b 0a 20 20 69 66 28 20 70 49 64 78 3d 3d  e);.  if( pIdx==
12db0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4c  0 ) return;.  pL
12dc0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
12dd0 78 20 3d 20 70 49 64 78 3b 0a 20 20 70 49 64 78  x = pIdx;.  pIdx
12de0 2d 3e 61 7a 43 6f 6c 6c 20 3d 20 28 63 68 61 72  ->azColl = (char
12df0 2a 2a 29 26 70 49 64 78 5b 31 5d 3b 0a 20 20 70  **)&pIdx[1];.  p
12e00 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 20 3d 20  Idx->aiColumn = 
12e10 28 69 6e 74 2a 29 26 70 49 64 78 2d 3e 61 7a 43  (int*)&pIdx->azC
12e20 6f 6c 6c 5b 6e 43 6f 6c 75 6d 6e 5d 3b 0a 20 20  oll[nColumn];.  
12e30 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
12e40 20 3d 20 28 75 38 2a 29 26 70 49 64 78 2d 3e 61   = (u8*)&pIdx->a
12e50 69 43 6f 6c 75 6d 6e 5b 6e 43 6f 6c 75 6d 6e 5d  iColumn[nColumn]
12e60 3b 0a 20 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  ;.  pIdx->zName 
12e70 3d 20 22 61 75 74 6f 2d 69 6e 64 65 78 22 3b 0a  = "auto-index";.
12e80 20 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20    pIdx->nColumn 
12e90 3d 20 6e 43 6f 6c 75 6d 6e 3b 0a 20 20 70 49 64  = nColumn;.  pId
12ea0 78 2d 3e 70 54 61 62 6c 65 20 3d 20 70 54 61 62  x->pTable = pTab
12eb0 6c 65 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69  le;.  n = 0;.  i
12ec0 64 78 43 6f 6c 73 20 3d 20 30 3b 0a 20 20 66 6f  dxCols = 0;.  fo
12ed0 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20  r(pTerm=pWC->a; 
12ee0 70 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54  pTerm<pWCEnd; pT
12ef0 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
12f00 74 65 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65  termCanDriveInde
12f10 78 28 70 54 65 72 6d 2c 20 70 53 72 63 2c 20 6e  x(pTerm, pSrc, n
12f20 6f 74 52 65 61 64 79 29 20 29 7b 0a 20 20 20 20  otReady) ){.    
12f30 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 54 65    int iCol = pTe
12f40 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
12f50 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
12f60 63 4d 61 73 6b 20 3d 20 69 43 6f 6c 3e 3d 42 4d  cMask = iCol>=BM
12f70 53 20 3f 20 28 28 42 69 74 6d 61 73 6b 29 31 29  S ? ((Bitmask)1)
12f80 3c 3c 28 42 4d 53 2d 31 29 20 3a 20 28 28 42 69  <<(BMS-1) : ((Bi
12f90 74 6d 61 73 6b 29 31 29 3c 3c 69 43 6f 6c 3b 0a  tmask)1)<<iCol;.
12fa0 20 20 20 20 20 20 69 66 28 20 28 69 64 78 43 6f        if( (idxCo
12fb0 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d 30 20 29  ls & cMask)==0 )
12fc0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
12fd0 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
12fe0 72 3b 0a 20 20 20 20 20 20 20 20 69 64 78 43 6f  r;.        idxCo
12ff0 6c 73 20 7c 3d 20 63 4d 61 73 6b 3b 0a 20 20 20  ls |= cMask;.   
13000 20 20 20 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c       pIdx->aiCol
13010 75 6d 6e 5b 6e 5d 20 3d 20 70 54 65 72 6d 2d 3e  umn[n] = pTerm->
13020 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  u.leftColumn;.  
13030 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
13040 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61  lite3BinaryCompa
13050 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
13060 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58 2d  , pX->pLeft, pX-
13070 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
13080 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e    pIdx->azColl[n
13090 5d 20 3d 20 41 4c 57 41 59 53 28 70 43 6f 6c 6c  ] = ALWAYS(pColl
130a0 29 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  ) ? pColl->zName
130b0 20 3a 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20   : "BINARY";.   
130c0 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
130d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  }.    }.  }.  as
130e0 73 65 72 74 28 20 28 75 33 32 29 6e 3d 3d 70 4c  sert( (u32)n==pL
130f0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 29  evel->plan.nEq )
13100 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 64 64 69  ;..  /* Add addi
13110 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 6e  tional columns n
13120 65 65 64 65 64 20 74 6f 20 6d 61 6b 65 20 74 68  eeded to make th
13130 65 20 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65  e automatic inde
13140 78 20 69 6e 74 6f 0a 20 20 2a 2a 20 61 20 63 6f  x into.  ** a co
13150 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
13160 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6d 78 42    for(i=0; i<mxB
13170 69 74 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  itCol; i++){.   
13180 20 69 66 28 20 65 78 74 72 61 43 6f 6c 73 20 26   if( extraCols &
13190 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c   (((Bitmask)1)<<
131a0 69 29 20 29 7b 0a 20 20 20 20 20 20 70 49 64 78  i) ){.      pIdx
131b0 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20  ->aiColumn[n] = 
131c0 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61  i;.      pIdx->a
131d0 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41  zColl[n] = "BINA
131e0 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a  RY";.      n++;.
131f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13200 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
13210 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
13220 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 66  BMS-1)) ){.    f
13230 6f 72 28 69 3d 42 4d 53 2d 31 3b 20 69 3c 70 54  or(i=BMS-1; i<pT
13240 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  able->nCol; i++)
13250 7b 0a 20 20 20 20 20 20 70 49 64 78 2d 3e 61 69  {.      pIdx->ai
13260 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 69 3b 0a 20  Column[n] = i;. 
13270 20 20 20 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c       pIdx->azCol
13280 6c 5b 6e 5d 20 3d 20 22 42 49 4e 41 52 59 22 3b  l[n] = "BINARY";
13290 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
132a0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
132b0 6e 3d 3d 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 0a 20  n==nColumn );.. 
132c0 20 2f 2a 20 43 72 65 61 74 65 20 74 68 65 20 61   /* Create the a
132d0 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20 2a  utomatic index *
132e0 2f 0a 20 20 70 4b 65 79 69 6e 66 6f 20 3d 20 73  /.  pKeyinfo = s
132f0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
13300 66 6f 28 70 50 61 72 73 65 2c 20 70 49 64 78 29  fo(pParse, pIdx)
13310 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76  ;.  assert( pLev
13320 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
13330 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
13340 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp4(v, OP_Open
13350 41 75 74 6f 69 6e 64 65 78 2c 20 70 4c 65 76 65  Autoindex, pLeve
13360 6c 2d 3e 69 49 64 78 43 75 72 2c 20 6e 43 6f 6c  l->iIdxCur, nCol
13370 75 6d 6e 2b 31 2c 20 30 2c 0a 20 20 20 20 20 20  umn+1, 0,.      
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
13390 68 61 72 2a 29 70 4b 65 79 69 6e 66 6f 2c 20 50  har*)pKeyinfo, P
133a0 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  4_KEYINFO_HANDOF
133b0 46 29 3b 0a 20 20 56 64 62 65 43 6f 6d 6d 65 6e  F);.  VdbeCommen
133c0 74 28 28 76 2c 20 22 66 6f 72 20 25 73 22 2c 20  t((v, "for %s", 
133d0 70 54 61 62 6c 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pTable->zName));
133e0 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 74 68 65 20  ..  /* Fill the 
133f0 61 75 74 6f 6d 61 74 69 63 20 69 6e 64 65 78 20  automatic index 
13400 77 69 74 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a  with content */.
13410 20 20 61 64 64 72 54 6f 70 20 3d 20 73 71 6c 69    addrTop = sqli
13420 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
13430 20 4f 50 5f 52 65 77 69 6e 64 2c 20 70 4c 65 76   OP_Rewind, pLev
13440 65 6c 2d 3e 69 54 61 62 43 75 72 29 3b 0a 20 20  el->iTabCur);.  
13450 72 65 67 52 65 63 6f 72 64 20 3d 20 73 71 6c 69  regRecord = sqli
13460 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
13470 61 72 73 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  arse);.  sqlite3
13480 47 65 6e 65 72 61 74 65 49 6e 64 65 78 4b 65 79  GenerateIndexKey
13490 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70  (pParse, pIdx, p
134a0 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 2c 20  Level->iTabCur, 
134b0 72 65 67 52 65 63 6f 72 64 2c 20 31 29 3b 0a 20  regRecord, 1);. 
134c0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
134d0 70 32 28 76 2c 20 4f 50 5f 49 64 78 49 6e 73 65  p2(v, OP_IdxInse
134e0 72 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  rt, pLevel->iIdx
134f0 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 29 3b  Cur, regRecord);
13500 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
13510 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c 41 47  angeP5(v, OPFLAG
13520 5f 55 53 45 53 45 45 4b 52 45 53 55 4c 54 29 3b  _USESEEKRESULT);
13530 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
13540 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c  dOp2(v, OP_Next,
13550 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
13560 2c 20 61 64 64 72 54 6f 70 2b 31 29 3b 0a 20 20  , addrTop+1);.  
13570 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
13580 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f 53 54  eP5(v, SQLITE_ST
13590 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
135a0 45 58 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  EX);.  sqlite3Vd
135b0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
135c0 64 72 54 6f 70 29 3b 0a 20 20 73 71 6c 69 74 65  drTop);.  sqlite
135d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
135e0 70 50 61 72 73 65 2c 20 72 65 67 52 65 63 6f 72  pParse, regRecor
135f0 64 29 3b 0a 20 20 0a 20 20 2f 2a 20 4a 75 6d 70  d);.  .  /* Jump
13600 20 68 65 72 65 20 77 68 65 6e 20 73 6b 69 70 70   here when skipp
13610 69 6e 67 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ing the initiali
13620 7a 61 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69  zation */.  sqli
13630 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
13640 76 2c 20 61 64 64 72 49 6e 69 74 29 3b 0a 7d 0a  v, addrInit);.}.
13650 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13660 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43 5f  _OMIT_AUTOMATIC_
13670 49 4e 44 45 58 20 2a 2f 0a 0a 23 69 66 6e 64 65  INDEX */..#ifnde
13680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
13690 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
136a0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f   Allocate and po
136b0 70 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65  pulate an sqlite
136c0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
136d0 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68  ucture. It is th
136e0 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69  e .** responsibi
136f0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
13700 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
13710 20 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72   release the str
13720 75 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73  ucture.** by pas
13730 73 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72  sing the pointer
13740 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
13750 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71  s function to sq
13760 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
13770 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
13780 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f  index_info *allo
13790 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20  cateIndexInfo(. 
137a0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
137b0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
137c0 70 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72  pWC,.  struct Sr
137d0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
137e0 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  ,.  ExprList *pO
137f0 72 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20  rderBy.){.  int 
13800 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72  i, j;.  int nTer
13810 6d 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  m;.  struct sqli
13820 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
13830 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a  aint *pIdxCons;.
13840 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
13850 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a  _index_orderby *
13860 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73  pIdxOrderBy;.  s
13870 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
13880 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75  dex_constraint_u
13890 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20  sage *pUsage;.  
138a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
138b0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
138c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ;.  sqlite3_inde
138d0 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f  x_info *pIdxInfo
138e0 3b 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28  ;..  WHERETRACE(
138f0 28 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e  ("Recomputing in
13900 64 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e  dex info for %s.
13910 2e 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  ..\n", pSrc->pTa
13920 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f  b->zName));..  /
13930 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
13940 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
13950 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
13960 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
13970 67 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76  g.  ** to this v
13980 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
13990 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c    for(i=nTerm=0,
139a0 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
139b0 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
139c0 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
139d0 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
139e0 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
139f0 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
13a00 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
13a10 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
13a20 26 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  &(pTerm->eOperat
13a30 6f 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  or-1))==0 );.   
13a40 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
13a50 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
13a60 49 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IN );.    testca
13a70 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  se( pTerm->eOper
13a80 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20  ator==WO_ISNULL 
13a90 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  );.    if( pTerm
13aa0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
13ab0 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_IN|WO_ISNULL) 
13ac0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13ad0 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
13ae0 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c 20  gs & TERM_VNULL 
13af0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
13b00 6e 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  nTerm++;.  }..  
13b10 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
13b20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
13b30 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
13b40 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
13b50 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62    ** virtual tab
13b60 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  le then allocate
13b70 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61   space for the a
13b80 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a  OrderBy part of.
13b90 20 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33    ** the sqlite3
13ba0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13bb0 63 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  cture..  */.  nO
13bc0 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66  rderBy = 0;.  if
13bd0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
13be0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72    for(i=0; i<pOr
13bf0 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
13c00 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
13c10 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
13c20 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
13c30 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
13c40 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
13c50 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
13c60 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
13c70 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
13c80 69 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d  if( i==pOrderBy-
13c90 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
13ca0 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65  nOrderBy = pOrde
13cb0 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  rBy->nExpr;.    
13cc0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  }.  }..  /* Allo
13cd0 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33  cate the sqlite3
13ce0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
13cf0 63 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64  cture.  */.  pId
13d00 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44  xInfo = sqlite3D
13d10 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72  bMallocZero(pPar
13d20 73 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a  se->db, sizeof(*
13d30 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20  pIdxInfo).      
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
13d60 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
13d70 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
13d80 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
13da0 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65  sizeof(*pIdxOrde
13db0 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b  rBy)*nOrderBy );
13dc0 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
13dd0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
13de0 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
13df0 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
13e00 22 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62  ");.    /* (doub
13e10 6c 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20  le)0 In case of 
13e20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41  SQLITE_OMIT_FLOA
13e30 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f  TING_POINT... */
13e40 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13e50 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
13e60 69 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72  ize the structur
13e70 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  e.  The sqlite3_
13e80 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
13e90 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20  ture contains.  
13ea0 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74  ** many fields t
13eb0 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64  hat are declared
13ec0 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76   "const" to prev
13ed0 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66  ent xBestIndex f
13ee0 72 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e  rom.  ** changin
13ef0 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
13f00 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
13f10 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
13f20 65 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69  er to.  ** initi
13f30 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c  alize those fiel
13f40 64 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  ds..  */.  pIdxC
13f50 6f 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71  ons = (struct sq
13f60 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
13f70 74 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66  traint*)&pIdxInf
13f80 6f 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65  o[1];.  pIdxOrde
13f90 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71  rBy = (struct sq
13fa0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
13fb0 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e  rby*)&pIdxCons[n
13fc0 54 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20  Term];.  pUsage 
13fd0 3d 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65  = (struct sqlite
13fe0 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
13ff0 6e 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f  nt_usage*)&pIdxO
14000 72 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d  rderBy[nOrderBy]
14010 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
14020 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
14030 74 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69  t = nTerm;.  *(i
14040 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
14050 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72  OrderBy = nOrder
14060 42 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  By;.  *(struct s
14070 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
14080 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
14090 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
140a0 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a   = pIdxCons;.  *
140b0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
140c0 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29  index_orderby**)
140d0 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65  &pIdxInfo->aOrde
140e0 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42  rBy = pIdxOrderB
140f0 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
14100 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
14110 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26  traint_usage**)&
14120 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
14130 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20  raintUsage =.   
14140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 70 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69  pUsage;..  for(i
14190 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d  =j=0, pTerm=pWC-
141a0 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d  >a; i<pWC->nTerm
141b0 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; i++, pTerm++){
141c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
141d0 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
141e0 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
141f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
14200 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65  rt( (pTerm->eOpe
14210 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f  rator&(pTerm->eO
14220 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29  perator-1))==0 )
14230 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
14240 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14250 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74  ==WO_IN );.    t
14260 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
14270 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
14280 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
14290 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
142a0 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e   & (WO_IN|WO_ISN
142b0 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ULL) ) continue;
142c0 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
142d0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
142e0 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
142f0 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14300 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
14310 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  ->u.leftColumn;.
14320 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
14330 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
14340 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d  .    pIdxCons[j]
14350 2e 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d  .op = (u8)pTerm-
14360 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
14370 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
14380 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
14390 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
143a0 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
143b0 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
143c0 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45  e WO_ and SQLITE
143d0 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
143e0 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65  T_ codes are ide
143f0 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  ntical.  The.   
14400 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73   ** following as
14410 73 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69  serts verify thi
14420 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61  s fact. */.    a
14430 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
14440 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
14450 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
14460 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53  assert( WO_LT==S
14470 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
14480 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20  TRAINT_LT );.   
14490 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d   assert( WO_LE==
144a0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
144b0 53 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20  STRAINT_LE );.  
144c0 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
144d0 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
144e0 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
144f0 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45     assert( WO_GE
14500 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43  ==SQLITE_INDEX_C
14510 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a  ONSTRAINT_GE );.
14520 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
14530 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
14540 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
14550 54 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72  TCH );.    asser
14560 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  t( pTerm->eOpera
14570 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
14580 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57  LT|WO_LE|WO_GT|W
14590 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29  O_GE|WO_MATCH) )
145a0 3b 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    j++;.  }. 
145b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64   for(i=0; i<nOrd
145c0 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  erBy; i++){.    
145d0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
145e0 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
145f0 70 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65  pr;.    pIdxOrde
14600 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
14610 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
14620 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79  .    pIdxOrderBy
14630 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65  [i].desc = pOrde
14640 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72  rBy->a[i].sortOr
14650 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  der;.  }..  retu
14660 72 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a  rn pIdxInfo;.}..
14670 2f 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20  /*.** The table 
14680 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65  object reference
14690 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
146a0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
146b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  o this function.
146c0 2a 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e  ** must represen
146d0 74 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  t a virtual tabl
146e0 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
146f0 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65   invokes the xBe
14700 73 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74  stIndex().** met
14710 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
14720 61 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  al table with th
14730 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14740 69 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73  info pointer pas
14750 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72  sed.** as the ar
14760 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  gument..**.** If
14770 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
14780 2c 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75  , pParse is popu
14790 6c 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  lated with an er
147a0 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20  ror message and 
147b0 61 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  a.** non-zero va
147c0 6c 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  lue is returned.
147d0 20 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73   Otherwise, 0 is
147e0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
147f0 65 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74  e output.** part
14800 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
14810 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14820 74 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70  ture is left pop
14830 75 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68  ulated..**.** Wh
14840 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20  ether or not an 
14850 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
14860 64 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73  d, it is the res
14870 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
14880 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20  he.** caller to 
14890 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20  eventually free 
148a0 70 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e  p->idxStr if p->
148b0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
148c0 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68   indicates.** th
148d0 61 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69  at this is requi
148e0 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  red..*/.static i
148f0 6e 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78  nt vtabBestIndex
14900 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
14910 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c  Table *pTab, sql
14920 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
14930 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  *p){.  sqlite3_v
14940 74 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c  tab *pVtab = sql
14950 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50  ite3GetVTable(pP
14960 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d  arse->db, pTab)-
14970 3e 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b  >pVtab;.  int i;
14980 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 57 48  .  int rc;..  WH
14990 45 52 45 54 52 41 43 45 28 28 22 78 42 65 73 74  ERETRACE(("xBest
149a0 49 6e 64 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c  Index for %s\n",
149b0 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a   pTab->zName));.
149c0 20 20 54 52 41 43 45 5f 49 44 58 5f 49 4e 50 55    TRACE_IDX_INPU
149d0 54 53 28 70 29 3b 0a 20 20 72 63 20 3d 20 70 56  TS(p);.  rc = pV
149e0 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
149f0 65 73 74 49 6e 64 65 78 28 70 56 74 61 62 2c 20  estIndex(pVtab, 
14a00 70 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f  p);.  TRACE_IDX_
14a10 4f 55 54 50 55 54 53 28 70 29 3b 0a 0a 20 20 69  OUTPUTS(p);..  i
14a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14a30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
14a40 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
14a50 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 64 62        pParse->db
14a60 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14a70 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
14a80 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  ( !pVtab->zErrMs
14a90 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  g ){.      sqlit
14aa0 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
14ab0 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
14ac0 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
14ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
14ae0 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
14af0 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56 74 61  arse, "%s", pVta
14b00 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b->zErrMsg);.   
14b10 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
14b20 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
14b30 72 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e  rMsg);.  pVtab->
14b40 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20  zErrMsg = 0;..  
14b50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
14b60 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
14b70 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f  .    if( !p->aCo
14b80 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62  nstraint[i].usab
14b90 6c 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72  le && p->aConstr
14ba0 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67  aintUsage[i].arg
14bb0 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
14bc0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
14bd0 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
14be0 20 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20       "table %s: 
14bf0 78 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72  xBestIndex retur
14c00 6e 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70  ned an invalid p
14c10 6c 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  lan", pTab->zNam
14c20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
14c30 20 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e   return pParse->
14c40 6e 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nErr;.}.../*.** 
14c50 43 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74  Compute the best
14c60 20 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72   index for a vir
14c70 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
14c80 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78  * The best index
14c90 20 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20   is computed by 
14ca0 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
14cb0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72  ethod of the vir
14cc0 74 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f  tual.** table mo
14cd0 64 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74  dule.  This rout
14ce0 69 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75  ine is really ju
14cf0 73 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61  st a wrapper tha
14d00 74 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65  t sets up.** the
14d10 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
14d20 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68  nfo structure th
14d30 61 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  at is used to co
14d40 6d 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a  mmunicate with.*
14d50 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a  * xBestIndex..**
14d60 0a 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74  .** In a join, t
14d70 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68  his routine migh
14d80 74 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74  t be called mult
14d90 69 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74  iple times for t
14da0 68 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75  he.** same virtu
14db0 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73  al table.  The s
14dc0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
14dd0 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  o structure is c
14de0 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e  reated.** and in
14df0 69 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65  itialized on the
14e00 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f   first invocatio
14e10 6e 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20  n and reused on 
14e20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
14e30 2a 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20  * invocations.  
14e40 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
14e50 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
14e60 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68   is also used wh
14e70 65 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65  en.** code is ge
14e80 6e 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73  nerated to acces
14e90 73 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61  s the virtual ta
14ea0 62 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49  ble.  The whereI
14eb0 6e 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20  nfoDelete() .** 
14ec0 72 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61  routine takes ca
14ed0 72 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68  re of freeing th
14ee0 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
14ef0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61  info structure a
14f00 66 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64  fter.** everybod
14f10 79 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77  y has finished w
14f20 69 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ith it..*/.stati
14f30 63 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75  c void bestVirtu
14f40 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
14f50 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
14f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
14f70 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
14f80 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
14f90 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
14fa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
14fb0 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
14fc0 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
14fd0 74 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20  tem *pSrc,      
14fe0 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  /* The FROM clau
14ff0 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63  se term to searc
15000 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
15010 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20  otReady,        
15020 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
15030 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  f cursors not av
15040 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65  ailable for inde
15050 78 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  x */.  Bitmask n
15060 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20 20  otValid,        
15070 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
15080 73 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20  s not valid for 
15090 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a 20  any purpose */. 
150a0 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
150b0 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20 20  rBy,            
150c0 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
150d0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
150e0 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 2c 20 20  reCost *pCost,  
150f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15100 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65 72  Lowest cost quer
15110 79 20 70 6c 61 6e 20 2a 2f 0a 20 20 73 71 6c 69  y plan */.  sqli
15120 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
15130 2a 70 70 49 64 78 49 6e 66 6f 20 20 2f 2a 20 49  *ppIdxInfo  /* I
15140 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ndex information
15150 20 70 61 73 73 65 64 20 74 6f 20 78 42 65 73 74   passed to xBest
15160 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61  Index */.){.  Ta
15170 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53 72 63  ble *pTab = pSrc
15180 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69 74 65  ->pTab;.  sqlite
15190 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
151a0 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  dxInfo;.  struct
151b0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
151c0 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78 43  onstraint *pIdxC
151d0 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73 71  ons;.  struct sq
151e0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
151f0 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55  traint_usage *pU
15200 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72  sage;.  WhereTer
15210 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20  m *pTerm;.  int 
15220 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64  i, j;.  int nOrd
15230 65 72 42 79 3b 0a 20 20 64 6f 75 62 6c 65 20 72  erBy;.  double r
15240 43 6f 73 74 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  Cost;..  /* Make
15250 20 73 75 72 65 20 77 73 46 6c 61 67 73 20 69 73   sure wsFlags is
15260 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
15270 73 6f 6d 65 20 73 61 6e 65 20 76 61 6c 75 65 2e  some sane value.
15280 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
15290 68 65 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20  he .  ** malloc 
152a0 69 6e 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  in allocateIndex
152b0 49 6e 66 6f 28 29 20 66 61 69 6c 73 20 61 6e 64  Info() fails and
152c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
152d0 65 74 75 72 6e 73 20 6c 65 61 76 69 6e 67 0a 20  eturns leaving. 
152e0 20 2a 2a 20 77 73 46 6c 61 67 73 20 69 6e 20 61   ** wsFlags in a
152f0 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
15300 73 74 61 74 65 2c 20 74 68 65 20 63 61 6c 6c 65  state, the calle
15310 72 20 6d 61 79 20 62 65 68 61 76 65 20 75 6e 70  r may behave unp
15320 72 65 64 69 63 74 61 62 6c 79 2e 0a 20 20 2a 2f  redictably..  */
15330 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c  .  memset(pCost,
15340 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73   0, sizeof(*pCos
15350 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70 6c  t));.  pCost->pl
15360 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 57 48 45  an.wsFlags = WHE
15370 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b  RE_VIRTUALTABLE;
15380 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71  ..  /* If the sq
15390 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
153a0 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e   structure has n
153b0 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73  ot been previous
153c0 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  ly.  ** allocate
153d0 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  d and initialize
153e0 64 2c 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65  d, then allocate
153f0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
15400 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70  it now..  */.  p
15410 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78  IdxInfo = *ppIdx
15420 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78  Info;.  if( pIdx
15430 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2a  Info==0 ){.    *
15440 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
15450 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63 61 74 65 49  Info = allocateI
15460 6e 64 65 78 49 6e 66 6f 28 70 50 61 72 73 65 2c  ndexInfo(pParse,
15470 20 70 57 43 2c 20 70 53 72 63 2c 20 70 4f 72 64   pWC, pSrc, pOrd
15480 65 72 42 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  erBy);.  }.  if(
15490 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a   pIdxInfo==0 ){.
154a0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
154b0 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
154c0 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33  int, the sqlite3
154d0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
154e0 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78 49  cture that pIdxI
154f0 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  nfo points.  ** 
15500 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65  to will have bee
15510 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65  n initialized, e
15520 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68 65  ither during the
15530 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74   current invocat
15540 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69  ion or.  ** duri
15550 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e  ng some prior in
15560 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77  vocation.  Now w
15570 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63  e just have to c
15580 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a  ustomize the.  *
15590 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64  * details of pId
155a0 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75  xInfo for the cu
155b0 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
155c0 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a   and pass it to.
155d0 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e    ** xBestIndex.
155e0 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  .  */..  /* The 
155f0 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74  module name must
15600 20 62 65 20 64 65 66 69 6e 65 64 2e 20 41 6c 73   be defined. Als
15610 6f 2c 20 62 79 20 74 68 69 73 20 70 6f 69 6e 74  o, by this point
15620 20 74 68 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a   there must.  **
15630 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
15640 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
15650 20 73 74 72 75 63 74 75 72 65 2e 20 4f 74 68 65   structure. Othe
15660 72 77 69 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74  rwise.  ** sqlit
15670 65 33 56 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e  e3ViewGetColumnN
15680 61 6d 65 73 28 29 20 77 6f 75 6c 64 20 68 61 76  ames() would hav
15690 65 20 70 69 63 6b 65 64 20 75 70 20 74 68 65 20  e picked up the 
156a0 65 72 72 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61  error. .  */.  a
156b0 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
156c0 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
156d0 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
156e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
156f0 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 70  lite3GetVTable(p
15700 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29  Parse->db, pTab)
15710 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68   );..  /* Set th
15720 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e  e aConstraint[].
15730 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61 6e  usable fields an
15740 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c 6c  d initialize all
15750 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76 61   .  ** output va
15760 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f 2e  riables to zero.
15770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73  .  **.  ** aCons
15780 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20  traint[].usable 
15790 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e 73  is true for cons
157a0 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74 68  traints where th
157b0 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20 2a  e right-hand.  *
157c0 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73 20  * side contains 
157d0 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73 20  only references 
157e0 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  to tables to the
157f0 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75 72   left of the cur
15800 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65 2e  rent.  ** table.
15810 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
15820 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72 61  , if the constra
15830 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  int is of the fo
15840 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  rm:.  **.  **   
15850 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 3d          column =
15860 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20   expr.  **.  ** 
15870 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c 75  and we are evalu
15880 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74 68  ating a join, th
15890 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  en the constrain
158a0 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20 0a  t on column is .
158b0 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64 20    ** only valid 
158c0 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72 65  if all tables re
158d0 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70 72  ferenced in expr
158e0 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c 65   occur to the le
158f0 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 74  ft.  ** of the t
15900 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
15910 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a  column..  **.  *
15920 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  * The aConstrain
15930 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74 61  ts[] array conta
15940 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20  ins entries for 
15950 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  all constraints.
15960 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72 72    ** on the curr
15970 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61 74  ent table.  That
15980 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61 76   way we only hav
15990 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74 20  e to compute it 
159a0 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20 74  once.  ** even t
159b0 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20 74  hough we might t
159c0 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20 62  ry to pick the b
159d0 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69 70  est index multip
159e0 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20 46  le times..  ** F
159f0 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74 20  or each attempt 
15a00 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69 6e  at picking an in
15a10 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20 6f  dex, the order o
15a20 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 0a  f tables in the.
15a30 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74 20    ** join might 
15a40 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f 20  be different so 
15a50 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f 6d  we have to recom
15a60 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65 20  pute the usable 
15a70 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20 74  flag.  ** each t
15a80 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ime..  */.  pIdx
15a90 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20  Cons = *(struct 
15aa0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
15ab0 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
15ac0 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
15ad0 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49  t;.  pUsage = pI
15ae0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
15af0 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28  intUsage;.  for(
15b00 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d  i=0; i<pIdxInfo-
15b10 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b  >nConstraint; i+
15b20 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a  +, pIdxCons++){.
15b30 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73      j = pIdxCons
15b40 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ->iTermOffset;. 
15b50 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d     pTerm = &pWC-
15b60 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43  >a[j];.    pIdxC
15b70 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 28 70  ons->usable = (p
15b80 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
15b90 74 26 6e 6f 74 52 65 61 64 79 29 20 3f 20 30 20  t&notReady) ? 0 
15ba0 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  : 1;.  }.  memse
15bb0 74 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a  t(pUsage, 0, siz
15bc0 65 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70  eof(pUsage[0])*p
15bd0 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
15be0 61 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64  aint);.  if( pId
15bf0 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65  xInfo->needToFre
15c00 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73  eIdxStr ){.    s
15c10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78  qlite3_free(pIdx
15c20 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
15c30 20 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69   }.  pIdxInfo->i
15c40 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
15c50 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20  xInfo->idxNum = 
15c60 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  0;.  pIdxInfo->n
15c70 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
15c80 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
15c90 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64  >orderByConsumed
15ca0 20 3d 20 30 3b 0a 20 20 2f 2a 20 28 28 64 6f 75   = 0;.  /* ((dou
15cb0 62 6c 65 29 32 29 20 49 6e 20 63 61 73 65 20 6f  ble)2) In case o
15cc0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  f SQLITE_OMIT_FL
15cd0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20  OATING_POINT... 
15ce0 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  */.  pIdxInfo->e
15cf0 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
15d00 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 2f 20  QLITE_BIG_DBL / 
15d10 28 28 64 6f 75 62 6c 65 29 32 29 3b 0a 20 20 6e  ((double)2);.  n
15d20 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 49 6e  OrderBy = pIdxIn
15d30 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20 20  fo->nOrderBy;.  
15d40 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 29 7b  if( !pOrderBy ){
15d50 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e  .    pIdxInfo->n
15d60 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d  OrderBy = 0;.  }
15d70 0a 0a 20 20 69 66 28 20 76 74 61 62 42 65 73 74  ..  if( vtabBest
15d80 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 54  Index(pParse, pT
15d90 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 20 29 7b  ab, pIdxInfo) ){
15da0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
15db0 0a 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  ..  pIdxCons = *
15dc0 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
15dd0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
15de0 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
15df0 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 66 6f 72  onstraint;.  for
15e00 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
15e10 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
15e20 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 55 73  ++){.    if( pUs
15e30 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78  age[i].argvIndex
15e40 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73  >0 ){.      pCos
15e50 74 2d 3e 75 73 65 64 20 7c 3d 20 70 57 43 2d 3e  t->used |= pWC->
15e60 61 5b 70 49 64 78 43 6f 6e 73 5b 69 5d 2e 69 54  a[pIdxCons[i].iT
15e70 65 72 6d 4f 66 66 73 65 74 5d 2e 70 72 65 72 65  ermOffset].prere
15e80 71 52 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20  qRight;.    }.  
15e90 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
15ea0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
15eb0 63 6c 61 75 73 65 2c 20 61 6e 64 20 74 68 65 20  clause, and the 
15ec0 73 65 6c 65 63 74 65 64 20 76 69 72 74 75 61 6c  selected virtual
15ed0 20 74 61 62 6c 65 20 69 6e 64 65 78 0a 20 20 2a   table index.  *
15ee0 2a 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69 73  * does not satis
15ef0 66 79 20 69 74 2c 20 69 6e 63 72 65 61 73 65 20  fy it, increase 
15f00 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68 65 20  the cost of the 
15f10 73 63 61 6e 20 61 63 63 6f 72 64 69 6e 67 6c 79  scan accordingly
15f20 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6d 61 74 63  . This.  ** matc
15f30 68 65 73 20 74 68 65 20 70 72 6f 63 65 73 73 69  hes the processi
15f40 6e 67 20 66 6f 72 20 6e 6f 6e 2d 76 69 72 74 75  ng for non-virtu
15f50 61 6c 20 74 61 62 6c 65 73 20 69 6e 20 62 65 73  al tables in bes
15f60 74 42 74 72 65 65 49 6e 64 65 78 28 29 2e 0a 20  tBtreeIndex().. 
15f70 20 2a 2f 0a 20 20 72 43 6f 73 74 20 3d 20 70 49   */.  rCost = pI
15f80 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
15f90 64 43 6f 73 74 3b 0a 20 20 69 66 28 20 70 4f 72  dCost;.  if( pOr
15fa0 64 65 72 42 79 20 26 26 20 70 49 64 78 49 6e 66  derBy && pIdxInf
15fb0 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  o->orderByConsum
15fc0 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 43 6f  ed==0 ){.    rCo
15fd0 73 74 20 2b 3d 20 65 73 74 4c 6f 67 28 72 43 6f  st += estLog(rCo
15fe0 73 74 29 2a 72 43 6f 73 74 3b 0a 20 20 7d 0a 0a  st)*rCost;.  }..
15ff0 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73    /* The cost is
16000 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
16010 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53  be larger than S
16020 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74  QLITE_BIG_DBL (t
16030 68 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76  he.  ** inital v
16040 61 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f  alue of lowestCo
16050 73 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e  st in this loop.
16060 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
16070 74 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c  the.  ** (cost<l
16080 6f 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20  owestCost) test 
16090 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72  below will never
160a0 20 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a   be true..  ** .
160b0 20 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c    ** Use "(doubl
160c0 65 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20  e)2" instead of 
160d0 22 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d  "2.0" in case OM
160e0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
160f0 54 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e  T .  ** is defin
16100 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  ed..  */.  if( (
16110 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28  SQLITE_BIG_DBL/(
16120 28 64 6f 75 62 6c 65 29 32 29 29 3c 72 43 6f 73  (double)2))<rCos
16130 74 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  t ){.    pCost->
16140 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45 5f  rCost = (SQLITE_
16150 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65  BIG_DBL/((double
16160 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )2));.  }else{. 
16170 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
16180 3d 20 72 43 6f 73 74 3b 0a 20 20 7d 0a 20 20 70  = rCost;.  }.  p
16190 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  Cost->plan.u.pVt
161a0 61 62 49 64 78 20 3d 20 70 49 64 78 49 6e 66 6f  abIdx = pIdxInfo
161b0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
161c0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
161d0 64 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  d ){.    pCost->
161e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
161f0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20  WHERE_ORDERBY;. 
16200 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e   }.  pCost->plan
16210 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70 49 64 78  .nEq = 0;.  pIdx
16220 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
16230 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a   nOrderBy;..  /*
16240 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 6d   Try to find a m
16250 6f 72 65 20 65 66 66 69 63 69 65 6e 74 20 61 63  ore efficient ac
16260 63 65 73 73 20 70 61 74 74 65 72 6e 20 62 79 20  cess pattern by 
16270 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20 69  using multiple i
16280 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74 6f 20 6f  ndexes.  ** to o
16290 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52 20 65 78  ptimize an OR ex
162a0 70 72 65 73 73 69 6f 6e 20 77 69 74 68 69 6e 20  pression within 
162b0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
162c0 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73 74 4f 72  . .  */.  bestOr
162d0 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72  ClauseIndex(pPar
162e0 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
162f0 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69  otReady, notVali
16300 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f  d, pOrderBy, pCo
16310 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  st);.}.#endif /*
16320 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
16330 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
16340 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64  .** Argument pId
16350 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  x is a pointer t
16360 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75 63  o an index struc
16370 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61 6e  ture that has an
16380 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51 4c   array of.** SQL
16390 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
163a0 53 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64 20  S evenly spaced 
163b0 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20 66  samples of the f
163c0 69 72 73 74 20 69 6e 64 65 78 65 64 20 63 6f 6c  irst indexed col
163d0 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e  umn.** stored in
163e0 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e 20   Index.aSample. 
163f0 54 68 65 73 65 20 73 61 6d 70 6c 65 73 20 64 69  These samples di
16400 76 69 64 65 20 74 68 65 20 64 6f 6d 61 69 6e 20  vide the domain 
16410 6f 66 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  of values stored
16420 0a 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69 6e  .** the index in
16430 74 6f 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58  to (SQLITE_INDEX
16440 5f 53 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69  _SAMPLES+1) regi
16450 6f 6e 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30  ons..** Region 0
16460 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61   contains all va
16470 6c 75 65 73 20 6c 65 73 73 20 74 68 61 6e 20 74  lues less than t
16480 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65 20  he first sample 
16490 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a 2a  value. Region.**
164a0 20 31 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75   1 contains valu
164b0 65 73 20 62 65 74 77 65 65 6e 20 74 68 65 20 66  es between the f
164c0 69 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 20  irst and second 
164d0 73 61 6d 70 6c 65 73 2e 20 20 52 65 67 69 6f 6e  samples.  Region
164e0 20 32 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 76   2 contains.** v
164f0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 73 61  alues between sa
16500 6d 70 6c 65 73 20 32 20 61 6e 64 20 33 2e 20 20  mples 2 and 3.  
16510 41 6e 64 20 73 6f 20 6f 6e 2e 20 20 52 65 67 69  And so on.  Regi
16520 6f 6e 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  on SQLITE_INDEX_
16530 53 41 4d 50 4c 45 53 0a 2a 2a 20 63 6f 6e 74 61  SAMPLES.** conta
16540 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67 65  ins values large
16550 72 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 20  r than the last 
16560 73 61 6d 70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  sample..**.** If
16570 20 74 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61   the index conta
16580 69 6e 73 20 6d 61 6e 79 20 64 75 70 6c 69 63 61  ins many duplica
16590 74 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  tes of a single 
165a0 76 61 6c 75 65 2c 20 74 68 65 6e 20 69 74 20 69  value, then it i
165b0 73 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 20 74 68  s.** possible th
165c0 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 61  at two or more a
165d0 64 6a 61 63 65 6e 74 20 73 61 6d 70 6c 65 73 20  djacent samples 
165e0 63 61 6e 20 68 6f 6c 64 20 74 68 65 20 73 61 6d  can hold the sam
165f0 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 57 68 65 6e  e value..** When
16600 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
16610 65 2c 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  e, the smallest 
16620 70 6f 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20  possible region 
16630 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16640 0a 2a 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70  .** when roundUp
16650 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 74 68   is false and th
16660 65 20 6c 61 72 67 65 73 74 20 70 6f 73 73 69 62  e largest possib
16670 6c 65 20 72 65 67 69 6f 6e 20 63 6f 64 65 20 69  le region code i
16680 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 77 68  s returned.** wh
16690 65 6e 20 72 6f 75 6e 64 55 70 20 69 73 20 74 72  en roundUp is tr
166a0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ue..**.** If suc
166b0 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
166c0 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65  nction determine
166d0 73 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 72  s which of the r
166e0 65 67 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a  egions value .**
166f0 20 70 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73   pVal lies in, s
16700 65 74 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f  ets *piRegion to
16710 20 74 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65   the region inde
16720 78 20 28 61 20 76 61 6c 75 65 20 62 65 74 77 65  x (a value betwe
16730 65 6e 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49  en 0.** and SQLI
16740 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
16750 2b 31 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61  +1, inclusive) a
16760 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  nd returns SQLIT
16770 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20  E_OK..** Or, if 
16780 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68  an OOM occurs wh
16790 69 6c 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74  ile converting t
167a0 65 78 74 20 76 61 6c 75 65 73 20 62 65 74 77 65  ext values betwe
167b0 65 6e 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a  en encodings,.**
167c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73   SQLITE_NOMEM is
167d0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
167e0 69 52 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66  iRegion is undef
167f0 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ined..*/.#ifdef 
16800 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
16810 41 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77  AT2.static int w
16820 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
16830 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
16840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16850 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
16860 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78  ction */.  Index
16870 20 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20   *pIdx,         
16880 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
16890 74 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61  to consider doma
168a0 69 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74  in of */.  sqlit
168b0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20  e3_value *pVal, 
168c0 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
168d0 74 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20  to consider */. 
168e0 20 69 6e 74 20 72 6f 75 6e 64 55 70 2c 20 20 20   int roundUp,   
168f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16900 52 65 74 75 72 6e 20 6c 61 72 67 65 73 74 20 76  Return largest v
16910 61 6c 69 64 20 72 65 67 69 6f 6e 20 69 66 20 74  alid region if t
16920 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  rue */.  int *pi
16930 52 65 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20  Region          
16940 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67       /* OUT: Reg
16950 69 6f 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e  ion of domain in
16960 20 77 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65   which value lie
16970 73 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  s */.){.  assert
16980 28 20 72 6f 75 6e 64 55 70 3d 3d 30 20 7c 7c 20  ( roundUp==0 || 
16990 72 6f 75 6e 64 55 70 3d 3d 31 20 29 3b 0a 20 20  roundUp==1 );.  
169a0 69 66 28 20 41 4c 57 41 59 53 28 70 56 61 6c 29  if( ALWAYS(pVal)
169b0 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61 6d   ){.    IndexSam
169c0 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20 70  ple *aSample = p
169d0 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20 20  Idx->aSample;.  
169e0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
169f0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71 6c   int eType = sql
16a00 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
16a10 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28 20  pVal);..    if( 
16a20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49 4e  eType==SQLITE_IN
16a30 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d 3d  TEGER || eType==
16a40 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
16a50 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
16a60 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
16a70 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20 20  ouble(pVal);.   
16a80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53 51     for(i=0; i<SQ
16a90 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
16aa0 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ES; i++){.      
16ab0 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d    if( aSample[i]
16ac0 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e  .eType==SQLITE_N
16ad0 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ULL ) continue;.
16ae0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
16af0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53 51  ple[i].eType>=SQ
16b00 4c 49 54 45 5f 54 45 58 54 20 29 20 62 72 65 61  LITE_TEXT ) brea
16b10 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  k;.        if( r
16b20 6f 75 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20  oundUp ){.      
16b30 20 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b      if( aSample[
16b40 69 5d 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b  i].u.r>r ) break
16b50 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16b60 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
16b70 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 3d 72  Sample[i].u.r>=r
16b80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
16b90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
16ba0 7d 65 6c 73 65 20 69 66 28 20 65 54 79 70 65 3d  }else if( eType=
16bb0 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 7b 0a  =SQLITE_NULL ){.
16bc0 20 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20        i = 0;.   
16bd0 20 20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29     if( roundUp )
16be0 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
16bf0 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   i<SQLITE_INDEX_
16c00 53 41 4d 50 4c 45 53 20 26 26 20 61 53 61 6d 70  SAMPLES && aSamp
16c10 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51 4c  le[i].eType==SQL
16c20 49 54 45 5f 4e 55 4c 4c 20 29 20 69 2b 2b 3b 0a  ITE_NULL ) i++;.
16c30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
16c40 65 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e{ .      sqlite
16c50 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
16c60 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
16c70 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
16c80 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
16c90 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
16ca0 20 2f 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66   /* pVal comes f
16cb0 72 6f 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  rom sqlite3Value
16cc0 46 72 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68  FromExpr() so th
16cd0 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65  e type cannot be
16ce0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61   NULL */.      a
16cf0 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
16d00 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79  LITE_TEXT || eTy
16d10 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
16d20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54  );..      if( eT
16d30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
16d40 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
16d50 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
16d60 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
16d70 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
16d80 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
16d90 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
16da0 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
16db0 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
16dc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
16dd0 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
16de0 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
16df0 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
16e00 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  0, *pIdx->azColl
16e10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16e20 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Coll==0 ){.     
16e30 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
16e40 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
16e50 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
16e60 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20  sequence: %s",. 
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e           *pIdx->
16e90 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  azColl);.       
16ea0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16eb0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
16ec0 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
16ed0 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
16ee0 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
16ef0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
16f00 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
16f10 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16f20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
16f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f40 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
16f50 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
16f60 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
16f70 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
16f80 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
16f90 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20  pColl->enc);..  
16fa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
16fb0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
16fc0 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
16fd0 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
16fe0 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70    int eSampletyp
16ff0 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  e = aSample[i].e
17000 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
17010 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53  ( eSampletype==S
17020 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53  QLITE_NULL || eS
17030 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20  ampletype<eType 
17040 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
17050 20 20 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65      if( (eSample
17060 74 79 70 65 21 3d 65 54 79 70 65 29 20 29 20 62  type!=eType) ) b
17070 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
17080 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
17090 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
170a0 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
170b0 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
170c0 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
170d0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
170e0 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
170f0 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
17100 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
17110 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
17120 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
17130 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
17140 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
17150 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
17160 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
17170 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
17180 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
17190 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
171a0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
171b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
171c0 20 20 20 20 20 20 20 20 63 20 3d 20 70 43 6f 6c          c = pCol
171d0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
171e0 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
171f0 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
17200 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17210 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
17220 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
17230 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
17240 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20    {.          c 
17250 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
17260 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
17270 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
17280 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
17290 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
172a0 20 20 20 20 20 20 20 69 66 28 20 63 2d 72 6f 75         if( c-rou
172b0 6e 64 55 70 3e 3d 30 20 29 20 62 72 65 61 6b 3b  ndUp>=0 ) break;
172c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
172d0 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30      assert( i>=0
172e0 20 26 26 20 69 3c 3d 53 51 4c 49 54 45 5f 49 4e   && i<=SQLITE_IN
172f0 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
17300 20 20 20 2a 70 69 52 65 67 69 6f 6e 20 3d 20 69     *piRegion = i
17310 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17320 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
17330 69 66 20 20 20 2f 2a 20 23 69 66 64 65 66 20 53  if   /* #ifdef S
17340 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
17350 54 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  T2 */../*.** If 
17360 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72  expression pExpr
17370 20 72 65 70 72 65 73 65 6e 74 73 20 61 20 6c 69   represents a li
17380 74 65 72 61 6c 20 76 61 6c 75 65 2c 20 73 65 74  teral value, set
17390 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f   *pp to point to
173a0 0a 2a 2a 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  .** an sqlite3_v
173b0 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
173c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 61  ontaining the sa
173d0 6d 65 20 76 61 6c 75 65 2c 20 77 69 74 68 20 61  me value, with a
173e0 66 66 69 6e 69 74 79 0a 2a 2a 20 61 66 66 20 61  ffinity.** aff a
173f0 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 62 65  pplied to it, be
17400 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20  fore returning. 
17410 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
17420 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
17430 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
17440 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
17450 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
17460 62 79 20 70 61 73 73 69 6e 67 20 69 74 20 74 6f  by passing it to
17470 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 61 6c 75   .** sqlite3Valu
17480 65 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  eFree()..**.** I
17490 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  f the current pa
174a0 72 73 65 20 69 73 20 61 20 72 65 63 6f 6d 70 69  rse is a recompi
174b0 6c 65 20 28 73 71 6c 69 74 65 33 52 65 70 72 65  le (sqlite3Repre
174c0 70 61 72 65 28 29 29 20 61 6e 64 20 70 45 78 70  pare()) and pExp
174d0 72 0a 2a 2a 20 69 73 20 61 6e 20 53 51 4c 20 76  r.** is an SQL v
174e0 61 72 69 61 62 6c 65 20 74 68 61 74 20 63 75 72  ariable that cur
174f0 72 65 6e 74 6c 79 20 68 61 73 20 61 20 6e 6f 6e  rently has a non
17500 2d 4e 55 4c 4c 20 76 61 6c 75 65 20 62 6f 75 6e  -NULL value boun
17510 64 20 74 6f 20 69 74 2c 0a 2a 2a 20 63 72 65 61  d to it,.** crea
17520 74 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  te an sqlite3_va
17530 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
17540 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 76 61  ntaining this va
17550 6c 75 65 2c 20 61 67 61 69 6e 20 77 69 74 68 0a  lue, again with.
17560 2a 2a 20 61 66 66 69 6e 69 74 79 20 61 66 66 20  ** affinity aff 
17570 61 70 70 6c 69 65 64 20 74 6f 20 69 74 2c 20 69  applied to it, i
17580 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
17590 20 6e 65 69 74 68 65 72 20 6f 66 20 74 68 65 20   neither of the 
175a0 61 62 6f 76 65 20 61 70 70 6c 79 2c 20 73 65 74  above apply, set
175b0 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   *pp to NULL..**
175c0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
175d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
175e0 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
175f0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
17600 4f 4b 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  OK..*/.#ifdef SQ
17610 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
17620 32 0a 73 74 61 74 69 63 20 69 6e 74 20 76 61 6c  2.static int val
17630 75 65 46 72 6f 6d 45 78 70 72 28 0a 20 20 50 61  ueFromExpr(.  Pa
17640 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a 20 20  rse *pParse, .  
17650 45 78 70 72 20 2a 70 45 78 70 72 2c 20 0a 20 20  Expr *pExpr, .  
17660 75 38 20 61 66 66 2c 20 0a 20 20 73 71 6c 69 74  u8 aff, .  sqlit
17670 65 33 5f 76 61 6c 75 65 20 2a 2a 70 70 0a 29 7b  e3_value **pp.){
17680 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  .  if( pExpr->op
17690 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 0a 20 20  ==TK_VARIABLE.  
176a0 20 7c 7c 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d   || (pExpr->op==
176b0 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
176c0 45 78 70 72 2d 3e 6f 70 32 3d 3d 54 4b 5f 56 41  Expr->op2==TK_VA
176d0 52 49 41 42 4c 45 29 0a 20 20 29 7b 0a 20 20 20  RIABLE).  ){.   
176e0 20 69 6e 74 20 69 56 61 72 20 3d 20 70 45 78 70   int iVar = pExp
176f0 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
17700 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61  sqlite3VdbeSetVa
17710 72 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56  rmask(pParse->pV
17720 64 62 65 2c 20 69 56 61 72 29 3b 20 2f 2a 20 49  dbe, iVar); /* I
17730 4d 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37  MP: R-23257-0277
17740 38 20 2a 2f 0a 20 20 20 20 2a 70 70 20 3d 20 73  8 */.    *pp = s
17750 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
17760 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72  ue(pParse->pRepr
17770 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66  epare, iVar, aff
17780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
17790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
177a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c  eturn sqlite3Val
177b0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
177c0 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
177d0 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20  LITE_UTF8, aff, 
177e0 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  pp);.}.#endif../
177f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17800 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
17810 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
17820 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
17830 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
17840 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
17850 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
17860 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
17870 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
17880 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
17890 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
178a0 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
178b0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
178c0 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
178d0 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
178e0 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
178f0 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
17900 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
17910 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
17920 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
17930 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
17940 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
17950 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
17960 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
17970 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
179a0 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
179c0 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
179d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179e0 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
179f0 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
17a00 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
17a10 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
17a20 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
17a30 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
17a40 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
17a50 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
17a60 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
17a70 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72  *.** The nEq par
17a80 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
17a90 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
17aa0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73  e index column s
17ab0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a  ubject to the.**
17ac0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
17ad0 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
17ae0 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
17af0 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  of equality cons
17b00 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d  traints.** optim
17b10 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
17b20 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
17b30 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
17b40 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
17b50 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29  s.** on t1(a, b)
17b60 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
17b70 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
17b80 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
17b90 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
17ba0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
17bb0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73  **.** then nEq s
17bc0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
17bd0 74 68 65 20 76 61 6c 75 65 20 31 20 28 61 73 20  the value 1 (as 
17be0 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
17bf0 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20  cted column,.** 
17c00 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
17c10 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
17c20 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
17c30 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
17c40 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
17c50 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
17c60 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
17c70 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
17c80 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  Eq should be pas
17c90 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sed 0..**.** The
17ca0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
17cb0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  is an integer be
17cc0 74 77 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c  tween 1 and 100,
17cd0 20 69 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65   inclusive. A re
17ce0 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  turn.** value of
17cf0 20 31 20 69 6e 64 69 63 61 74 65 73 20 74 68 61   1 indicates tha
17d00 74 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72  t the proposed r
17d10 61 6e 67 65 20 73 63 61 6e 20 69 73 20 65 78 70  ange scan is exp
17d20 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a  ected to visit.*
17d30 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  * approximately 
17d40 31 2f 31 30 30 74 68 20 28 31 25 29 20 6f 66 20  1/100th (1%) of 
17d50 74 68 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65  the rows selecte
17d60 64 20 62 79 20 74 68 65 20 6e 45 71 20 65 71 75  d by the nEq equ
17d70 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
17d80 69 6e 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41  ints (if any). A
17d90 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
17da0 20 31 30 30 20 69 6e 64 69 63 61 74 65 73 20 74   100 indicates t
17db0 68 61 74 20 69 74 20 69 73 20 65 78 70 65 63 74  hat it is expect
17dc0 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  ed.** that the r
17dd0 61 6e 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76  ange scan will v
17de0 69 73 69 74 20 65 76 65 72 79 20 72 6f 77 20 28  isit every row (
17df0 31 30 30 25 29 20 73 65 6c 65 63 74 65 64 20 62  100%) selected b
17e00 79 20 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a  y the equality.*
17e10 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  * constraints..*
17e20 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
17e30 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
17e40 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at2 ANALYZE data
17e50 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
17e60 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
17e70 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
17e80 61 63 65 20 62 79 20 33 2f 34 74 68 73 2e 20 20  ace by 3/4ths.  
17e90 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63  Hence a single c
17ea0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a  onstraint (x>?).
17eb0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  ** results in a 
17ec0 72 65 74 75 72 6e 20 6f 66 20 32 35 20 61 6e 64  return of 25 and
17ed0 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61   a range constra
17ee0 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  int (x>? AND x<?
17ef0 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20  ) results.** in 
17f00 61 20 72 65 74 75 72 6e 20 6f 66 20 36 2e 0a 2a  a return of 6..*
17f10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
17f20 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a  reRangeScanEst(.
17f30 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
17f40 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
17f50 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74  g & code generat
17f60 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
17f70 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20   Index *p,      
17f80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
17f90 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ex containing th
17fa0 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64  e range-compared
17fb0 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a   column; "x" */.
17fc0 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20    int nEq,      
17fd0 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20         /* index 
17fe0 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f  into p->aCol[] o
17ff0 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70  f the range-comp
18000 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  ared column */. 
18010 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77   WhereTerm *pLow
18020 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62  er,   /* Lower b
18030 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
18040 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d  e. ex: "x>123" M
18050 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
18060 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70    WhereTerm *pUp
18070 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20  per,   /* Upper 
18080 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
18090 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20  ge. ex: "x<455" 
180a0 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
180b0 0a 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20  .  int *piEst   
180c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
180d0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
180e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
180f0 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66  LITE_OK;..#ifdef
18100 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
18110 54 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71 3d  TAT2..  if( nEq=
18120 3d 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c 65  =0 && p->aSample
18130 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18140 76 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61 6c  value *pLowerVal
18150 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
18160 33 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72 56  3_value *pUpperV
18170 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  al = 0;.    int 
18180 69 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 4c  iEst;.    int iL
18190 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ower = 0;.    in
181a0 74 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49 54  t iUpper = SQLIT
181b0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b  E_INDEX_SAMPLES;
181c0 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  .    int roundUp
181d0 55 70 70 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  Upper = 0;.    i
181e0 6e 74 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72 20  nt roundUpLower 
181f0 3d 20 30 3b 0a 20 20 20 20 75 38 20 61 66 66 20  = 0;.    u8 aff 
18200 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f  = p->pTable->aCo
18210 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  l[p->aiColumn[0]
18220 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20  ].affinity;..   
18230 20 69 66 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20   if( pLower ){. 
18240 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
18250 20 3d 20 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72   = pLower->pExpr
18260 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
18270 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
18280 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
18290 2c 20 61 66 66 2c 20 26 70 4c 6f 77 65 72 56 61  , aff, &pLowerVa
182a0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
182b0 28 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61  ( pLower->eOpera
182c0 74 6f 72 3d 3d 57 4f 5f 47 54 20 7c 7c 20 70 4c  tor==WO_GT || pL
182d0 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  ower->eOperator=
182e0 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =WO_GE );.      
182f0 72 6f 75 6e 64 55 70 4c 6f 77 65 72 20 3d 20 28  roundUpLower = (
18300 70 4c 6f 77 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pLower->eOperato
18310 72 3d 3d 57 4f 5f 47 54 29 20 3f 31 3a 30 3b 0a  r==WO_GT) ?1:0;.
18320 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
18330 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18340 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 45  Upper ){.      E
18350 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70  xpr *pExpr = pUp
18360 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  per->pExpr->pRig
18370 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 76  ht;.      rc = v
18380 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61  alueFromExpr(pPa
18390 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c  rse, pExpr, aff,
183a0 20 26 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20   &pUpperVal);.  
183b0 20 20 20 20 61 73 73 65 72 74 28 20 70 55 70 70      assert( pUpp
183c0 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  er->eOperator==W
183d0 4f 5f 4c 54 20 7c 7c 20 70 55 70 70 65 72 2d 3e  O_LT || pUpper->
183e0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4c 45  eOperator==WO_LE
183f0 20 29 3b 0a 20 20 20 20 20 20 72 6f 75 6e 64 55   );.      roundU
18400 70 55 70 70 65 72 20 3d 20 28 70 55 70 70 65 72  pUpper = (pUpper
18410 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
18420 4c 45 29 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a  LE) ?1:0;.    }.
18430 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
18440 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c 6f 77 65  ITE_OK || (pLowe
18450 72 56 61 6c 3d 3d 30 20 26 26 20 70 55 70 70 65  rVal==0 && pUppe
18460 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20 20 20 20  rVal==0) ){.    
18470 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
18480 65 65 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20  ee(pLowerVal);. 
18490 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
184a0 65 46 72 65 65 28 70 55 70 70 65 72 56 61 6c 29  eFree(pUpperVal)
184b0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 72 61 6e  ;.      goto ran
184c0 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63 6b 3b  ge_est_fallback;
184d0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
184e0 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20  LowerVal==0 ){. 
184f0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
18500 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
18510 65 2c 20 70 2c 20 70 55 70 70 65 72 56 61 6c 2c  e, p, pUpperVal,
18520 20 72 6f 75 6e 64 55 70 55 70 70 65 72 2c 20 26   roundUpUpper, &
18530 69 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20 69  iUpper);.      i
18540 66 28 20 70 4c 6f 77 65 72 20 29 20 69 4c 6f 77  f( pLower ) iLow
18550 65 72 20 3d 20 69 55 70 70 65 72 2f 32 3b 0a 20  er = iUpper/2;. 
18560 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55 70     }else if( pUp
18570 70 65 72 56 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  perVal==0 ){.   
18580 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
18590 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
185a0 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 72   p, pLowerVal, r
185b0 6f 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26 69 4c  oundUpLower, &iL
185c0 6f 77 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ower);.      if(
185d0 20 70 55 70 70 65 72 20 29 20 69 55 70 70 65 72   pUpper ) iUpper
185e0 20 3d 20 28 69 4c 6f 77 65 72 20 2b 20 53 51 4c   = (iLower + SQL
185f0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
18600 53 20 2b 20 31 29 2f 32 3b 0a 20 20 20 20 7d 65  S + 1)/2;.    }e
18610 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
18620 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
18630 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70  (pParse, p, pUpp
18640 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70  erVal, roundUpUp
18650 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  per, &iUpper);. 
18660 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18680 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
18690 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
186a0 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c 20 72 6f  p, pLowerVal, ro
186b0 75 6e 64 55 70 4c 6f 77 65 72 2c 20 26 69 4c 6f  undUpLower, &iLo
186c0 77 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  wer);.      }.  
186d0 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54 52 41    }.    WHERETRA
186e0 43 45 28 28 22 72 61 6e 67 65 20 73 63 61 6e 20  CE(("range scan 
186f0 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c  regions: %d..%d\
18700 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69 55 70 70  n", iLower, iUpp
18710 65 72 29 29 3b 0a 0a 20 20 20 20 69 45 73 74 20  er));..    iEst 
18720 3d 20 69 55 70 70 65 72 20 2d 20 69 4c 6f 77 65  = iUpper - iLowe
18730 72 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  r;.    testcase(
18740 20 69 45 73 74 3d 3d 53 51 4c 49 54 45 5f 49 4e   iEst==SQLITE_IN
18750 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
18760 20 20 20 61 73 73 65 72 74 28 20 69 45 73 74 3c     assert( iEst<
18770 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41  =SQLITE_INDEX_SA
18780 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 69 66 28  MPLES );.    if(
18790 20 69 45 73 74 3c 31 20 29 7b 0a 20 20 20 20 20   iEst<1 ){.     
187a0 20 2a 70 69 45 73 74 20 3d 20 35 30 2f 53 51 4c   *piEst = 50/SQL
187b0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
187c0 53 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  S;.    }else{.  
187d0 20 20 20 20 2a 70 69 45 73 74 20 3d 20 28 69 45      *piEst = (iE
187e0 73 74 2a 31 30 30 29 2f 53 51 4c 49 54 45 5f 49  st*100)/SQLITE_I
187f0 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20  NDEX_SAMPLES;.  
18800 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
18810 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56  alueFree(pLowerV
18820 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
18830 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72  ValueFree(pUpper
18840 56 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Val);.    return
18850 20 72 63 3b 0a 20 20 7d 0a 72 61 6e 67 65 5f 65   rc;.  }.range_e
18860 73 74 5f 66 61 6c 6c 62 61 63 6b 3a 0a 23 65 6c  st_fallback:.#el
18870 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
18880 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 20  METER(pParse);. 
18890 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
188a0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
188b0 41 52 41 4d 45 54 45 52 28 6e 45 71 29 3b 0a 23  ARAMETER(nEq);.#
188c0 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
188d0 70 4c 6f 77 65 72 20 7c 7c 20 70 55 70 70 65 72  pLower || pUpper
188e0 20 29 3b 0a 20 20 2a 70 69 45 73 74 20 3d 20 31   );.  *piEst = 1
188f0 30 30 3b 0a 20 20 69 66 28 20 70 4c 6f 77 65 72  00;.  if( pLower
18900 20 26 26 20 28 70 4c 6f 77 65 72 2d 3e 77 74 46   && (pLower->wtF
18910 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c  lags & TERM_VNUL
18920 4c 29 3d 3d 30 20 29 20 2a 70 69 45 73 74 20 2f  L)==0 ) *piEst /
18930 3d 20 34 3b 0a 20 20 69 66 28 20 70 55 70 70 65  = 4;.  if( pUppe
18940 72 20 29 20 2a 70 69 45 73 74 20 2f 3d 20 34 3b  r ) *piEst /= 4;
18950 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18960 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18970 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a 0a 2a  NABLE_STAT2./*.*
18980 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20 6e  * Estimate the n
18990 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74 68  umber of rows th
189a0 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
189b0 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20  ned based on.** 
189c0 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  an equality cons
189d0 74 72 61 69 6e 74 20 78 3d 56 41 4c 55 45 20 61  traint x=VALUE a
189e0 6e 64 20 77 68 65 72 65 20 74 68 61 74 20 56 41  nd where that VA
189f0 4c 55 45 20 6f 63 63 75 72 73 20 69 6e 0a 2a 2a  LUE occurs in.**
18a00 20 74 68 65 20 68 69 73 74 6f 67 72 61 6d 20 64   the histogram d
18a10 61 74 61 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  ata.  This only 
18a20 77 6f 72 6b 73 20 77 68 65 6e 20 78 20 69 73 20  works when x is 
18a30 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a  the left-most.**
18a40 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e   column of an in
18a50 64 65 78 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  dex and sqlite_s
18a60 74 61 74 32 20 68 69 73 74 6f 67 72 61 6d 20 64  tat2 histogram d
18a70 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ata is available
18a80 0a 2a 2a 20 66 6f 72 20 74 68 61 74 20 69 6e 64  .** for that ind
18a90 65 78 2e 20 20 57 68 65 6e 20 70 45 78 70 72 3d  ex.  When pExpr=
18aa0 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
18ab0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
18ac0 69 73 0a 2a 2a 20 22 78 20 49 53 20 4e 55 4c 4c  is.** "x IS NULL
18ad0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 78 3d  " instead of "x=
18ae0 56 41 4c 55 45 22 2e 0a 2a 2a 0a 2a 2a 20 57 72  VALUE"..**.** Wr
18af0 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74 65  ite the estimate
18b00 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74 6f  d row count into
18b10 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74 75   *pnRow and retu
18b20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a 2a  rn SQLITE_OK. .*
18b30 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 6d  * If unable to m
18b40 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65 2c  ake an estimate,
18b50 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75 6e   leave *pnRow un
18b60 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74 75  changed and retu
18b70 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  rn.** non-zero..
18b80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
18b90 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20 69  ne can fail if i
18ba0 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20 6c  t is unable to l
18bb0 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  oad a collating 
18bc0 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71 75  sequence.** requ
18bd0 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67 20  ired for string 
18be0 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20 69  comparison, or i
18bf0 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f  f unable to allo
18c00 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66  cate memory.** f
18c10 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72 73  or a UTF convers
18c20 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f 72  ion required for
18c30 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54 68   comparison.  Th
18c40 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72 65  e error is store
18c50 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61 72  d.** in the pPar
18c60 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  se structure..*/
18c70 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
18c80 65 45 71 75 61 6c 53 63 61 6e 45 73 74 28 0a 20  eEqualScanEst(. 
18c90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
18ca0 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
18cb0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
18cc0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
18cd0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
18ce0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
18cf0 78 20 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73  x whose left-mos
18d00 74 20 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72  t column is pTer
18d10 6d 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  m */.  Expr *pEx
18d20 70 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 45  pr,         /* E
18d30 78 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 56 41  xpression for VA
18d40 4c 55 45 20 69 6e 20 74 68 65 20 78 3d 56 41 4c  LUE in the x=VAL
18d50 55 45 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  UE constraint */
18d60 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52 6f 77  .  double *pnRow
18d70 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
18d80 20 74 68 65 20 72 65 76 69 73 65 64 20 72 6f 77   the revised row
18d90 20 65 73 74 69 6d 61 74 65 20 68 65 72 65 20 2a   estimate here *
18da0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
18db0 61 6c 75 65 20 2a 70 52 68 73 20 3d 20 30 3b 20  alue *pRhs = 0; 
18dc0 20 2f 2a 20 56 41 4c 55 45 20 6f 6e 20 72 69 67   /* VALUE on rig
18dd0 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
18de0 70 54 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 69  pTerm */.  int i
18df0 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 3b 20 20  Lower, iUpper;  
18e00 20 20 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66       /* Range of
18e10 20 68 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f   histogram regio
18e20 6e 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 52  ns containing pR
18e30 68 73 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20  hs */.  u8 aff; 
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69    /* Column affi
18e60 6e 69 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nity */.  int rc
18e70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18e80 20 20 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69      /* Subfuncti
18e90 6f 6e 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  on return code *
18ea0 2f 0a 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45  /.  double nRowE
18eb0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
18ec0 20 4e 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66   New estimate of
18ed0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
18ee0 6f 77 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ows */..  assert
18ef0 28 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20  ( p->aSample!=0 
18f00 29 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54  );.  aff = p->pT
18f10 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69  able->aCol[p->ai
18f20 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e  Column[0]].affin
18f30 69 74 79 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ity;.  if( pExpr
18f40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 76 61 6c   ){.    rc = val
18f50 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
18f60 65 2c 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26  e, pExpr, aff, &
18f70 70 52 68 73 29 3b 0a 20 20 20 20 69 66 28 20 72  pRhs);.    if( r
18f80 63 20 29 20 67 6f 74 6f 20 77 68 65 72 65 45 71  c ) goto whereEq
18f90 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63 65  ualScanEst_cance
18fa0 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  l;.  }else{.    
18fb0 70 52 68 73 20 3d 20 73 71 6c 69 74 65 33 56 61  pRhs = sqlite3Va
18fc0 6c 75 65 4e 65 77 28 70 50 61 72 73 65 2d 3e 64  lueNew(pParse->d
18fd0 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 52  b);.  }.  if( pR
18fe0 68 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  hs==0 ) return S
18ff0 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
19000 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
19010 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
19020 70 2c 20 70 52 68 73 2c 20 30 2c 20 26 69 4c 6f  p, pRhs, 0, &iLo
19030 77 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  wer);.  if( rc )
19040 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
19050 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
19060 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67    rc = whereRang
19070 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20  eRegion(pParse, 
19080 70 2c 20 70 52 68 73 2c 20 31 2c 20 26 69 55 70  p, pRhs, 1, &iUp
19090 70 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  per);.  if( rc )
190a0 20 67 6f 74 6f 20 77 68 65 72 65 45 71 75 61 6c   goto whereEqual
190b0 53 63 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3b 0a  ScanEst_cancel;.
190c0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 65    WHERETRACE(("e
190d0 71 75 61 6c 69 74 79 20 73 63 61 6e 20 72 65 67  quality scan reg
190e0 69 6f 6e 73 3a 20 25 64 2e 2e 25 64 5c 6e 22 2c  ions: %d..%d\n",
190f0 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65 72 29   iLower, iUpper)
19100 29 3b 0a 20 20 69 66 28 20 69 4c 6f 77 65 72 3e  );.  if( iLower>
19110 3d 69 55 70 70 65 72 20 29 7b 0a 20 20 20 20 6e  =iUpper ){.    n
19120 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69 52 6f  RowEst = p->aiRo
19130 77 45 73 74 5b 30 5d 2f 28 53 51 4c 49 54 45 5f  wEst[0]/(SQLITE_
19140 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2a 32 29  INDEX_SAMPLES*2)
19150 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77 45 73  ;.    if( nRowEs
19160 74 3c 2a 70 6e 52 6f 77 20 29 20 2a 70 6e 52 6f  t<*pnRow ) *pnRo
19170 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20 20 7d  w = nRowEst;.  }
19180 65 6c 73 65 7b 0a 20 20 20 20 6e 52 6f 77 45 73  else{.    nRowEs
19190 74 20 3d 20 28 69 55 70 70 65 72 2d 69 4c 6f 77  t = (iUpper-iLow
191a0 65 72 29 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b  er)*p->aiRowEst[
191b0 30 5d 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  0]/SQLITE_INDEX_
191c0 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 2a 70 6e  SAMPLES;.    *pn
191d0 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b 0a 20  Row = nRowEst;. 
191e0 20 7d 0a 0a 77 68 65 72 65 45 71 75 61 6c 53 63   }..whereEqualSc
191f0 61 6e 45 73 74 5f 63 61 6e 63 65 6c 3a 0a 20 20  anEst_cancel:.  
19200 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
19210 28 70 52 68 73 29 3b 0a 20 20 72 65 74 75 72 6e  (pRhs);.  return
19220 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
19230 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
19240 45 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f  ENABLE_STAT2) */
19250 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19260 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 2f 2a 0a  ENABLE_STAT2./*.
19270 2a 2a 20 45 73 74 69 6d 61 74 65 20 74 68 65 20  ** Estimate the 
19280 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
19290 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
192a0 72 6e 65 64 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  rned based on.**
192b0 20 61 6e 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   an IN constrain
192c0 74 20 77 68 65 72 65 20 74 68 65 20 72 69 67 68  t where the righ
192d0 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
192e0 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a  he IN operator.*
192f0 2a 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 76  * is a list of v
19300 61 6c 75 65 73 2e 20 20 45 78 61 6d 70 6c 65 3a  alues.  Example:
19310 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 57 48  .**.**        WH
19320 45 52 45 20 78 20 49 4e 20 28 31 2c 32 2c 33 2c  ERE x IN (1,2,3,
19330 34 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  4).**.** Write t
19340 68 65 20 65 73 74 69 6d 61 74 65 64 20 72 6f 77  he estimated row
19350 20 63 6f 75 6e 74 20 69 6e 74 6f 20 2a 70 6e 52   count into *pnR
19360 6f 77 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ow and return SQ
19370 4c 49 54 45 5f 4f 4b 2e 20 0a 2a 2a 20 49 66 20  LITE_OK. .** If 
19380 75 6e 61 62 6c 65 20 74 6f 20 6d 61 6b 65 20 61  unable to make a
19390 6e 20 65 73 74 69 6d 61 74 65 2c 20 6c 65 61 76  n estimate, leav
193a0 65 20 2a 70 6e 52 6f 77 20 75 6e 63 68 61 6e 67  e *pnRow unchang
193b0 65 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ed and return.**
193c0 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
193d0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
193e0 6e 20 66 61 69 6c 20 69 66 20 69 74 20 69 73 20  n fail if it is 
193f0 75 6e 61 62 6c 65 20 74 6f 20 6c 6f 61 64 20 61  unable to load a
19400 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
19410 6e 63 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20  nce.** required 
19420 66 6f 72 20 73 74 72 69 6e 67 20 63 6f 6d 70 61  for string compa
19430 72 69 73 6f 6e 2c 20 6f 72 20 69 66 20 75 6e 61  rison, or if una
19440 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ble to allocate 
19450 6d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 61 20  memory.** for a 
19460 55 54 46 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72  UTF conversion r
19470 65 71 75 69 72 65 64 20 66 6f 72 20 63 6f 6d 70  equired for comp
19480 61 72 69 73 6f 6e 2e 20 20 54 68 65 20 65 72 72  arison.  The err
19490 6f 72 20 69 73 20 73 74 6f 72 65 64 0a 2a 2a 20  or is stored.** 
194a0 69 6e 20 74 68 65 20 70 50 61 72 73 65 20 73 74  in the pParse st
194b0 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  ructure..*/.stat
194c0 69 63 20 69 6e 74 20 77 68 65 72 65 49 6e 53 63  ic int whereInSc
194d0 61 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a  anEst(.  Parse *
194e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a  pParse,       /*
194f0 20 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20   Parsing & code 
19500 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65  generating conte
19510 78 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  xt */.  Index *p
19520 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
19530 54 68 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20  The index whose 
19540 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e  left-most column
19550 20 69 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45   is pTerm */.  E
19560 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
19570 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65      /* The value
19580 20 6c 69 73 74 20 6f 6e 20 74 68 65 20 52 48 53   list on the RHS
19590 20 6f 66 20 22 78 20 49 4e 20 28 76 31 2c 76 32   of "x IN (v1,v2
195a0 2c 76 33 2c 2e 2e 2e 29 22 20 2a 2f 0a 20 20 64  ,v3,...)" */.  d
195b0 6f 75 62 6c 65 20 2a 70 6e 52 6f 77 20 20 20 20  ouble *pnRow    
195c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
195d0 20 72 65 76 69 73 65 64 20 72 6f 77 20 65 73 74   revised row est
195e0 69 6d 61 74 65 20 68 65 72 65 20 2a 2f 0a 29 7b  imate here */.){
195f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
19600 20 2a 70 56 61 6c 20 3d 20 30 3b 20 20 2f 2a 20   *pVal = 0;  /* 
19610 4f 6e 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 6c  One value from l
19620 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 6f  ist */.  int iLo
19630 77 65 72 2c 20 69 55 70 70 65 72 3b 20 20 20 20  wer, iUpper;    
19640 20 20 20 2f 2a 20 52 61 6e 67 65 20 6f 66 20 68     /* Range of h
19650 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73  istogram regions
19660 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 52 68 73   containing pRhs
19670 20 2a 2f 0a 20 20 75 38 20 61 66 66 3b 20 20 20   */.  u8 aff;   
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 2f 2a 20 43 6f 6c 75 6d 6e 20 61 66 66 69 6e 69  /* Column affini
196a0 74 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ty */.  int rc =
196b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
196c0 20 20 2f 2a 20 53 75 62 66 75 6e 63 74 69 6f 6e    /* Subfunction
196d0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
196e0 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 45 73 74    double nRowEst
196f0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
19700 65 77 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  ew estimate of t
19710 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
19720 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 6e  s */.  int nSpan
19730 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19740 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 68 69   /* Number of hi
19750 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e 73 20  stogram regions 
19760 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20 69 6e 74  spanned */.  int
19770 20 6e 53 69 6e 67 6c 65 20 3d 20 30 3b 20 20 20   nSingle = 0;   
19780 20 20 20 20 20 20 20 2f 2a 20 48 69 73 74 6f 67         /* Histog
19790 72 61 6d 20 72 65 67 69 6f 6e 73 20 68 69 74 20  ram regions hit 
197a0 62 79 20 61 20 73 69 6e 67 6c 65 20 76 61 6c 75  by a single valu
197b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 6f 74 46  e */.  int nNotF
197c0 6f 75 6e 64 20 3d 20 30 3b 20 20 20 20 20 20 20  ound = 0;       
197d0 20 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 76 61 6c   /* Count of val
197e0 75 65 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ues that are not
197f0 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20   constants */.  
19800 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
19810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19820 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19830 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 61 53 70  nter */.  u8 aSp
19840 61 6e 5b 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  an[SQLITE_INDEX_
19850 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 20 20 2f  SAMPLES+1];    /
19860 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67 69  * Histogram regi
19870 6f 6e 73 20 74 68 61 74 20 61 72 65 20 73 70 61  ons that are spa
19880 6e 6e 65 64 20 2a 2f 0a 20 20 75 38 20 61 53 69  nned */.  u8 aSi
19890 6e 67 6c 65 5b 53 51 4c 49 54 45 5f 49 4e 44 45  ngle[SQLITE_INDE
198a0 58 5f 53 41 4d 50 4c 45 53 2b 31 5d 3b 20 20 2f  X_SAMPLES+1];  /
198b0 2a 20 48 69 73 74 6f 67 72 61 6d 20 72 65 67 69  * Histogram regi
198c0 6f 6e 73 20 68 69 74 20 6f 6e 63 65 20 2a 2f 0a  ons hit once */.
198d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 53  .  assert( p->aS
198e0 61 6d 70 6c 65 21 3d 30 20 29 3b 0a 20 20 61 66  ample!=0 );.  af
198f0 66 20 3d 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61  f = p->pTable->a
19900 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Col[p->aiColumn[
19910 30 5d 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  0]].affinity;.  
19920 6d 65 6d 73 65 74 28 61 53 70 61 6e 2c 20 30 2c  memset(aSpan, 0,
19930 20 73 69 7a 65 6f 66 28 61 53 70 61 6e 29 29 3b   sizeof(aSpan));
19940 0a 20 20 6d 65 6d 73 65 74 28 61 53 69 6e 67 6c  .  memset(aSingl
19950 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53 69  e, 0, sizeof(aSi
19960 6e 67 6c 65 29 29 3b 0a 20 20 66 6f 72 28 69 3d  ngle));.  for(i=
19970 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
19980 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
19990 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
199a0 61 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 76 61  al);.    rc = va
199b0 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72  lueFromExpr(pPar
199c0 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
199d0 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 56 61  pExpr, aff, &pVa
199e0 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
199f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
19a00 70 56 61 6c 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  pVal==0 || sqlit
19a10 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 70 56  e3_value_type(pV
19a20 61 6c 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  al)==SQLITE_NULL
19a30 20 29 7b 0a 20 20 20 20 20 20 6e 4e 6f 74 46 6f   ){.      nNotFo
19a40 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e  und++;.      con
19a50 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
19a60 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
19a70 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
19a80 2c 20 70 56 61 6c 2c 20 30 2c 20 26 69 4c 6f 77  , pVal, 0, &iLow
19a90 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  er);.    if( rc 
19aa0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72 63 20  ) break;.    rc 
19ab0 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
19ac0 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 56  on(pParse, p, pV
19ad0 61 6c 2c 20 31 2c 20 26 69 55 70 70 65 72 29 3b  al, 1, &iUpper);
19ae0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72  .    if( rc ) br
19af0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 69 4c 6f  eak;.    if( iLo
19b00 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b 0a 20  wer>=iUpper ){. 
19b10 20 20 20 20 20 61 53 69 6e 67 6c 65 5b 69 4c 6f       aSingle[iLo
19b20 77 65 72 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 65  wer] = 1;.    }e
19b30 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
19b40 74 28 20 69 4c 6f 77 65 72 3e 3d 30 20 26 26 20  t( iLower>=0 && 
19b50 69 55 70 70 65 72 3c 3d 53 51 4c 49 54 45 5f 49  iUpper<=SQLITE_I
19b60 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a  NDEX_SAMPLES );.
19b70 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4c 6f        while( iLo
19b80 77 65 72 3c 69 55 70 70 65 72 20 29 20 61 53 70  wer<iUpper ) aSp
19b90 61 6e 5b 69 4c 6f 77 65 72 2b 2b 5d 20 3d 20 31  an[iLower++] = 1
19ba0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
19bb0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19bc0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 53 70  ){.    for(i=nSp
19bd0 61 6e 3d 30 3b 20 69 3c 3d 53 51 4c 49 54 45 5f  an=0; i<=SQLITE_
19be0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69  INDEX_SAMPLES; i
19bf0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19c00 53 70 61 6e 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Span[i] ){.     
19c10 20 20 20 6e 53 70 61 6e 2b 2b 3b 0a 20 20 20 20     nSpan++;.    
19c20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 53 69 6e    }else if( aSin
19c30 67 6c 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  gle[i] ){.      
19c40 20 20 6e 53 69 6e 67 6c 65 2b 2b 3b 0a 20 20 20    nSingle++;.   
19c50 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
19c60 52 6f 77 45 73 74 20 3d 20 28 6e 53 70 61 6e 2a  RowEst = (nSpan*
19c70 32 2b 6e 53 69 6e 67 6c 65 29 2a 70 2d 3e 61 69  2+nSingle)*p->ai
19c80 52 6f 77 45 73 74 5b 30 5d 2f 28 32 2a 53 51 4c  RowEst[0]/(2*SQL
19c90 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
19ca0 53 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S).             
19cb0 20 20 2b 20 6e 4e 6f 74 46 6f 75 6e 64 2a 70 2d    + nNotFound*p-
19cc0 3e 61 69 52 6f 77 45 73 74 5b 31 5d 3b 0a 20 20  >aiRowEst[1];.  
19cd0 20 20 69 66 28 20 6e 52 6f 77 45 73 74 20 3e 20    if( nRowEst > 
19ce0 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 29  p->aiRowEst[0] )
19cf0 20 6e 52 6f 77 45 73 74 20 3d 20 70 2d 3e 61 69   nRowEst = p->ai
19d00 52 6f 77 45 73 74 5b 30 5d 3b 0a 20 20 20 20 2a  RowEst[0];.    *
19d10 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73 74 3b  pnRow = nRowEst;
19d20 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
19d30 28 22 49 4e 20 72 6f 77 20 65 73 74 69 6d 61 74  ("IN row estimat
19d40 65 3a 20 6e 53 70 61 6e 3d 25 64 2c 20 6e 53 69  e: nSpan=%d, nSi
19d50 6e 67 6c 65 3d 25 64 2c 20 6e 4e 6f 74 46 6f 75  ngle=%d, nNotFou
19d60 6e 64 3d 25 64 2c 20 65 73 74 3d 25 67 5c 6e 22  nd=%d, est=%g\n"
19d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19d80 20 20 20 6e 53 70 61 6e 2c 20 6e 53 69 6e 67 6c     nSpan, nSingl
19d90 65 2c 20 6e 4e 6f 74 46 6f 75 6e 64 2c 20 6e 52  e, nNotFound, nR
19da0 6f 77 45 73 74 29 29 3b 0a 20 20 7d 0a 20 20 73  owEst));.  }.  s
19db0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
19dc0 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pVal);.  return 
19dd0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
19de0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19df0 4e 41 42 4c 45 5f 53 54 41 54 32 29 20 2a 2f 0a  NABLE_STAT2) */.
19e00 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
19e10 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
19e20 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61   for accessing a
19e30 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
19e40 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  e.  Write the.**
19e50 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
19e60 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e   and its cost in
19e70 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74  to the WhereCost
19e80 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64   object supplied
19e90 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20   as the.** last 
19ea0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
19eb0 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
19ec0 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65   plan wins.  The
19ed0 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
19ee0 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
19ef0 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
19f00 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 65 64   disk I/O needed
19f10 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
19f20 72 65 71 75 65 73 74 65 64 20 72 65 73 75 6c 74  requested result
19f30 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
19f40 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
19f50 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
19f60 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
19f70 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
19f80 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
19f90 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
19fa0 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
19fb0 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
19fc0 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
19fd0 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
19fe0 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
19ff0 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
1a000 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
1a010 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
1a020 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
1a030 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
1a040 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
1a050 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
1a060 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58 45 44  e was an INDEXED
1a070 20 42 59 20 63 6c 61 75 73 65 20 28 70 53 72 63   BY clause (pSrc
1a080 2d 3e 70 49 6e 64 65 78 29 20 61 74 74 61 63 68  ->pIndex) attach
1a090 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ed to the table 
1a0a0 69 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  in.** the SQL st
1a0b0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68  atement, then th
1a0c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  is function only
1a0d0 20 63 6f 6e 73 69 64 65 72 73 20 70 6c 61 6e 73   considers plans
1a0e0 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e   using the .** n
1a0f0 61 6d 65 64 20 69 6e 64 65 78 2e 20 49 66 20 6e  amed index. If n
1a100 6f 20 73 75 63 68 20 70 6c 61 6e 20 69 73 20 66  o such plan is f
1a110 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 20 72  ound, then the r
1a120 65 74 75 72 6e 65 64 20 63 6f 73 74 20 69 73 0a  eturned cost is.
1a130 2a 2a 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  ** SQLITE_BIG_DB
1a140 4c 2e 20 49 66 20 61 20 70 6c 61 6e 20 69 73 20  L. If a plan is 
1a150 66 6f 75 6e 64 20 74 68 61 74 20 75 73 65 73 20  found that uses 
1a160 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c  the named index,
1a170 20 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 63 6f   .** then the co
1a180 73 74 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  st is calculated
1a190 20 69 6e 20 74 68 65 20 75 73 75 61 6c 20 77 61   in the usual wa
1a1a0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f  y..**.** If a NO
1a1b0 54 20 49 4e 44 45 58 45 44 20 63 6c 61 75 73 65  T INDEXED clause
1a1c0 20 28 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78   (pSrc->notIndex
1a1d0 65 64 21 3d 30 29 20 77 61 73 20 61 74 74 61 63  ed!=0) was attac
1a1e0 68 65 64 20 74 6f 20 74 68 65 20 74 61 62 6c 65  hed to the table
1a1f0 20 0a 2a 2a 20 69 6e 20 74 68 65 20 53 45 4c 45   .** in the SELE
1a200 43 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  CT statement, th
1a210 65 6e 20 6e 6f 20 69 6e 64 65 78 65 73 20 61 72  en no indexes ar
1a220 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f  e considered. Ho
1a230 77 65 76 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73  wever, the .** s
1a240 65 6c 65 63 74 65 64 20 70 6c 61 6e 20 6d 61 79  elected plan may
1a250 20 73 74 69 6c 6c 20 74 61 6b 65 20 61 64 76 61   still take adva
1a260 6e 74 61 67 65 20 6f 66 20 74 68 65 20 62 75 69  ntage of the bui
1a270 6c 74 2d 69 6e 20 72 6f 77 69 64 20 70 72 69 6d  lt-in rowid prim
1a280 61 72 79 20 6b 65 79 0a 2a 2a 20 69 6e 64 65 78  ary key.** index
1a290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a2a0 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
1a2b0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1a2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a2d0 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1a2e0 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
1a2f0 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
1a300 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
1a310 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
1a320 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
1a330 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
1a340 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
1a350 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
1a360 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
1a370 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
1a380 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
1a390 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
1a3a0 66 6f 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a  for indexing */.
1a3b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c    Bitmask notVal
1a3c0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  id,           /*
1a3d0 20 43 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61   Cursors not ava
1a3e0 69 6c 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70  ilable for any p
1a3f0 75 72 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72  urpose */.  Expr
1a400 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
1a410 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f          /* The O
1a420 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
1a430 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44  /.  ExprList *pD
1a440 69 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20  istinct,        
1a450 2f 2a 20 54 68 65 20 73 65 6c 65 63 74 2d 6c 69  /* The select-li
1a460 73 74 20 69 66 20 71 75 65 72 79 20 69 73 20 44  st if query is D
1a470 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 57 68 65  ISTINCT */.  Whe
1a480 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
1a490 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
1a4a0 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
1a4b0 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  an */.){.  int i
1a4c0 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
1a4d0 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
1a4e0 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
1a4f0 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
1a500 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
1a510 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
1a520 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
1a530 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
1a540 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
1a550 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a560 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f   /* Copy of pPro
1a570 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20  be, or zero for 
1a580 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  IPK index */.  i
1a590 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20  nt eqTermMask;  
1a5a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1a5b0 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61  rrent mask of va
1a5c0 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
1a5d0 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
1a5e0 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20  idxEqTermMask;  
1a5f0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1a600 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
1a610 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
1a620 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  s */.  Index sPk
1a630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a640 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
1a650 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
1a660 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
1a670 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
1a680 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 2f  aiRowEstPk[2]; /
1a690 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
1a6a0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1a6b0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1a6c0 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  t aiColumnPk = -
1a6d0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
1a6e0 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
1a6f0 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
1a700 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c  ex */.  int wsFl
1a710 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  agMask;         
1a720 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66      /* Allowed f
1a730 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e 70  lags in pCost->p
1a740 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20  lan.wsFlag */.. 
1a750 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a760 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
1a770 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
1a780 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c  .  memset(pCost,
1a790 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73   0, sizeof(*pCos
1a7a0 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72 43  t));.  pCost->rC
1a7b0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
1a7c0 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  _DBL;..  /* If t
1a7d0 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73  he pSrc table is
1a7e0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1a7f0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
1a800 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a  then we may not.
1a810 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65    ** use an inde
1a820 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20  x to satisfy IS 
1a830 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
1a840 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   on that table. 
1a850 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65   This is.  ** be
1a860 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69  cause columns mi
1a870 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
1a880 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62   NULL if the tab
1a890 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  le does not matc
1a8a0 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75  h -.  ** a circu
1a8b0 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68  mstance which th
1a8c0 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  e index cannot h
1a8d0 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e  elp us discover.
1a8e0 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a    Ticket #2177..
1a8f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d    */.  if( pSrc-
1a900 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
1a910 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71  EFT ){.    idxEq
1a920 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
1a930 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_IN;.  }else{
1a940 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61  .    idxEqTermMa
1a950 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
1a960 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a  |WO_ISNULL;.  }.
1a970 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
1a980 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
1a990 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1a9a0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
1a9b0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
1a9c0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49  to use */.    pI
1a9d0 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53  dx = pProbe = pS
1a9e0 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  rc->pIndex;.    
1a9f0 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
1aa00 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
1aa10 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
1aa20 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
1aa30 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
1aa40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1aa50 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
1aa60 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
1aa70 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
1aa80 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 69 6e 20  Index object in 
1aa90 6c 6f 63 61 6c 0a 20 20 20 20 2a 2a 20 76 61 72  local.    ** var
1aaa0 69 61 62 6c 65 20 73 50 6b 20 74 6f 20 72 65 70  iable sPk to rep
1aab0 72 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64  resent the rowid
1aac0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64   primary key ind
1aad0 65 78 2e 20 20 4d 61 6b 65 20 74 68 69 73 0a 20  ex.  Make this. 
1aae0 20 20 20 2a 2a 20 66 61 6b 65 20 69 6e 64 65 78     ** fake index
1aaf0 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61 20   the first in a 
1ab00 63 68 61 69 6e 20 6f 66 20 49 6e 64 65 78 20 6f  chain of Index o
1ab10 62 6a 65 63 74 73 20 77 69 74 68 20 61 6c 6c 20  bjects with all 
1ab20 6f 66 20 74 68 65 20 72 65 61 6c 0a 20 20 20 20  of the real.    
1ab30 2a 2a 20 69 6e 64 69 63 65 73 20 74 6f 20 66 6f  ** indices to fo
1ab40 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 49 6e 64 65  llow */.    Inde
1ab50 78 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20  x *pFirst;      
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1ab70 69 72 73 74 20 6f 66 20 72 65 61 6c 20 69 6e 64  irst of real ind
1ab80 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
1ab90 65 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  e */.    memset(
1aba0 26 73 50 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sPk, 0, sizeof(
1abb0 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 73 50 6b  Index));.    sPk
1abc0 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20 20  .nColumn = 1;.  
1abd0 20 20 73 50 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d    sPk.aiColumn =
1abe0 20 26 61 69 43 6f 6c 75 6d 6e 50 6b 3b 0a 20 20   &aiColumnPk;.  
1abf0 20 20 73 50 6b 2e 61 69 52 6f 77 45 73 74 20 3d    sPk.aiRowEst =
1ac00 20 61 69 52 6f 77 45 73 74 50 6b 3b 0a 20 20 20   aiRowEstPk;.   
1ac10 20 73 50 6b 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f   sPk.onError = O
1ac20 45 5f 52 65 70 6c 61 63 65 3b 0a 20 20 20 20 73  E_Replace;.    s
1ac30 50 6b 2e 70 54 61 62 6c 65 20 3d 20 70 53 72 63  Pk.pTable = pSrc
1ac40 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 69 52 6f  ->pTab;.    aiRo
1ac50 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70 53 72 63  wEstPk[0] = pSrc
1ac60 2d 3e 70 54 61 62 2d 3e 6e 52 6f 77 45 73 74 3b  ->pTab->nRowEst;
1ac70 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
1ac80 31 5d 20 3d 20 31 3b 0a 20 20 20 20 70 46 69 72  1] = 1;.    pFir
1ac90 73 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d  st = pSrc->pTab-
1aca0 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69 66 28  >pIndex;.    if(
1acb0 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65   pSrc->notIndexe
1acc0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  d==0 ){.      /*
1acd0 20 54 68 65 20 72 65 61 6c 20 69 6e 64 69 63 65   The real indice
1ace0 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 61  s of the table a
1acf0 72 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  re only consider
1ad00 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 20 20  ed if the.      
1ad10 2a 2a 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 71  ** NOT INDEXED q
1ad20 75 61 6c 69 66 69 65 72 20 69 73 20 6f 6d 69 74  ualifier is omit
1ad30 74 65 64 20 66 72 6f 6d 20 74 68 65 20 46 52 4f  ted from the FRO
1ad40 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20  M clause */.    
1ad50 20 20 73 50 6b 2e 70 4e 65 78 74 20 3d 20 70 46    sPk.pNext = pF
1ad60 69 72 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  irst;.    }.    
1ad70 70 50 72 6f 62 65 20 3d 20 26 73 50 6b 3b 0a 20  pProbe = &sPk;. 
1ad80 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20     wsFlagMask = 
1ad90 7e 28 0a 20 20 20 20 20 20 20 20 57 48 45 52 45  ~(.        WHERE
1ada0 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1adb0 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1adc0 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45  _COLUMN_NULL|WHE
1add0 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a  RE_COLUMN_RANGE.
1ade0 20 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72      );.    eqTer
1adf0 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f  mMask = WO_EQ|WO
1ae00 5f 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20  _IN;.    pIdx = 
1ae10 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f  0;.  }..  /* Loo
1ae20 70 20 6f 76 65 72 20 61 6c 6c 20 69 6e 64 69 63  p over all indic
1ae30 65 73 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 74  es looking for t
1ae40 68 65 20 62 65 73 74 20 6f 6e 65 20 74 6f 20 75  he best one to u
1ae50 73 65 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b 20  se.  */.  for(; 
1ae60 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50 72  pProbe; pIdx=pPr
1ae70 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
1ae80 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  t){.    const un
1ae90 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f 6e  signed int * con
1aea0 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50  st aiRowEst = pP
1aeb0 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  robe->aiRowEst;.
1aec0 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aee0 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
1aef0 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64   pProbe */.    d
1af00 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20  ouble nRow;     
1af10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
1af20 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
1af30 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74  f rows in result
1af40 20 73 65 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62   set */.    doub
1af50 6c 65 20 6c 6f 67 31 30 4e 3b 20 20 20 20 20 20  le log10N;      
1af60 20 20 20 20 20 20 20 20 2f 2a 20 62 61 73 65 2d          /* base-
1af70 31 30 20 6c 6f 67 61 72 69 74 68 6d 20 6f 66 20  10 logarithm of 
1af80 6e 52 6f 77 20 28 69 6e 65 78 61 63 74 29 20 2a  nRow (inexact) *
1af90 2f 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20  /.    int rev;  
1afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afb0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61    /* True to sca
1afc0 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  n in reverse ord
1afd0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73  er */.    int ws
1afe0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42  Flags = 0;.    B
1aff0 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b  itmask used = 0;
1b000 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ..    /* The fol
1b010 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
1b020 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62   are populated b
1b030 61 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70  ased on the prop
1b040 65 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a  erties of.    **
1b050 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1b060 6c 75 61 74 65 64 2e 20 54 68 65 79 20 61 72 65  luated. They are
1b070 20 74 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65   then used to de
1b080 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65  termine the expe
1b090 63 74 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74  cted.    ** cost
1b0a0 20 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72   and number of r
1b0b0 6f 77 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  ows returned..  
1b0c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71    **.    **  nEq
1b0d0 3a 20 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d  : .    **    Num
1b0e0 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
1b0f0 74 65 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62  terms that can b
1b100 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73  e implemented us
1b110 69 6e 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  ing the index.. 
1b120 20 20 20 2a 2a 20 20 20 20 49 6e 20 6f 74 68 65     **    In othe
1b130 72 20 77 6f 72 64 73 2c 20 74 68 65 20 6e 75 6d  r words, the num
1b140 62 65 72 20 6f 66 20 69 6e 69 74 69 61 6c 20 66  ber of initial f
1b150 69 65 6c 64 73 20 69 6e 20 74 68 65 20 69 6e 64  ields in the ind
1b160 65 78 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20  ex that.    **  
1b170 20 20 61 72 65 20 75 73 65 64 20 69 6e 20 3d 3d    are used in ==
1b180 20 6f 72 20 49 4e 20 6f 72 20 4e 4f 54 20 4e 55   or IN or NOT NU
1b190 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  LL constraints o
1b1a0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
1b1b0 73 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  se..    **.    *
1b1c0 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20  *  nInMul:  .   
1b1d0 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d   **    The "in-m
1b1e0 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73  ultiplier". This
1b1f0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
1b200 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b  of how many seek
1b210 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20   operations .   
1b220 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
1b230 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68  st perform on th
1b240 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74  e index in quest
1b250 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
1b260 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
1b270 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65      WHERE clause
1b280 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   is:.    **.    
1b290 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
1b2a0 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44  IN (1, 2, 3) AND
1b2b0 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a   b IN (4, 5, 6).
1b2c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b2d0 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
1b2e0 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f  form 9 lookups o
1b2f0 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  n an index on (a
1b300 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20  , b), so nInMul 
1b310 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65  is .    **    se
1b320 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68  t to 9. Given th
1b330 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e  e same schema an
1b340 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  d either of the 
1b350 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20  following WHERE 
1b360 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73  .    **    claus
1b370 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
1b380 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d  *      WHERE a =
1b390 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20    1.    **      
1b3a0 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20  WHERE a >= 2.   
1b3b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49   **.    **    nI
1b3c0 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31  nMul is set to 1
1b3d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b3e0 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73     If there exis
1b3f0 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20  ts a WHERE term 
1b400 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49  of the form "x I
1b410 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c  N (SELECT ...)",
1b420 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20   then .    **   
1b430 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
1b440 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65  is assumed to re
1b450 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72  turn 25 rows for
1b460 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
1b470 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65   .    **    dete
1b480 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a  rmining nInMul..
1b490 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1b4a0 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20  InEst:  .    ** 
1b4b0 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69     Set to true i
1b4c0 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c  f there was at l
1b4d0 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28  east one "x IN (
1b4e0 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72  SELECT ...)" ter
1b4f0 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20  m used .    **  
1b500 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67    in determining
1b510 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49   the value of nI
1b520 6e 4d 75 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  nMul.  Note that
1b530 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 0a   the RHS of the.
1b540 20 20 20 20 2a 2a 20 20 20 20 49 4e 20 6f 70 65      **    IN ope
1b550 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 61 20  rator must be a 
1b560 53 45 4c 45 43 54 2c 20 6e 6f 74 20 61 20 76 61  SELECT, not a va
1b570 6c 75 65 20 6c 69 73 74 2c 20 66 6f 72 20 74 68  lue list, for th
1b580 69 73 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  is variable.    
1b590 2a 2a 20 20 20 20 74 6f 20 62 65 20 74 72 75 65  **    to be true
1b5a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b5b0 20 65 73 74 42 6f 75 6e 64 3a 0a 20 20 20 20 2a   estBound:.    *
1b5c0 2a 20 20 20 20 41 6e 20 65 73 74 69 6d 61 74 65  *    An estimate
1b5d0 20 6f 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   on the amount o
1b5e0 66 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  f the table that
1b5f0 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1b600 64 2e 20 20 41 0a 20 20 20 20 2a 2a 20 20 20 20  d.  A.    **    
1b610 76 61 6c 75 65 20 6f 66 20 31 30 30 20 6d 65 61  value of 100 mea
1b620 6e 73 20 74 68 65 20 65 6e 74 69 72 65 20 74 61  ns the entire ta
1b630 62 6c 65 20 69 73 20 73 65 61 72 63 68 65 64 2e  ble is searched.
1b640 20 20 52 61 6e 67 65 20 63 6f 6e 73 74 72 61 69    Range constrai
1b650 6e 74 73 0a 20 20 20 20 2a 2a 20 20 20 20 6d 69  nts.    **    mi
1b660 67 68 74 20 72 65 64 75 63 65 20 74 68 69 73 20  ght reduce this 
1b670 74 6f 20 61 20 76 61 6c 75 65 20 6c 65 73 73 20  to a value less 
1b680 74 68 61 6e 20 31 30 30 20 74 6f 20 69 6e 64 69  than 100 to indi
1b690 63 61 74 65 20 74 68 61 74 20 6f 6e 6c 79 0a 20  cate that only. 
1b6a0 20 20 20 2a 2a 20 20 20 20 61 20 66 72 61 63 74     **    a fract
1b6b0 69 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ion of the table
1b6c0 20 6e 65 65 64 73 20 73 65 61 72 63 68 69 6e 67   needs searching
1b6d0 2e 20 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  .  In the absenc
1b6e0 65 20 6f 66 0a 20 20 20 20 2a 2a 20 20 20 20 73  e of.    **    s
1b6f0 71 6c 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c  qlite_stat2 ANAL
1b700 59 5a 45 20 64 61 74 61 2c 20 61 20 73 69 6e 67  YZE data, a sing
1b710 6c 65 20 69 6e 65 71 75 61 6c 69 74 79 20 72 65  le inequality re
1b720 64 75 63 65 73 20 74 68 65 20 73 65 61 72 63 68  duces the search
1b730 0a 20 20 20 20 2a 2a 20 20 20 20 73 70 61 63 65  .    **    space
1b740 20 74 6f 20 31 2f 34 72 64 20 69 74 73 20 6f 72   to 1/4rd its or
1b750 69 67 69 6e 61 6c 20 73 69 7a 65 2e 20 20 53 6f  iginal size.  So
1b760 20 61 6e 20 78 3e 3f 20 63 6f 6e 73 74 72 61 69   an x>? constrai
1b770 6e 74 20 72 65 64 75 63 65 73 0a 20 20 20 20 2a  nt reduces.    *
1b780 2a 20 20 20 20 65 73 74 42 6f 75 6e 64 20 74 6f  *    estBound to
1b790 20 32 35 2e 20 20 54 77 6f 20 63 6f 6e 73 74 72   25.  Two constr
1b7a0 61 69 6e 74 73 20 28 78 3e 3f 20 41 4e 44 20 78  aints (x>? AND x
1b7b0 3c 3f 29 20 72 65 64 75 63 65 20 65 73 74 42 6f  <?) reduce estBo
1b7c0 75 6e 64 20 74 6f 20 36 2e 0a 20 20 20 20 2a 2a  und to 6..    **
1b7d0 0a 20 20 20 20 2a 2a 20 20 62 53 6f 72 74 3a 20  .    **  bSort: 
1b7e0 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f    .    **    Boo
1b7f0 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 74 68  lean. True if th
1b800 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
1b810 42 59 20 63 6c 61 75 73 65 20 74 68 61 74 20 77  BY clause that w
1b820 69 6c 6c 20 72 65 71 75 69 72 65 20 61 6e 20 0a  ill require an .
1b830 20 20 20 20 2a 2a 20 20 20 20 65 78 74 65 72 6e      **    extern
1b840 61 6c 20 73 6f 72 74 20 28 69 2e 65 2e 20 73 63  al sort (i.e. sc
1b850 61 6e 6e 69 6e 67 20 74 68 65 20 69 6e 64 65 78  anning the index
1b860 20 62 65 69 6e 67 20 65 76 61 6c 75 61 74 65 64   being evaluated
1b870 20 77 69 6c 6c 20 6e 6f 74 20 0a 20 20 20 20 2a   will not .    *
1b880 2a 20 20 20 20 63 6f 72 72 65 63 74 6c 79 20 6f  *    correctly o
1b890 72 64 65 72 20 72 65 63 6f 72 64 73 29 2e 0a 20  rder records).. 
1b8a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 4c     **.    **  bL
1b8b0 6f 6f 6b 75 70 3a 20 0a 20 20 20 20 2a 2a 20 20  ookup: .    **  
1b8c0 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20    Boolean. True 
1b8d0 69 66 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75  if a table looku
1b8e0 70 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f  p is required fo
1b8f0 72 20 65 61 63 68 20 69 6e 64 65 78 20 65 6e 74  r each index ent
1b900 72 79 0a 20 20 20 20 2a 2a 20 20 20 20 76 69 73  ry.    **    vis
1b910 69 74 65 64 2e 20 20 49 6e 20 6f 74 68 65 72 20  ited.  In other 
1b920 77 6f 72 64 73 2c 20 74 72 75 65 20 69 66 20 74  words, true if t
1b930 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6f 76  his is not a cov
1b940 65 72 69 6e 67 20 69 6e 64 65 78 2e 0a 20 20 20  ering index..   
1b950 20 2a 2a 20 20 20 20 54 68 69 73 20 69 73 20 61   **    This is a
1b960 6c 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20  lways false for 
1b970 74 68 65 20 72 6f 77 69 64 20 70 72 69 6d 61 72  the rowid primar
1b980 79 20 6b 65 79 20 69 6e 64 65 78 20 6f 66 20 61  y key index of a
1b990 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 20   table..    **  
1b9a0 20 20 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65    For other inde
1b9b0 78 65 73 2c 20 69 74 20 69 73 20 74 72 75 65 20  xes, it is true 
1b9c0 75 6e 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 63  unless all the c
1b9d0 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 74 61  olumns of the ta
1b9e0 62 6c 65 0a 20 20 20 20 2a 2a 20 20 20 20 75 73  ble.    **    us
1b9f0 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
1ba00 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70   statement are p
1ba10 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 69 6e  resent in the in
1ba20 64 65 78 20 28 73 75 63 68 20 61 6e 0a 20 20 20  dex (such an.   
1ba30 20 2a 2a 20 20 20 20 69 6e 64 65 78 20 69 73 20   **    index is 
1ba40 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
1ba50 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
1ba60 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
1ba70 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
1ba80 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
1ba90 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
1baa0 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
1bab0 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
1bac0 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
1bad0 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
1bae0 74 72 65 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  tree lookups in 
1baf0 6f 72 64 65 72 20 74 6f 20 66 69 6e 64 20 74 68  order to find th
1bb00 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 20  e value.    **  
1bb10 20 20 6f 66 20 63 6f 6c 75 6d 6e 20 63 2c 20 62    of column c, b
1bb20 75 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65  ut the first doe
1bb30 73 20 6e 6f 74 20 62 65 63 61 75 73 65 20 63 6f  s not because co
1bb40 6c 75 6d 6e 73 20 61 20 61 6e 64 20 62 20 61 72  lumns a and b ar
1bb50 65 0a 20 20 20 20 2a 2a 20 20 20 20 62 6f 74 68  e.    **    both
1bb60 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
1bb70 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  e index..    **.
1bb80 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
1bb90 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 20 20     SELECT a, b  
1bba0 20 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45    FROM tbl WHERE
1bbb0 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20   a = 1;.    **  
1bbc0 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45 43             SELEC
1bbd0 54 20 61 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74  T a, b, c FROM t
1bbe0 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a  bl WHERE a = 1;.
1bbf0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e      */.    int n
1bc00 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1bc10 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1bc20 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
1bc30 65 72 6d 73 20 6d 61 74 63 68 69 6e 67 20 69 6e  erms matching in
1bc40 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  dex */.    int b
1bc50 49 6e 45 73 74 20 3d 20 30 3b 20 20 20 20 20 20  InEst = 0;      
1bc60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1bc70 20 69 66 20 22 78 20 49 4e 20 28 53 45 4c 45 43   if "x IN (SELEC
1bc80 54 2e 2e 2e 29 22 20 73 65 65 6e 20 2a 2f 0a 20  T...)" seen */. 
1bc90 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20 3d 20     int nInMul = 
1bca0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1bcb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 69   /* Number of di
1bcc0 73 74 69 6e 63 74 20 65 71 75 61 6c 69 74 69 65  stinct equalitie
1bcd0 73 20 74 6f 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20  s to lookup */. 
1bce0 20 20 20 69 6e 74 20 65 73 74 42 6f 75 6e 64 20     int estBound 
1bcf0 3d 20 31 30 30 3b 20 20 20 20 20 20 20 20 20 20  = 100;          
1bd00 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 72 65   /* Estimated re
1bd10 64 75 63 74 69 6f 6e 20 69 6e 20 73 65 61 72 63  duction in searc
1bd20 68 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  h space */.    i
1bd30 6e 74 20 6e 42 6f 75 6e 64 20 3d 20 30 3b 20 20  nt nBound = 0;  
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bd50 4e 75 6d 62 65 72 20 6f 66 20 72 61 6e 67 65 20  Number of range 
1bd60 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 65 65 6e  constraints seen
1bd70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 6f 72   */.    int bSor
1bd80 74 20 3d 20 21 21 70 4f 72 64 65 72 42 79 3b 20  t = !!pOrderBy; 
1bd90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1bda0 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 72   external sort r
1bdb0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
1bdc0 6e 74 20 62 44 69 73 74 20 3d 20 21 21 70 44 69  nt bDist = !!pDi
1bdd0 73 74 69 6e 63 74 3b 20 20 20 20 20 20 2f 2a 20  stinct;      /* 
1bde0 54 72 75 65 20 69 66 20 69 6e 64 65 78 20 63 61  True if index ca
1bdf0 6e 6e 6f 74 20 68 65 6c 70 20 77 69 74 68 20 44  nnot help with D
1be00 49 53 54 49 4e 43 54 20 2a 2f 0a 20 20 20 20 69  ISTINCT */.    i
1be10 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b 20  nt bLookup = 0; 
1be20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1be30 54 72 75 65 20 69 66 20 6e 6f 74 20 61 20 63 6f  True if not a co
1be40 76 65 72 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a  vering index */.
1be50 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1be60 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  Term;           
1be70 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65    /* A single te
1be80 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
1be90 63 6c 61 75 73 65 20 2a 2f 0a 23 69 66 64 65 66  clause */.#ifdef
1bea0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1beb0 54 41 54 32 0a 20 20 20 20 57 68 65 72 65 54 65  TAT2.    WhereTe
1bec0 72 6d 20 2a 70 46 69 72 73 74 54 65 72 6d 20 3d  rm *pFirstTerm =
1bed0 20 30 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20   0;    /* First 
1bee0 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 74 68  term matching th
1bef0 65 20 69 6e 64 65 78 20 2a 2f 0a 23 65 6e 64 69  e index */.#endi
1bf00 66 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  f..    /* Determ
1bf10 69 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ine the values o
1bf20 66 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c  f nEq and nInMul
1bf30 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d   */.    for(nEq=
1bf40 30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e  0; nEq<pProbe->n
1bf50 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a  Column; nEq++){.
1bf60 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
1bf70 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
1bf80 45 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  Eq];.      pTerm
1bf90 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
1bfa0 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61   iCur, j, notRea
1bfb0 64 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20  dy, eqTermMask, 
1bfc0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28  pIdx);.      if(
1bfd0 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
1bfe0 6b 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  k;.      wsFlags
1bff0 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d   |= (WHERE_COLUM
1c000 4e 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  N_EQ|WHERE_ROWID
1c010 5f 45 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20  _EQ);.      if( 
1c020 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
1c030 20 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20   & WO_IN ){.    
1c040 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
1c050 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
1c060 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
1c070 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  |= WHERE_COLUMN_
1c080 49 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  IN;.        if( 
1c090 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1c0a0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
1c0b0 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ect) ){.        
1c0c0 20 20 2f 2a 20 22 78 20 49 4e 20 28 53 45 4c 45    /* "x IN (SELE
1c0d0 43 54 20 2e 2e 2e 29 22 3a 20 20 41 73 73 75 6d  CT ...)":  Assum
1c0e0 65 20 74 68 65 20 53 45 4c 45 43 54 20 72 65 74  e the SELECT ret
1c0f0 75 72 6e 73 20 32 35 20 72 6f 77 73 20 2a 2f 0a  urns 25 rows */.
1c100 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c            nInMul
1c110 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
1c120 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20 20    bInEst = 1;.  
1c130 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c140 41 4c 57 41 59 53 28 70 45 78 70 72 2d 3e 78 2e  ALWAYS(pExpr->x.
1c150 70 4c 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e  pList && pExpr->
1c160 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 29 20  x.pList->nExpr) 
1c170 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1c180 22 78 20 49 4e 20 28 76 61 6c 75 65 2c 20 76 61  "x IN (value, va
1c190 6c 75 65 2c 20 2e 2e 2e 29 22 20 2a 2f 0a 20 20  lue, ...)" */.  
1c1a0 20 20 20 20 20 20 20 20 6e 49 6e 4d 75 6c 20 2a          nInMul *
1c1b0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
1c1c0 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->nExpr;.       
1c1d0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
1c1e0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1c1f0 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20  tor & WO_ISNULL 
1c200 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61  ){.        wsFla
1c210 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
1c220 4d 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  MN_NULL;.      }
1c230 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1c240 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20  NABLE_STAT2.    
1c250 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26 20    if( nEq==0 && 
1c260 70 50 72 6f 62 65 2d 3e 61 53 61 6d 70 6c 65 20  pProbe->aSample 
1c270 29 20 70 46 69 72 73 74 54 65 72 6d 20 3d 20 70  ) pFirstTerm = p
1c280 54 65 72 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Term;.#endif.   
1c290 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65 72 6d     used |= pTerm
1c2a0 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20  ->prereqRight;. 
1c2b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74     }..    /* Det
1c2c0 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75 65  ermine the value
1c2d0 20 6f 66 20 65 73 74 42 6f 75 6e 64 2e 20 2a 2f   of estBound. */
1c2e0 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
1c2f0 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20  obe->nColumn && 
1c300 70 50 72 6f 62 65 2d 3e 62 55 6e 6f 72 64 65 72  pProbe->bUnorder
1c310 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ed==0 ){.      i
1c320 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
1c330 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
1c340 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
1c350 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
1c360 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
1c370 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
1c380 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20 20 20  , pIdx) ){.     
1c390 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54     WhereTerm *pT
1c3a0 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  op = findTerm(pW
1c3b0 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
1c3c0 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
1c3d0 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  E, pIdx);.      
1c3e0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 42 74    WhereTerm *pBt
1c3f0 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
1c400 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65  , iCur, j, notRe
1c410 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
1c420 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
1c430 20 77 68 65 72 65 52 61 6e 67 65 53 63 61 6e 45   whereRangeScanE
1c440 73 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62  st(pParse, pProb
1c450 65 2c 20 6e 45 71 2c 20 70 42 74 6d 2c 20 70 54  e, nEq, pBtm, pT
1c460 6f 70 2c 20 26 65 73 74 42 6f 75 6e 64 29 3b 0a  op, &estBound);.
1c470 20 20 20 20 20 20 20 20 69 66 28 20 70 54 6f 70          if( pTop
1c480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42   ){.          nB
1c490 6f 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ound = 1;.      
1c4a0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
1c4b0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
1c4c0 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c            used |
1c4d0 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69  = pTop->prereqRi
1c4e0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ght;.        }. 
1c4f0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20         if( pBtm 
1c500 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 6f  ){.          nBo
1c510 75 6e 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  und++;.         
1c520 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1c530 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
1c540 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70         used |= p
1c550 42 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  Btm->prereqRight
1c560 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c570 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28      wsFlags |= (
1c580 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1c590 47 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  GE|WHERE_ROWID_R
1c5a0 41 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ANGE);.      }. 
1c5b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72     }else if( pPr
1c5c0 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  obe->onError!=OE
1c5d0 5f 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74  _None ){.      t
1c5e0 65 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73  estcase( wsFlags
1c5f0 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
1c600 49 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  IN );.      test
1c610 63 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20  case( wsFlags & 
1c620 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c  WHERE_COLUMN_NUL
1c630 4c 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  L );.      if( (
1c640 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
1c650 5f 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45  _COLUMN_IN|WHERE
1c660 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d  _COLUMN_NULL))==
1c670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1c680 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e  lags |= WHERE_UN
1c690 49 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  IQUE;.      }.  
1c6a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
1c6b0 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
1c6c0 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
1c6d0 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63  he index being c
1c6e0 6f 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20  onsidered will. 
1c6f0 20 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20     ** naturally 
1c700 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65  scan rows in the
1c710 20 72 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c   required order,
1c720 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
1c730 69 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a  iate flags.    *
1c740 2a 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74  * in wsFlags. Ot
1c750 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72  herwise, if ther
1c760 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  e is an ORDER BY
1c770 20 63 6c 61 75 73 65 20 62 75 74 20 74 68 65 20   clause but the 
1c780 69 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c  index.    ** wil
1c790 6c 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61  l scan rows in a
1c7a0 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
1c7b0 2c 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 20  , set the bSort 
1c7c0 76 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20  variable.  */.  
1c7d0 20 20 69 66 28 20 69 73 53 6f 72 74 69 6e 67 49    if( isSortingI
1c7e0 6e 64 65 78 28 0a 20 20 20 20 20 20 20 20 20 20  ndex(.          
1c7f0 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 70 4d 61  pParse, pWC->pMa
1c800 73 6b 53 65 74 2c 20 70 50 72 6f 62 65 2c 20 69  skSet, pProbe, i
1c810 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 6e  Cur, pOrderBy, n
1c820 45 71 2c 20 77 73 46 6c 61 67 73 2c 20 26 72 65  Eq, wsFlags, &re
1c830 76 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  v).    ){.      
1c840 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 20  bSort = 0;.     
1c850 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1c860 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c 57 48  E_ROWID_RANGE|WH
1c870 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45  ERE_COLUMN_RANGE
1c880 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a  |WHERE_ORDERBY;.
1c890 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
1c8a0 20 28 72 65 76 20 3f 20 57 48 45 52 45 5f 52 45   (rev ? WHERE_RE
1c8b0 56 45 52 53 45 20 3a 20 30 29 3b 0a 20 20 20 20  VERSE : 0);.    
1c8c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
1c8d0 72 65 20 69 73 20 61 20 44 49 53 54 49 4e 43 54  re is a DISTINCT
1c8e0 20 71 75 61 6c 69 66 69 65 72 20 61 6e 64 20 74   qualifier and t
1c8f0 68 69 73 20 69 6e 64 65 78 20 77 69 6c 6c 20 73  his index will s
1c900 63 61 6e 20 72 6f 77 73 20 69 6e 0a 20 20 20 20  can rows in.    
1c910 2a 2a 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ** order of the 
1c920 44 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73  DISTINCT express
1c930 69 6f 6e 73 2c 20 63 6c 65 61 72 20 62 44 69 73  ions, clear bDis
1c940 74 20 61 6e 64 20 73 65 74 20 74 68 65 20 61 70  t and set the ap
1c950 70 72 6f 70 72 69 61 74 65 0a 20 20 20 20 2a 2a  propriate.    **
1c960 20 66 6c 61 67 73 20 69 6e 20 77 73 46 6c 61 67   flags in wsFlag
1c970 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73  s. */.    if( is
1c980 44 69 73 74 69 6e 63 74 49 6e 64 65 78 28 70 50  DistinctIndex(pP
1c990 61 72 73 65 2c 20 70 57 43 2c 20 70 50 72 6f 62  arse, pWC, pProb
1c9a0 65 2c 20 69 43 75 72 2c 20 70 44 69 73 74 69 6e  e, iCur, pDistin
1c9b0 63 74 2c 20 6e 45 71 29 20 29 7b 0a 20 20 20 20  ct, nEq) ){.    
1c9c0 20 20 62 44 69 73 74 20 3d 20 30 3b 0a 20 20 20    bDist = 0;.   
1c9d0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1c9e0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 7c  ERE_ROWID_RANGE|
1c9f0 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e  WHERE_COLUMN_RAN
1ca00 47 45 7c 57 48 45 52 45 5f 44 49 53 54 49 4e 43  GE|WHERE_DISTINC
1ca10 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  T;.    }..    /*
1ca20 20 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61   If currently ca
1ca30 6c 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f  lculating the co
1ca40 73 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69  st of using an i
1ca50 6e 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50  ndex (not the IP
1ca60 4b 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c  K.    ** index),
1ca70 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c   determine if al
1ca80 6c 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d  l required colum
1ca90 6e 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62  n data may be ob
1caa0 74 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a  tained without .
1cab0 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65      ** using the
1cac0 20 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65   main table (i.e
1cad0 2e 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69  . if the index i
1cae0 73 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20  s a covering.   
1caf0 20 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68   ** index for th
1cb00 69 73 20 71 75 65 72 79 29 2e 20 49 66 20 69 74  is query). If it
1cb10 20 69 73 2c 20 73 65 74 20 74 68 65 20 57 48 45   is, set the WHE
1cb20 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67  RE_IDX_ONLY flag
1cb30 20 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61   in.    ** wsFla
1cb40 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  gs. Otherwise, s
1cb50 65 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76  et the bLookup v
1cb60 61 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e  ariable to true.
1cb70 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64    */.    if( pId
1cb80 78 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b 0a  x && wsFlags ){.
1cb90 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
1cba0 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b  = pSrc->colUsed;
1cbb0 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
1cbc0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
1cbd0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
1cbe0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
1cbf0 78 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  x = pIdx->aiColu
1cc00 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69  mn[j];.        i
1cc10 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
1cc20 20 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28          m &= ~((
1cc30 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b  (Bitmask)1)<<x);
1cc40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1cc50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d   }.      if( m==
1cc60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46  0 ){.        wsF
1cc70 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44  lags |= WHERE_ID
1cc80 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  X_ONLY;.      }e
1cc90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f  lse{.        bLo
1cca0 6f 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20  okup = 1;.      
1ccb0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
1ccc0 20 20 20 20 2a 2a 20 45 73 74 69 6d 61 74 65 20      ** Estimate 
1ccd0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
1cce0 77 73 20 6f 66 20 6f 75 74 70 75 74 2e 20 20 46  ws of output.  F
1ccf0 6f 72 20 61 6e 20 22 78 20 49 4e 20 28 53 45 4c  or an "x IN (SEL
1cd00 45 43 54 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20  ECT...)".    ** 
1cd10 63 6f 6e 73 74 72 61 69 6e 74 2c 20 64 6f 20 6e  constraint, do n
1cd20 6f 74 20 6c 65 74 20 74 68 65 20 65 73 74 69 6d  ot let the estim
1cd30 61 74 65 20 65 78 63 65 65 64 20 68 61 6c 66 20  ate exceed half 
1cd40 74 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20  the rows in the 
1cd50 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
1cd60 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65    nRow = (double
1cd70 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20  )(aiRowEst[nEq] 
1cd80 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69  * nInMul);.    i
1cd90 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52 6f  f( bInEst && nRo
1cda0 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  w*2>aiRowEst[0] 
1cdb0 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  ){.      nRow = 
1cdc0 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20  aiRowEst[0]/2;. 
1cdd0 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 28 69       nInMul = (i
1cde0 6e 74 29 28 6e 52 6f 77 20 2f 20 61 69 52 6f 77  nt)(nRow / aiRow
1cdf0 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20 7d  Est[nEq]);.    }
1ce00 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1ce10 45 4e 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20  ENABLE_STAT2.   
1ce20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 73 74   /* If the const
1ce30 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20  raint is of the 
1ce40 66 6f 72 6d 20 78 3d 56 41 4c 55 45 20 6f 72 20  form x=VALUE or 
1ce50 78 20 49 4e 20 28 45 31 2c 45 32 2c 2e 2e 2e 29  x IN (E1,E2,...)
1ce60 0a 20 20 20 20 2a 2a 20 61 6e 64 20 77 65 20 64  .    ** and we d
1ce70 6f 20 6e 6f 74 20 74 68 69 6e 6b 20 74 68 61 74  o not think that
1ce80 20 76 61 6c 75 65 73 20 6f 66 20 78 20 61 72 65   values of x are
1ce90 20 75 6e 69 71 75 65 20 61 6e 64 20 69 66 20 68   unique and if h
1cea0 69 73 74 6f 67 72 61 6d 0a 20 20 20 20 2a 2a 20  istogram.    ** 
1ceb0 64 61 74 61 20 69 73 20 61 76 61 69 6c 61 62 6c  data is availabl
1cec0 65 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 78 2c 20  e for column x, 
1ced0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 62 65  then it might be
1cee0 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1cef0 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
1cf00 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68 65   estimate on the
1cf10 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
1cf20 62 61 73 65 64 20 6f 6e 0a 20 20 20 20 2a 2a 20  based on.    ** 
1cf30 56 41 4c 55 45 20 61 6e 64 20 68 6f 77 20 63 6f  VALUE and how co
1cf40 6d 6d 6f 6e 20 74 68 61 74 20 76 61 6c 75 65 20  mmon that value 
1cf50 69 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  is according to 
1cf60 74 68 65 20 68 69 73 74 6f 67 72 61 6d 2e 0a 20  the histogram.. 
1cf70 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
1cf80 6f 77 3e 28 64 6f 75 62 6c 65 29 31 20 26 26 20  ow>(double)1 && 
1cf90 6e 45 71 3d 3d 31 20 26 26 20 70 46 69 72 73 74  nEq==1 && pFirst
1cfa0 54 65 72 6d 21 3d 30 20 26 26 20 61 69 52 6f 77  Term!=0 && aiRow
1cfb0 45 73 74 5b 31 5d 3e 31 20 29 7b 0a 20 20 20 20  Est[1]>1 ){.    
1cfc0 20 20 69 66 28 20 70 46 69 72 73 74 54 65 72 6d    if( pFirstTerm
1cfd0 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
1cfe0 4f 5f 45 51 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20  O_EQ|WO_ISNULL) 
1cff0 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  ){.        testc
1d000 61 73 65 28 20 70 46 69 72 73 74 54 65 72 6d 2d  ase( pFirstTerm-
1d010 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45  >eOperator==WO_E
1d020 51 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  Q );.        tes
1d030 74 63 61 73 65 28 20 70 46 69 72 73 74 54 65 72  tcase( pFirstTer
1d040 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
1d050 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  _ISNULL );.     
1d060 20 20 20 77 68 65 72 65 45 71 75 61 6c 53 63 61     whereEqualSca
1d070 6e 45 73 74 28 70 50 61 72 73 65 2c 20 70 50 72  nEst(pParse, pPr
1d080 6f 62 65 2c 20 70 46 69 72 73 74 54 65 72 6d 2d  obe, pFirstTerm-
1d090 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
1d0a0 26 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 65  &nRow);.      }e
1d0b0 6c 73 65 20 69 66 28 20 70 46 69 72 73 74 54 65  lse if( pFirstTe
1d0c0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1d0d0 4f 5f 49 4e 20 26 26 20 62 49 6e 45 73 74 3d 3d  O_IN && bInEst==
1d0e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 65  0 ){.        whe
1d0f0 72 65 49 6e 53 63 61 6e 45 73 74 28 70 50 61 72  reInScanEst(pPar
1d100 73 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72  se, pProbe, pFir
1d110 73 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 78  stTerm->pExpr->x
1d120 2e 70 4c 69 73 74 2c 20 26 6e 52 6f 77 29 3b 0a  .pList, &nRow);.
1d130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
1d140 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1d150 4e 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a  NABLE_STAT2 */..
1d160 20 20 20 20 2f 2a 20 41 64 6a 75 73 74 20 74 68      /* Adjust th
1d170 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
1d180 75 74 20 72 6f 77 73 20 61 6e 64 20 64 6f 77 6e  ut rows and down
1d190 77 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20  ward to reflect 
1d1a0 72 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  rows.    ** that
1d1b0 20 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79   are excluded by
1d1c0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1d1d0 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  ts..    */.    n
1d1e0 52 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64  Row = (nRow * (d
1d1f0 6f 75 62 6c 65 29 65 73 74 42 6f 75 6e 64 29 20  ouble)estBound) 
1d200 2f 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20  / (double)100;. 
1d210 20 20 20 69 66 28 20 6e 52 6f 77 3c 31 20 29 20     if( nRow<1 ) 
1d220 6e 52 6f 77 20 3d 20 31 3b 0a 0a 20 20 20 20 2f  nRow = 1;..    /
1d230 2a 20 45 78 70 65 72 69 6d 65 6e 74 73 20 72 75  * Experiments ru
1d240 6e 20 6f 6e 20 72 65 61 6c 20 53 51 4c 69 74 65  n on real SQLite
1d250 20 64 61 74 61 62 61 73 65 73 20 73 68 6f 77 20   databases show 
1d260 74 68 61 74 20 74 68 65 20 74 69 6d 65 20 6e 65  that the time ne
1d270 65 64 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 64  eded.    ** to d
1d280 6f 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63  o a binary searc
1d290 68 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 72 6f  h to locate a ro
1d2a0 77 20 69 6e 20 61 20 74 61 62 6c 65 20 6f 72 20  w in a table or 
1d2b0 69 6e 64 65 78 20 69 73 20 72 6f 75 67 68 6c 79  index is roughly
1d2c0 0a 20 20 20 20 2a 2a 20 6c 6f 67 31 30 28 4e 29  .    ** log10(N)
1d2d0 20 74 69 6d 65 73 20 74 68 65 20 74 69 6d 65 20   times the time 
1d2e0 74 6f 20 6d 6f 76 65 20 66 72 6f 6d 20 6f 6e 65  to move from one
1d2f0 20 72 6f 77 20 74 6f 20 74 68 65 20 6e 65 78 74   row to the next
1d300 20 72 6f 77 20 77 69 74 68 69 6e 0a 20 20 20 20   row within.    
1d310 2a 2a 20 61 20 74 61 62 6c 65 20 6f 72 20 69 6e  ** a table or in
1d320 64 65 78 2e 20 20 54 68 65 20 61 63 74 75 61 6c  dex.  The actual
1d330 20 74 69 6d 65 73 20 63 61 6e 20 76 61 72 79 2c   times can vary,
1d340 20 77 69 74 68 20 74 68 65 20 73 69 7a 65 20 6f   with the size o
1d350 66 0a 20 20 20 20 2a 2a 20 72 65 63 6f 72 64 73  f.    ** records
1d360 20 62 65 69 6e 67 20 61 6e 20 69 6d 70 6f 72 74   being an import
1d370 61 6e 74 20 66 61 63 74 6f 72 2e 20 20 42 6f 74  ant factor.  Bot
1d380 68 20 6d 6f 76 65 73 20 61 6e 64 20 73 65 61 72  h moves and sear
1d390 63 68 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ches are.    ** 
1d3a0 73 6c 6f 77 65 72 20 77 69 74 68 20 6c 61 72 67  slower with larg
1d3b0 65 72 20 72 65 63 6f 72 64 73 2c 20 70 72 65 73  er records, pres
1d3c0 75 6d 61 62 6c 79 20 62 65 63 61 75 73 65 20 66  umably because f
1d3d0 65 77 65 72 20 72 65 63 6f 72 64 73 20 66 69 74  ewer records fit
1d3e0 0a 20 20 20 20 2a 2a 20 6f 6e 20 6f 6e 65 20 70  .    ** on one p
1d3f0 61 67 65 20 61 6e 64 20 68 65 6e 63 65 20 6d 6f  age and hence mo
1d400 72 65 20 70 61 67 65 73 20 68 61 76 65 20 74 6f  re pages have to
1d410 20 62 65 20 66 65 74 63 68 65 64 2e 0a 20 20 20   be fetched..   
1d420 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 41   **.    ** The A
1d430 4e 41 4c 59 5a 45 20 63 6f 6d 6d 61 6e 64 20 61  NALYZE command a
1d440 6e 64 20 74 68 65 20 73 71 6c 69 74 65 5f 73 74  nd the sqlite_st
1d450 61 74 31 20 61 6e 64 20 73 71 6c 69 74 65 5f 73  at1 and sqlite_s
1d460 74 61 74 32 20 74 61 62 6c 65 73 20 64 6f 0a 20  tat2 tables do. 
1d470 20 20 20 2a 2a 20 6e 6f 74 20 67 69 76 65 20 75     ** not give u
1d480 73 20 64 61 74 61 20 6f 6e 20 74 68 65 20 72 65  s data on the re
1d490 6c 61 74 69 76 65 20 73 69 7a 65 73 20 6f 66 20  lative sizes of 
1d4a0 74 61 62 6c 65 20 61 6e 64 20 69 6e 64 65 78 20  table and index 
1d4b0 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 2a 2a 20  records..    ** 
1d4c0 53 6f 20 74 68 69 73 20 63 6f 6d 70 75 74 61 74  So this computat
1d4d0 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 61 62 6c  ion assumes tabl
1d4e0 65 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 62  e records are ab
1d4f0 6f 75 74 20 74 77 69 63 65 20 61 73 20 62 69 67  out twice as big
1d500 0a 20 20 20 20 2a 2a 20 61 73 20 69 6e 64 65 78  .    ** as index
1d510 20 72 65 63 6f 72 64 73 0a 20 20 20 20 2a 2f 0a   records.    */.
1d520 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
1d530 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1d540 4c 53 43 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  LSCAN)==0 ){.   
1d550 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f     /* The cost o
1d560 66 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73  f a full table s
1d570 63 61 6e 20 69 73 20 61 20 6e 75 6d 62 65 72 20  can is a number 
1d580 6f 66 20 6d 6f 76 65 20 6f 70 65 72 61 74 69 6f  of move operatio
1d590 6e 73 20 65 71 75 61 6c 0a 20 20 20 20 20 20 2a  ns equal.      *
1d5a0 2a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  * to the number 
1d5b0 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74  of rows in the t
1d5c0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  able..      **. 
1d5d0 20 20 20 20 20 2a 2a 20 57 65 20 61 64 64 20 61       ** We add a
1d5e0 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 34 78 20  n additional 4x 
1d5f0 70 65 6e 61 6c 74 79 20 74 6f 20 66 75 6c 6c 20  penalty to full 
1d600 74 61 62 6c 65 20 73 63 61 6e 73 2e 20 20 54 68  table scans.  Th
1d610 69 73 20 63 61 75 73 65 73 0a 20 20 20 20 20 20  is causes.      
1d620 2a 2a 20 74 68 65 20 63 6f 73 74 20 66 75 6e 63  ** the cost func
1d630 74 69 6f 6e 20 74 6f 20 65 72 72 20 6f 6e 20 74  tion to err on t
1d640 68 65 20 73 69 64 65 20 6f 66 20 63 68 6f 6f 73  he side of choos
1d650 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 6f 76 65  ing an index ove
1d660 72 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  r.      ** choos
1d670 69 6e 67 20 61 20 66 75 6c 6c 20 73 63 61 6e 2e  ing a full scan.
1d680 20 20 54 68 69 73 20 34 78 20 66 75 6c 6c 2d 73    This 4x full-s
1d690 63 61 6e 20 70 65 6e 61 6c 74 79 20 69 73 20 61  can penalty is a
1d6a0 6e 20 61 72 67 75 61 62 6c 65 0a 20 20 20 20 20  n arguable.     
1d6b0 20 2a 2a 20 64 65 63 69 73 69 6f 6e 20 61 6e 64   ** decision and
1d6c0 20 6f 6e 65 20 77 68 69 63 68 20 77 65 20 65 78   one which we ex
1d6d0 70 65 63 74 20 74 6f 20 72 65 76 69 73 69 74 20  pect to revisit 
1d6e0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 20 20  in the future.  
1d6f0 42 75 74 0a 20 20 20 20 20 20 2a 2a 20 69 74 20  But.      ** it 
1d700 73 65 65 6d 73 20 74 6f 20 62 65 20 77 6f 72 6b  seems to be work
1d710 69 6e 67 20 77 65 6c 6c 20 65 6e 6f 75 67 68 20  ing well enough 
1d720 61 74 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 0a 20  at the moment.. 
1d730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1d740 73 74 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d  st = aiRowEst[0]
1d750 2a 34 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  *4;.    }else{. 
1d760 20 20 20 20 20 6c 6f 67 31 30 4e 20 3d 20 65 73       log10N = es
1d770 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d  tLog(aiRowEst[0]
1d780 29 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 3d 20  );.      cost = 
1d790 6e 52 6f 77 3b 0a 20 20 20 20 20 20 69 66 28 20  nRow;.      if( 
1d7a0 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
1d7b0 69 66 28 20 62 4c 6f 6f 6b 75 70 20 29 7b 0a 20  if( bLookup ){. 
1d7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1d7d0 61 6e 20 69 6e 64 65 78 20 6c 6f 6f 6b 75 70 20  an index lookup 
1d7e0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 74 61  followed by a ta
1d7f0 62 6c 65 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20  ble lookup:.    
1d800 20 20 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d        **    nInM
1d810 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68 65  ul index searche
1d820 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 73 74  s to find the st
1d830 61 72 74 20 6f 66 20 65 61 63 68 20 69 6e 64 65  art of each inde
1d840 78 20 72 61 6e 67 65 0a 20 20 20 20 20 20 20 20  x range.        
1d850 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65    **  + nRow ste
1d860 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  ps through the i
1d870 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 2a  ndex.          *
1d880 2a 20 20 2b 20 6e 52 6f 77 20 74 61 62 6c 65 20  *  + nRow table 
1d890 73 65 61 72 63 68 65 73 20 74 6f 20 6c 6f 6f 6b  searches to look
1d8a0 75 70 20 74 68 65 20 74 61 62 6c 65 20 65 6e 74  up the table ent
1d8b0 72 79 20 75 73 69 6e 67 20 74 68 65 20 72 6f 77  ry using the row
1d8c0 69 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  id.          */.
1d8d0 20 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b            cost +
1d8e0 3d 20 28 6e 49 6e 4d 75 6c 20 2b 20 6e 52 6f 77  = (nInMul + nRow
1d8f0 29 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20  )*log10N;.      
1d900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d910 20 20 20 2f 2a 20 46 6f 72 20 61 20 63 6f 76 65     /* For a cove
1d920 72 69 6e 67 20 69 6e 64 65 78 3a 0a 20 20 20 20  ring index:.    
1d930 20 20 20 20 20 20 2a 2a 20 20 20 20 20 6e 49 6e        **     nIn
1d940 4d 75 6c 20 69 6e 64 65 78 20 73 65 61 72 63 68  Mul index search
1d950 65 73 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  es to find the i
1d960 6e 69 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  nitial entry .  
1d970 20 20 20 20 20 20 20 20 2a 2a 20 20 20 2b 20 6e          **   + n
1d980 52 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67  Row steps throug
1d990 68 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  h the index.    
1d9a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1d9b0 20 20 20 63 6f 73 74 20 2b 3d 20 6e 49 6e 4d 75     cost += nInMu
1d9c0 6c 2a 6c 6f 67 31 30 4e 3b 0a 20 20 20 20 20 20  l*log10N;.      
1d9d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1d9e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  .        /* For 
1d9f0 61 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20  a rowid primary 
1da00 6b 65 79 20 6c 6f 6f 6b 75 70 3a 0a 20 20 20 20  key lookup:.    
1da10 20 20 20 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c      **    nInMul
1da20 74 20 74 61 62 6c 65 20 73 65 61 72 63 68 65 73  t table searches
1da30 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e 69   to find the ini
1da40 74 69 61 6c 20 65 6e 74 72 79 20 66 6f 72 20 65  tial entry for e
1da50 61 63 68 20 72 61 6e 67 65 0a 20 20 20 20 20 20  ach range.      
1da60 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20 73 74 65    **  + nRow ste
1da70 70 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 74  ps through the t
1da80 61 62 6c 65 0a 20 20 20 20 20 20 20 20 2a 2f 0a  able.        */.
1da90 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20          cost += 
1daa0 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a 20  nInMul*log10N;. 
1dab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1dac0 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65 20    /* Add in the 
1dad0 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20 6f  estimated cost o
1dae0 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72 65  f sorting the re
1daf0 73 75 6c 74 2e 20 20 41 63 74 75 61 6c 20 65 78  sult.  Actual ex
1db00 70 65 72 69 6d 65 6e 74 61 6c 0a 20 20 20 20 2a  perimental.    *
1db10 2a 20 6d 65 61 73 75 72 65 6d 65 6e 74 73 20 6f  * measurements o
1db20 66 20 73 6f 72 74 69 6e 67 20 70 65 72 66 6f 72  f sorting perfor
1db30 6d 61 6e 63 65 20 69 6e 20 53 51 4c 69 74 65 20  mance in SQLite 
1db40 73 68 6f 77 20 74 68 61 74 20 73 6f 72 74 69 6e  show that sortin
1db50 67 20 74 69 6d 65 0a 20 20 20 20 2a 2a 20 61 64  g time.    ** ad
1db60 64 73 20 43 2a 4e 2a 6c 6f 67 31 30 28 4e 29 20  ds C*N*log10(N) 
1db70 74 6f 20 74 68 65 20 63 6f 73 74 2c 20 77 68 65  to the cost, whe
1db80 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
1db90 65 72 20 6f 66 20 72 6f 77 73 20 74 6f 20 62 65  er of rows to be
1dba0 20 0a 20 20 20 20 2a 2a 20 73 6f 72 74 65 64 20   .    ** sorted 
1dbb0 61 6e 64 20 43 20 69 73 20 61 20 66 61 63 74 6f  and C is a facto
1dbc0 72 20 62 65 74 77 65 65 6e 20 31 2e 39 35 20 61  r between 1.95 a
1dbd0 6e 64 20 34 2e 33 2e 20 20 57 65 20 77 69 6c 6c  nd 4.3.  We will
1dbe0 20 73 70 6c 69 74 20 74 68 65 0a 20 20 20 20 2a   split the.    *
1dbf0 2a 20 64 69 66 66 65 72 65 6e 63 65 20 61 6e 64  * difference and
1dc00 20 73 65 6c 65 63 74 20 43 20 6f 66 20 33 2e 30   select C of 3.0
1dc10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1dc20 20 62 53 6f 72 74 20 29 7b 0a 20 20 20 20 20 20   bSort ){.      
1dc30 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  cost += nRow*est
1dc40 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20  Log(nRow)*3;.   
1dc50 20 7d 0a 20 20 20 20 69 66 28 20 62 44 69 73 74   }.    if( bDist
1dc60 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b   ){.      cost +
1dc70 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67 28 6e 52  = nRow*estLog(nR
1dc80 6f 77 29 2a 33 3b 0a 20 20 20 20 7d 0a 0a 20 20  ow)*3;.    }..  
1dc90 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
1dca0 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
1dcb0 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
1dcc0 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
1dcd0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1dce0 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6e  e additional con
1dcf0 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 69 73  straints on this
1dd00 20 74 61 62 6c 65 20 74 68 61 74 20 63 61 6e 6e   table that cann
1dd10 6f 74 0a 20 20 20 20 2a 2a 20 62 65 20 75 73 65  ot.    ** be use
1dd20 64 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65  d with the curre
1dd30 6e 74 20 69 6e 64 65 78 2c 20 62 75 74 20 77 68  nt index, but wh
1dd40 69 63 68 20 6d 69 67 68 74 20 6c 6f 77 65 72 20  ich might lower 
1dd50 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a  the number.    *
1dd60 2a 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  * of output rows
1dd70 2c 20 61 64 6a 75 73 74 20 74 68 65 20 6e 52 6f  , adjust the nRo
1dd80 77 20 76 61 6c 75 65 20 61 63 63 6f 72 64 69 6e  w value accordin
1dd90 67 6c 79 2e 20 20 54 68 69 73 20 6f 6e 6c 79 20  gly.  This only 
1dda0 0a 20 20 20 20 2a 2a 20 6d 61 74 74 65 72 73 20  .    ** matters 
1ddb0 69 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  if the current i
1ddc0 6e 64 65 78 20 69 73 20 74 68 65 20 6c 65 61 73  ndex is the leas
1ddd0 74 20 63 6f 73 74 6c 79 2c 20 73 6f 20 64 6f 20  t costly, so do 
1dde0 6e 6f 74 20 62 6f 74 68 65 72 0a 20 20 20 20 2a  not bother.    *
1ddf0 2a 20 77 69 74 68 20 74 68 69 73 20 73 74 65 70  * with this step
1de00 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 6b   if we already k
1de10 6e 6f 77 20 74 68 69 73 20 69 6e 64 65 78 20 77  now this index w
1de20 69 6c 6c 20 6e 6f 74 20 62 65 20 63 68 6f 73 65  ill not be chose
1de30 6e 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  n..    ** Also, 
1de40 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
1de50 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f 75 6e   output row coun
1de60 74 20 62 65 6c 6f 77 20 32 20 75 73 69 6e 67 20  t below 2 using 
1de70 74 68 69 73 20 73 74 65 70 2e 0a 20 20 20 20 2a  this step..    *
1de80 2a 0a 20 20 20 20 2a 2a 20 49 74 20 69 73 20 63  *.    ** It is c
1de90 72 69 74 69 63 61 6c 20 74 68 61 74 20 74 68 65  ritical that the
1dea0 20 6e 6f 74 56 61 6c 69 64 20 6d 61 73 6b 20 62   notValid mask b
1deb0 65 20 75 73 65 64 20 68 65 72 65 20 69 6e 73 74  e used here inst
1dec0 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  ead of.    ** th
1ded0 65 20 6e 6f 74 52 65 61 64 79 20 6d 61 73 6b 2e  e notReady mask.
1dee0 20 20 57 68 65 6e 20 63 6f 6d 70 75 74 69 6e 67    When computing
1def0 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22 20 69 6e   an "optimal" in
1df00 64 65 78 2c 20 74 68 65 20 6e 6f 74 52 65 61 64  dex, the notRead
1df10 79 0a 20 20 20 20 2a 2a 20 6d 61 73 6b 20 77 69  y.    ** mask wi
1df20 6c 6c 20 6f 6e 6c 79 20 68 61 76 65 20 6f 6e 65  ll only have one
1df30 20 62 69 74 20 73 65 74 20 2d 20 74 68 65 20 62   bit set - the b
1df40 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  it for the curre
1df50 6e 74 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  nt table..    **
1df60 20 54 68 65 20 6e 6f 74 56 61 6c 69 64 20 6d 61   The notValid ma
1df70 73 6b 2c 20 6f 6e 20 74 68 65 20 6f 74 68 65 72  sk, on the other
1df80 20 68 61 6e 64 2c 20 61 6c 77 61 79 73 20 68 61   hand, always ha
1df90 73 20 61 6c 6c 20 62 69 74 73 20 73 65 74 20 66  s all bits set f
1dfa0 6f 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 73  or.    ** tables
1dfb0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 69 6e   that are not in
1dfc0 20 6f 75 74 65 72 20 6c 6f 6f 70 73 2e 20 20 49   outer loops.  I
1dfd0 66 20 6e 6f 74 52 65 61 64 79 20 69 73 20 75 73  f notReady is us
1dfe0 65 64 20 68 65 72 65 20 69 6e 73 74 65 61 64 0a  ed here instead.
1dff0 20 20 20 20 2a 2a 20 6f 66 20 6e 6f 74 56 61 6c      ** of notVal
1e000 69 64 2c 20 74 68 65 6e 20 61 20 6f 70 74 69 6d  id, then a optim
1e010 61 6c 20 69 6e 64 65 78 20 74 68 61 74 20 64 65  al index that de
1e020 70 65 6e 64 73 20 6f 6e 20 69 6e 6e 65 72 20 6a  pends on inner j
1e030 6f 69 6e 73 20 6c 6f 6f 70 73 0a 20 20 20 20 2a  oins loops.    *
1e040 2a 20 6d 69 67 68 74 20 62 65 20 73 65 6c 65 63  * might be selec
1e050 74 65 64 20 65 76 65 6e 20 77 68 65 6e 20 74 68  ted even when th
1e060 65 72 65 20 65 78 69 73 74 73 20 61 6e 20 6f 70  ere exists an op
1e070 74 69 6d 61 6c 20 69 6e 64 65 78 20 74 68 61 74  timal index that
1e080 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 20 73   has.    ** no s
1e090 75 63 68 20 64 65 70 65 6e 64 65 6e 63 79 2e 0a  uch dependency..
1e0a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1e0b0 52 6f 77 3e 32 20 26 26 20 63 6f 73 74 3c 3d 70  Row>2 && cost<=p
1e0c0 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20  Cost->rCost ){. 
1e0d0 20 20 20 20 20 69 6e 74 20 6b 3b 20 20 20 20 20       int k;     
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e0f0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
1e100 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
1e110 53 6b 69 70 45 71 20 3d 20 6e 45 71 3b 20 20 20  SkipEq = nEq;   
1e120 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1e130 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  r of == constrai
1e140 6e 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20  nts to skip */. 
1e150 20 20 20 20 20 69 6e 74 20 6e 53 6b 69 70 52 61       int nSkipRa
1e160 6e 67 65 20 3d 20 6e 42 6f 75 6e 64 3b 20 20 20  nge = nBound;   
1e170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3c    /* Number of <
1e180 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
1e190 73 6b 69 70 20 2a 2f 0a 20 20 20 20 20 20 42 69  skip */.      Bi
1e1a0 74 6d 61 73 6b 20 74 68 69 73 54 61 62 3b 20 20  tmask thisTab;  
1e1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
1e1c0 74 6d 61 70 20 66 6f 72 20 70 53 72 63 20 2a 2f  tmap for pSrc */
1e1d0 0a 0a 20 20 20 20 20 20 74 68 69 73 54 61 62 20  ..      thisTab 
1e1e0 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
1e1f0 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  MaskSet, iCur);.
1e200 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
1e210 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
1e220 54 65 72 6d 3b 20 6e 52 6f 77 3e 32 20 26 26 20  Term; nRow>2 && 
1e230 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29  k; k--, pTerm++)
1e240 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  {.        if( pT
1e250 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1e260 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 20 63 6f  ERM_VIRTUAL ) co
1e270 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1e280 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1e290 65 71 41 6c 6c 20 26 20 6e 6f 74 56 61 6c 69 64  eqAll & notValid
1e2a0 29 21 3d 74 68 69 73 54 61 62 20 29 20 63 6f 6e  )!=thisTab ) con
1e2b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1e2c0 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
1e2d0 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f  tor & (WO_EQ|WO_
1e2e0 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 7b  IN|WO_ISNULL) ){
1e2f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
1e300 53 6b 69 70 45 71 20 29 7b 0a 20 20 20 20 20 20  SkipEq ){.      
1e310 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
1e320 74 68 65 20 66 69 72 73 74 20 6e 45 71 20 65 71  the first nEq eq
1e330 75 61 6c 69 74 79 20 6d 61 74 63 68 65 73 20 73  uality matches s
1e340 69 6e 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20  ince the index. 
1e350 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61             ** ha
1e360 73 20 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e  s already accoun
1e370 74 65 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f  ted for these */
1e380 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b  .            nSk
1e390 69 70 45 71 2d 2d 3b 0a 20 20 20 20 20 20 20 20  ipEq--;.        
1e3a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e3b0 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 65       /* Assume e
1e3c0 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ach additional e
1e3d0 71 75 61 6c 69 74 79 20 6d 61 74 63 68 20 72 65  quality match re
1e3e0 64 75 63 65 73 20 74 68 65 20 72 65 73 75 6c 74  duces the result
1e3f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
1e400 73 65 74 20 73 69 7a 65 20 62 79 20 61 20 66 61  set size by a fa
1e410 63 74 6f 72 20 6f 66 20 31 30 20 2a 2f 0a 20 20  ctor of 10 */.  
1e420 20 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f            nRow /
1e430 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
1e440 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
1e450 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72  if( pTerm->eOper
1e460 61 74 6f 72 20 26 20 28 57 4f 5f 4c 54 7c 57 4f  ator & (WO_LT|WO
1e470 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  _LE|WO_GT|WO_GE)
1e480 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e490 28 20 6e 53 6b 69 70 52 61 6e 67 65 20 29 7b 0a  ( nSkipRange ){.
1e4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e4b0 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  gnore the first 
1e4c0 6e 53 6b 69 70 52 61 6e 67 65 20 72 61 6e 67 65  nSkipRange range
1e4d0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 73 69 6e   constraints sin
1e4e0 63 65 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  ce the index.   
1e4f0 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20           ** has 
1e500 61 6c 72 65 61 64 79 20 61 63 63 6f 75 6e 74 65  already accounte
1e510 64 20 66 6f 72 20 74 68 65 73 65 20 2a 2f 0a 20  d for these */. 
1e520 20 20 20 20 20 20 20 20 20 20 20 6e 53 6b 69 70             nSkip
1e530 52 61 6e 67 65 2d 2d 3b 0a 20 20 20 20 20 20 20  Range--;.       
1e540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e550 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20        /* Assume 
1e560 65 61 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20  each additional 
1e570 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1e580 20 72 65 64 75 63 65 73 20 74 68 65 20 72 65 73   reduces the res
1e590 75 6c 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  ult.            
1e5a0 2a 2a 20 73 65 74 20 73 69 7a 65 20 62 79 20 61  ** set size by a
1e5b0 20 66 61 63 74 6f 72 20 6f 66 20 33 2e 20 20 49   factor of 3.  I
1e5c0 6e 64 65 78 65 64 20 72 61 6e 67 65 20 63 6f 6e  ndexed range con
1e5d0 73 74 72 61 69 6e 74 73 20 72 65 64 75 63 65 0a  straints reduce.
1e5e0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1e5f0 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
1e600 62 79 20 61 20 6c 61 72 67 65 72 20 66 61 63 74  by a larger fact
1e610 6f 72 3a 20 34 2e 20 20 57 65 20 6d 61 6b 65 20  or: 4.  We make 
1e620 69 6e 64 65 78 65 64 20 72 61 6e 67 65 0a 20 20  indexed range.  
1e630 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 6f 72            ** mor
1e640 65 20 73 65 6c 65 63 74 69 76 65 20 69 6e 74 65  e selective inte
1e650 6e 74 69 6f 6e 61 6c 6c 79 20 62 65 63 61 75 73  ntionally becaus
1e660 65 20 6f 66 20 74 68 65 20 73 75 62 6a 65 63 74  e of the subject
1e670 69 76 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ive .           
1e680 20 2a 2a 20 6f 62 73 65 72 76 61 74 69 6f 6e 20   ** observation 
1e690 74 68 61 74 20 69 6e 64 65 78 65 64 20 72 61 6e  that indexed ran
1e6a0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ge constraints r
1e6b0 65 61 6c 6c 79 20 61 72 65 20 6d 6f 72 65 0a 20  eally are more. 
1e6c0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65             ** se
1e6d0 6c 65 63 74 69 76 65 20 69 6e 20 70 72 61 63 74  lective in pract
1e6e0 69 63 65 2c 20 6f 6e 20 61 76 65 72 61 67 65 2e  ice, on average.
1e6f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e700 6e 52 6f 77 20 2f 3d 20 33 3b 0a 20 20 20 20 20  nRow /= 3;.     
1e710 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1e720 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
1e730 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 4e 4f  eOperator!=WO_NO
1e740 4f 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OP ){.          
1e750 2f 2a 20 41 6e 79 20 6f 74 68 65 72 20 65 78 70  /* Any other exp
1e760 72 65 73 73 69 6f 6e 20 6c 6f 77 65 72 73 20 74  ression lowers t
1e770 68 65 20 6f 75 74 70 75 74 20 72 6f 77 20 63 6f  he output row co
1e780 75 6e 74 20 62 79 20 68 61 6c 66 20 2a 2f 0a 20  unt by half */. 
1e790 20 20 20 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d           nRow /=
1e7a0 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   2;.        }.  
1e7b0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e7c0 6e 52 6f 77 3c 32 20 29 20 6e 52 6f 77 20 3d 20  nRow<2 ) nRow = 
1e7d0 32 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 57  2;.    }...    W
1e7e0 48 45 52 45 54 52 41 43 45 28 28 0a 20 20 20 20  HERETRACE((.    
1e7f0 20 20 22 25 73 28 25 73 29 3a 20 6e 45 71 3d 25    "%s(%s): nEq=%
1e800 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 65 73 74 42  d nInMul=%d estB
1e810 6f 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64  ound=%d bSort=%d
1e820 20 62 4c 6f 6f 6b 75 70 3d 25 64 20 77 73 46 6c   bLookup=%d wsFl
1e830 61 67 73 3d 30 78 25 78 5c 6e 22 0a 20 20 20 20  ags=0x%x\n".    
1e840 20 20 22 20 20 20 20 20 20 20 20 20 6e 6f 74 52    "         notR
1e850 65 61 64 79 3d 30 78 25 6c 6c 78 20 6c 6f 67 31  eady=0x%llx log1
1e860 30 4e 3d 25 2e 31 66 20 6e 52 6f 77 3d 25 2e 31  0N=%.1f nRow=%.1
1e870 66 20 63 6f 73 74 3d 25 2e 31 66 20 75 73 65 64  f cost=%.1f used
1e880 3d 30 78 25 6c 6c 78 5c 6e 22 2c 0a 20 20 20 20  =0x%llx\n",.    
1e890 20 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e    pSrc->pTab->zN
1e8a0 61 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64  ame, (pIdx ? pId
1e8b0 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22  x->zName : "ipk"
1e8c0 29 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e  ), .      nEq, n
1e8d0 49 6e 4d 75 6c 2c 20 65 73 74 42 6f 75 6e 64 2c  InMul, estBound,
1e8e0 20 62 53 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c   bSort, bLookup,
1e8f0 20 77 73 46 6c 61 67 73 2c 0a 20 20 20 20 20 20   wsFlags,.      
1e900 6e 6f 74 52 65 61 64 79 2c 20 6c 6f 67 31 30 4e  notReady, log10N
1e910 2c 20 6e 52 6f 77 2c 20 63 6f 73 74 2c 20 75 73  , nRow, cost, us
1e920 65 64 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20  ed.    ));..    
1e930 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78  /* If this index
1e940 20 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20   is the best we 
1e950 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72  have seen so far
1e960 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68  , then record th
1e970 69 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  is.    ** index 
1e980 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20  and its cost in 
1e990 74 68 65 20 70 43 6f 73 74 20 73 74 72 75 63 74  the pCost struct
1e9a0 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ure..    */.    
1e9b0 69 66 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73  if( (!pIdx || ws
1e9c0 46 6c 61 67 73 29 0a 20 20 20 20 20 26 26 20 28  Flags).     && (
1e9d0 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f 73  cost<pCost->rCos
1e9e0 74 20 7c 7c 20 28 63 6f 73 74 3c 3d 70 43 6f 73  t || (cost<=pCos
1e9f0 74 2d 3e 72 43 6f 73 74 20 26 26 20 6e 52 6f 77  t->rCost && nRow
1ea00 3c 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 52 6f  <pCost->plan.nRo
1ea10 77 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  w)).    ){.     
1ea20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20   pCost->rCost = 
1ea30 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43 6f 73  cost;.      pCos
1ea40 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b 0a  t->used = used;.
1ea50 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
1ea60 6e 2e 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20  n.nRow = nRow;. 
1ea70 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1ea80 2e 77 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c  .wsFlags = (wsFl
1ea90 61 67 73 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b  ags&wsFlagMask);
1eaa0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c  .      pCost->pl
1eab0 61 6e 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  an.nEq = nEq;.  
1eac0 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
1ead0 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20  u.pIdx = pIdx;. 
1eae0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1eaf0 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44  there was an IND
1eb00 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20  EXED BY clause, 
1eb10 74 68 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f  then only that o
1eb20 6e 65 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20  ne index is.    
1eb30 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a  ** considered. *
1eb40 2f 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e  /.    if( pSrc->
1eb50 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a  pIndex ) break;.
1eb60 0a 20 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61  .    /* Reset ma
1eb70 73 6b 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  sks for the next
1eb80 20 69 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f   index in the lo
1eb90 6f 70 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67  op */.    wsFlag
1eba0 4d 61 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52  Mask = ~(WHERE_R
1ebb0 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f  OWID_EQ|WHERE_RO
1ebc0 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20  WID_RANGE);.    
1ebd0 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78  eqTermMask = idx
1ebe0 45 71 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a  EqTermMask;.  }.
1ebf0 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
1ec00 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
1ec10 61 75 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c  ause and the SQL
1ec20 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
1ec30 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65   flag.  ** is se
1ec40 74 2c 20 74 68 65 6e 20 72 65 76 65 72 73 65 20  t, then reverse 
1ec50 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 20 74  the order that t
1ec60 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65  he index will be
1ec70 20 73 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e   scanned.  ** in
1ec80 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66  . This is used f
1ec90 6f 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74  or application t
1eca0 65 73 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20  esting, to help 
1ecb0 66 69 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20  find cases.  ** 
1ecc0 77 68 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f  where applicatio
1ecd0 6e 20 62 65 68 61 76 69 6f 75 72 20 64 65 70 65  n behaviour depe
1ece0 6e 64 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65  nds on the (unde
1ecf0 66 69 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61  fined) order tha
1ed00 74 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75  t.  ** SQLite ou
1ed10 74 70 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e  tputs rows in in
1ed20 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20   the absence of 
1ed30 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
1ed40 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  se.  */.  if( !p
1ed50 4f 72 64 65 72 42 79 20 26 26 20 70 50 61 72 73  OrderBy && pPars
1ed60 65 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  e->db->flags & S
1ed70 51 4c 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64  QLITE_ReverseOrd
1ed80 65 72 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  er ){.    pCost-
1ed90 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d  >plan.wsFlags |=
1eda0 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
1edb0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
1edc0 4f 72 64 65 72 42 79 20 7c 7c 20 28 70 43 6f 73  OrderBy || (pCos
1edd0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26  t->plan.wsFlags&
1ede0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d  WHERE_ORDERBY)==
1edf0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ee00 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1ee10 78 3d 3d 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e  x==0 || (pCost->
1ee20 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45  plan.wsFlags&WHE
1ee30 52 45 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20  RE_ROWID_EQ)==0 
1ee40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 72  );.  assert( pSr
1ee50 63 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20  c->pIndex==0 .  
1ee60 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70       || pCost->p
1ee70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20  lan.u.pIdx==0 . 
1ee80 20 20 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e        || pCost->
1ee90 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72  plan.u.pIdx==pSr
1eea0 63 2d 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a  c->pIndex .  );.
1eeb0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
1eec0 62 65 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25  best index is: %
1eed0 73 5c 6e 22 2c 20 0a 20 20 20 20 28 28 70 43 6f  s\n", .    ((pCo
1eee0 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
1eef0 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c   & WHERE_NOT_FUL
1ef00 4c 53 43 41 4e 29 3d 3d 30 20 3f 20 22 6e 6f 6e  LSCAN)==0 ? "non
1ef10 65 22 20 3a 20 0a 20 20 20 20 20 20 20 20 20 70  e" : .         p
1ef20 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1ef30 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  x ? pCost->plan.
1ef40 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a 20  u.pIdx->zName : 
1ef50 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a 20 20 0a  "ipk").  ));.  .
1ef60 20 20 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e    bestOrClauseIn
1ef70 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1ef80 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1ef90 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65   notValid, pOrde
1efa0 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 62  rBy, pCost);.  b
1efb0 65 73 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65  estAutomaticInde
1efc0 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
1efd0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  Src, notReady, p
1efe0 43 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e  Cost);.  pCost->
1eff0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
1f000 65 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f  eqTermMask;.}../
1f010 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75  *.** Find the qu
1f020 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
1f030 65 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72  essing table pSr
1f040 63 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74  c->pTab. Write t
1f050 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79  he.** best query
1f060 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f   plan and its co
1f070 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72  st into the Wher
1f080 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70  eCost object sup
1f090 70 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65  plied .** as the
1f0a0 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e   last parameter.
1f0b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
1f0c0 61 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65  ay calculate the
1f0d0 20 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68   cost of.** both
1f0e0 20 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61   real and virtua
1f0f0 6c 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a  l table scans..*
1f100 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
1f110 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  stIndex(.  Parse
1f120 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
1f130 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1f140 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
1f150 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
1f160 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
1f170 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
1f180 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
1f190 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
1f1a0 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
1f1b0 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
1f1c0 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
1f1d0 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
1f1e0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1f1f0 66 20 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76  f cursors not av
1f200 61 69 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65  ailable for inde
1f210 78 69 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73  xing */.  Bitmas
1f220 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20  k notValid,     
1f230 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73        /* Cursors
1f240 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66   not available f
1f250 6f 72 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a  or any purpose *
1f260 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f  /.  ExprList *pO
1f270 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20  rderBy,         
1f280 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
1f290 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
1f2a0 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20  eCost *pCost    
1f2b0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73          /* Lowes
1f2c0 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61  t cost query pla
1f2d0 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  n */.){.#ifndef 
1f2e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1f2f0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 49  UALTABLE.  if( I
1f300 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e 70  sVirtual(pSrc->p
1f310 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  Tab) ){.    sqli
1f320 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
1f330 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 56  p = 0;.    bestV
1f340 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
1f350 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
1f360 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69  otReady, notVali
1f370 64 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f  d, pOrderBy, pCo
1f380 73 74 2c 26 70 29 3b 0a 20 20 20 20 69 66 28 20  st,&p);.    if( 
1f390 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
1f3a0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Str ){.      sql
1f3b0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
1f3c0 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Str);.    }.    
1f3d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
1f3e0 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
1f3f0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
1f400 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e  .    bestBtreeIn
1f410 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1f420 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
1f430 20 6e 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65   notValid, pOrde
1f440 72 42 79 2c 20 30 2c 20 70 43 6f 73 74 29 3b 0a  rBy, 0, pCost);.
1f450 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
1f460 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
1f470 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
1f480 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
1f490 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
1f4a0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
1f4b0 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
1f4c0 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
1f4d0 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
1f4e0 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
1f4f0 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
1f500 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
1f510 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
1f520 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
1f530 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
1f540 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
1f550 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
1f560 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
1f570 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
1f580 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
1f590 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
1f5a0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
1f5b0 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
1f5c0 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
1f5d0 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
1f5e0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
1f5f0 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
1f600 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
1f610 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
1f620 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
1f630 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
1f640 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
1f650 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
1f660 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
1f670 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
1f680 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
1f690 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
1f6a0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
1f6b0 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
1f6c0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
1f6d0 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 4d 50  abled..**.** IMP
1f6e0 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20  LEMENTATION-OF: 
1f6f0 52 2d 32 34 35 39 37 2d 35 38 36 35 35 20 4e 6f  R-24597-58655 No
1f700 20 74 65 73 74 73 20 61 72 65 20 64 6f 6e 65 20   tests are done 
1f710 66 6f 72 20 74 65 72 6d 73 20 74 68 61 74 20 61  for terms that a
1f720 72 65 0a 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79  re.** completely
1f730 20 73 61 74 69 73 66 69 65 64 20 62 79 20 69 6e   satisfied by in
1f740 64 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  dices..**.** Dis
1f750 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
1f760 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
1f770 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
1f780 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
1f790 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
1f7a0 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
1f7b0 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
1f7c0 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
1f7d0 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
1f7e0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
1f7f0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
1f800 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
1f810 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
1f820 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
1f830 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
1f840 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
1f850 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
1f860 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
1f870 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
1f880 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
1f890 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
1f8a0 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
1f8b0 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
1f8c0 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
1f8d0 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
1f8e0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
1f8f0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
1f900 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
1f910 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
1f920 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
1f930 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
1f940 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
1f950 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
1f960 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
1f970 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28 70 54  erm.      && (pT
1f980 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1f990 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
1f9a0 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
1f9b0 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
1f9c0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1f9d0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
1f9e0 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b  _FromJoin)).  ){
1f9f0 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  .    pTerm->wtFl
1fa00 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
1fa10 44 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  D;.    if( pTerm
1fa20 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a  ->iParent>=0 ){.
1fa30 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
1fa40 2a 70 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d  *pOther = &pTerm
1fa50 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e  ->pWC->a[pTerm->
1fa60 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20  iParent];.      
1fa70 69 66 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e  if( (--pOther->n
1fa80 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20  Child)==0 ){.   
1fa90 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
1faa0 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29  (pLevel, pOther)
1fab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fac0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64    }.}../*.** Cod
1fad0 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e 69 74 79  e an OP_Affinity
1fae0 20 6f 70 63 6f 64 65 20 74 6f 20 61 70 70 6c 79   opcode to apply
1faf0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69   the column affi
1fb00 6e 69 74 79 20 73 74 72 69 6e 67 20 7a 41 66 66  nity string zAff
1fb10 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20 72 65 67  .** to the n reg
1fb20 69 73 74 65 72 73 20 73 74 61 72 74 69 6e 67 20  isters starting 
1fb30 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  at base. .**.** 
1fb40 41 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  As an optimizati
1fb50 6f 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  on, SQLITE_AFF_N
1fb60 4f 4e 45 20 65 6e 74 72 69 65 73 20 28 77 68 69  ONE entries (whi
1fb70 63 68 20 61 72 65 20 6e 6f 2d 6f 70 73 29 20 61  ch are no-ops) a
1fb80 74 20 74 68 65 0a 2a 2a 20 62 65 67 69 6e 6e 69  t the.** beginni
1fb90 6e 67 20 61 6e 64 20 65 6e 64 20 6f 66 20 7a 41  ng and end of zA
1fba0 66 66 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 20  ff are ignored. 
1fbb0 20 49 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   If all entries 
1fbc0 69 6e 20 7a 41 66 66 20 61 72 65 0a 2a 2a 20 53  in zAff are.** S
1fbd0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2c 20  QLITE_AFF_NONE, 
1fbe0 74 68 65 6e 20 6e 6f 20 63 6f 64 65 20 67 65 74  then no code get
1fbf0 73 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2a 0a  s generated..**.
1fc00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1fc10 6d 61 6b 65 73 20 69 74 73 20 6f 77 6e 20 63 6f  makes its own co
1fc20 70 79 20 6f 66 20 7a 41 66 66 20 73 6f 20 74 68  py of zAff so th
1fc30 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  at the caller is
1fc40 20 66 72 65 65 0a 2a 2a 20 74 6f 20 6d 6f 64 69   free.** to modi
1fc50 66 79 20 7a 41 66 66 20 61 66 74 65 72 20 74 68  fy zAff after th
1fc60 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1fc70 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ns..*/.static vo
1fc80 69 64 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69  id codeApplyAffi
1fc90 6e 69 74 79 28 50 61 72 73 65 20 2a 70 50 61 72  nity(Parse *pPar
1fca0 73 65 2c 20 69 6e 74 20 62 61 73 65 2c 20 69 6e  se, int base, in
1fcb0 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41 66 66 29  t n, char *zAff)
1fcc0 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
1fcd0 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
1fce0 66 28 20 7a 41 66 66 3d 3d 30 20 29 7b 0a 20 20  f( zAff==0 ){.  
1fcf0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
1fd00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1fd10 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
1fd20 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1fd30 76 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  v!=0 );..  /* Ad
1fd40 6a 75 73 74 20 62 61 73 65 20 61 6e 64 20 6e 20  just base and n 
1fd50 74 6f 20 73 6b 69 70 20 6f 76 65 72 20 53 51 4c  to skip over SQL
1fd60 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74  ITE_AFF_NONE ent
1fd70 72 69 65 73 20 61 74 20 74 68 65 20 62 65 67 69  ries at the begi
1fd80 6e 6e 69 6e 67 0a 20 20 2a 2a 20 61 6e 64 20 65  nning.  ** and e
1fd90 6e 64 20 6f 66 20 74 68 65 20 61 66 66 69 6e 69  nd of the affini
1fda0 74 79 20 73 74 72 69 6e 67 2e 0a 20 20 2a 2f 0a  ty string..  */.
1fdb0 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
1fdc0 7a 41 66 66 5b 30 5d 3d 3d 53 51 4c 49 54 45 5f  zAff[0]==SQLITE_
1fdd0 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AFF_NONE ){.    
1fde0 6e 2d 2d 3b 0a 20 20 20 20 62 61 73 65 2b 2b 3b  n--;.    base++;
1fdf0 0a 20 20 20 20 7a 41 66 66 2b 2b 3b 0a 20 20 7d  .    zAff++;.  }
1fe00 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
1fe10 20 7a 41 66 66 5b 6e 2d 31 5d 3d 3d 53 51 4c 49   zAff[n-1]==SQLI
1fe20 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29 7b 0a 20  TE_AFF_NONE ){. 
1fe30 20 20 20 6e 2d 2d 3b 0a 20 20 7d 0a 0a 20 20 2f     n--;.  }..  /
1fe40 2a 20 43 6f 64 65 20 74 68 65 20 4f 50 5f 41 66  * Code the OP_Af
1fe50 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 69 66  finity opcode if
1fe60 20 74 68 65 72 65 20 69 73 20 61 6e 79 74 68 69   there is anythi
1fe70 6e 67 20 6c 65 66 74 20 74 6f 20 64 6f 2e 20 2a  ng left to do. *
1fe80 2f 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  /.  if( n>0 ){. 
1fe90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1fea0 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69 6e  dOp2(v, OP_Affin
1feb0 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20  ity, base, n);. 
1fec0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1fed0 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41  angeP4(v, -1, zA
1fee0 66 66 2c 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69  ff, n);.    sqli
1fef0 74 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69  te3ExprCacheAffi
1ff00 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73  nityChange(pPars
1ff10 65 2c 20 62 61 73 65 2c 20 6e 29 3b 0a 20 20 7d  e, base, n);.  }
1ff20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  .}.../*.** Gener
1ff30 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73  ate code for a s
1ff40 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74  ingle equality t
1ff50 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1ff60 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
1ff70 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
1ff80 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
1ff90 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29  pr or X IN (...)
1ffa0 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65  .   pTerm is the
1ffb0 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20   term to be .** 
1ffc0 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  coded..**.** The
1ffd0 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66   current value f
1ffe0 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e  or the constrain
1fff0 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72 65 67  t is left in reg
20000 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a 0a 2a  ister iReg..**.*
20010 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69  * For a constrai
20020 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  nt of the form X
20030 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65  =expr, the expre
20040 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74  ssion is evaluat
20050 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65  ed and its.** re
20060 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20  sult is left on 
20070 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20  the stack.  For 
20080 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74  constraints of t
20090 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e  he form X IN (..
200a0 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  .).** this routi
200b0 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f  ne sets up a loo
200c0 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72  p that will iter
200d0 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c  ate over all val
200e0 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61  ues of X..*/.sta
200f0 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71 75 61  tic int codeEqua
20100 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
20110 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
20120 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
20130 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
20140 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
20150 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
20160 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
20170 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
20180 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
20190 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c 65 76  vel, /* When lev
201a0 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  el of the FROM c
201b0 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72  lause we are wor
201c0 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69 6e 74  king on */.  int
201d0 20 69 54 61 72 67 65 74 20 20 20 20 20 20 20 20   iTarget        
201e0 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6c   /* Attempt to l
201f0 65 61 76 65 20 72 65 73 75 6c 74 73 20 69 6e 20  eave results in 
20200 74 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f  this register */
20210 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58 20 3d  .){.  Expr *pX =
20220 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
20230 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
20240 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
20250 69 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iReg;           
20260 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
20270 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73 75 6c  er holding resul
20280 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ts */..  assert(
20290 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a 20 20   iTarget>0 );.  
202a0 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45  if( pX->op==TK_E
202b0 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  Q ){.    iReg = 
202c0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
202d0 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 58  arget(pParse, pX
202e0 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72 67 65  ->pRight, iTarge
202f0 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  t);.  }else if( 
20300 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  pX->op==TK_ISNUL
20310 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20 3d 20  L ){.    iReg = 
20320 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73 71 6c  iTarget;.    sql
20330 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20340 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52  , OP_Null, 0, iR
20350 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  eg);.#ifndef SQL
20360 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
20370 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  Y.  }else{.    i
20380 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20 69 6e  nt eType;.    in
20390 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74 72 75  t iTab;.    stru
203a0 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a  ct InLoop *pIn;.
203b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
203c0 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20  >op==TK_IN );.  
203d0 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65 74    iReg = iTarget
203e0 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20 73 71  ;.    eType = sq
203f0 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78  lite3FindInIndex
20400 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30 29 3b  (pParse, pX, 0);
20410 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58 2d 3e  .    iTab = pX->
20420 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71 6c 69  iTable;.    sqli
20430 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
20440 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61 62   OP_Rewind, iTab
20450 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
20460 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
20470 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
20480 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20 69 66  N_ABLE );.    if
20490 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  ( pLevel->u.in.n
204a0 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  In==0 ){.      p
204b0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d  Level->addrNxt =
204c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
204d0 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 7d 0a  Label(v);.    }.
204e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
204f0 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76  .nIn++;.    pLev
20500 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70  el->u.in.aInLoop
20510 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65   =.       sqlite
20520 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65  3DbReallocOrFree
20530 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c 65  (pParse->db, pLe
20540 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
20550 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e   sizeof(pLevel->
20580 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30 5d 29  u.in.aInLoop[0])
20590 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49  *pLevel->u.in.nI
205a0 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20 70 4c  n);.    pIn = pL
205b0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
205c0 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 20  op;.    if( pIn 
205d0 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b 3d 20  ){.      pIn += 
205e0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
205f0 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d   - 1;.      pIn-
20600 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20  >iCur = iTab;.  
20610 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49      if( eType==I
20620 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b  N_INDEX_ROWID ){
20630 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e 61 64  .        pIn->ad
20640 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69 74 65  drInTop = sqlite
20650 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
20660 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c 20 69  P_Rowid, iTab, i
20670 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Reg);.      }els
20680 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  e{.        pIn->
20690 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
206a0 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
206b0 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62   OP_Column, iTab
206c0 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  , 0, iReg);.    
206d0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
206e0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
206f0 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67 29 3b  P_IsNull, iReg);
20700 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20710 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e    pLevel->u.in.n
20720 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23 65  In = 0;.    }.#e
20730 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73 61 62  ndif.  }.  disab
20740 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
20750 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  Term);.  return 
20760 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  iReg;.}../*.** G
20770 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
20780 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74 65 20  t will evaluate 
20790 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f  all == and IN co
207a0 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 61 6e  nstraints for an
207b0 0a 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  .** index..**.**
207c0 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f   For example, co
207d0 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31 28  nsider table t1(
207e0 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74  a,b,c,d,e,f) wit
207f0 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63  h index i1(a,b,c
20800 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68  )..** Suppose th
20810 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
20820 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e  s this:  a==5 AN
20830 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41  D b IN (1,2,3) A
20840 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a  ND c>5 AND c<10.
20850 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61 73  ** The index has
20860 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65   as many as thre
20870 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
20880 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74  raints, but in t
20890 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20  his.** example, 
208a0 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76 61  the third "c" va
208b0 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  lue is an inequa
208c0 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74  lity.  So only t
208d0 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  wo .** constrain
208e0 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54  ts are coded.  T
208f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20900 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   generate code t
20910 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d  o evaluate.** a=
20920 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32  =5 and b IN (1,2
20930 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e  ,3).  The curren
20940 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61  t values for a a
20950 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f  nd b will be sto
20960 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63  red.** in consec
20970 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 20  utive registers 
20980 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66  and the index of
20990 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69 73   the first regis
209a0 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
209b0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78  .**.** In the ex
209c0 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d  ample above nEq=
209d0 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73 75  =2.  But this su
209e0 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66  broutine works f
209f0 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20  or any value.** 
20a00 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67  of nEq including
20a10 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20   0.  If nEq==0, 
20a20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
20a30 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a  nearly a no-op..
20a40 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  ** The only thin
20a50 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c  g it does is all
20a60 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c  ocate the pLevel
20a70 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65  ->iMem memory ce
20a80 6c 6c 20 61 6e 64 0a 2a 2a 20 63 6f 6d 70 75 74  ll and.** comput
20a90 65 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 73  e the affinity s
20aa0 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tring..**.** Thi
20ab0 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73  s routine always
20ac0 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65   allocates at le
20ad0 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63  ast one memory c
20ae0 65 6c 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a  ell and returns.
20af0 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  ** the index of 
20b00 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  that memory cell
20b10 2e 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a  . The code that.
20b20 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f  ** calls this ro
20b30 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74  utine will use t
20b40 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  hat memory cell 
20b50 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72  to store the ter
20b60 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20  mination.** key 
20b70 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
20b80 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
20b90 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
20ba0 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
20bb0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
20bc0 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
20bd0 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
20be0 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
20bf0 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  al.** use..**.**
20c00 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
20c10 67 2c 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74  g, *pzAff is set
20c20 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
20c30 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
20c40 20 61 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68   a.** copy of th
20c50 65 20 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74  e column affinit
20c60 79 20 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20  y string of the 
20c70 69 6e 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20  index allocated 
20c80 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
20c90 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65  DbMalloc(). Exce
20ca0 70 74 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74  pt, entries in t
20cb0 68 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73  he copy of the s
20cc0 74 72 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64  tring associated
20cd0 0a 2a 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74  .** with equalit
20ce0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68  y constraints th
20cf0 61 74 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69  at use NONE affi
20d00 6e 69 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a  nity are set to.
20d10 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  ** SQLITE_AFF_NO
20d20 4e 45 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64  NE. This is to d
20d30 65 61 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63  eal with SQL suc
20d40 68 20 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h as the followi
20d50 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41  ng:.**.**   CREA
20d60 54 45 20 54 41 42 4c 45 20 74 31 28 61 20 54 45  TE TABLE t1(a TE
20d70 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
20d80 62 29 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  b);.**   SELECT 
20d90 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74  ... FROM t1 AS t
20da0 32 2c 20 74 31 20 57 48 45 52 45 20 74 31 2e 61  2, t1 WHERE t1.a
20db0 20 3d 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49   = t2.b;.**.** I
20dc0 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
20dd0 6f 76 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f  ove, the index o
20de0 6e 20 74 31 28 61 29 20 68 61 73 20 54 45 58 54  n t1(a) has TEXT
20df0 20 61 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73   affinity. But s
20e00 69 6e 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68  ince.** the righ
20e10 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t hand side of t
20e20 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  he equality cons
20e30 74 72 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61  traint (t2.b) ha
20e40 73 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c  s NONE affinity,
20e50 0a 2a 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  .** no conversio
20e60 6e 20 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65  n should be atte
20e70 6d 70 74 65 64 20 62 65 66 6f 72 65 20 75 73 69  mpted before usi
20e80 6e 67 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20  ng a t2.b value 
20e90 61 73 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  as part of.** a 
20ea0 6b 65 79 20 74 6f 20 73 65 61 72 63 68 20 74 68  key to search th
20eb0 65 20 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74  e index. Hence t
20ec0 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e  he first byte in
20ed0 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 66   the returned af
20ee0 66 69 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67  finity.** string
20ef0 20 69 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65   in this example
20f00 20 77 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f   would be set to
20f10 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
20f20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20f30 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
20f40 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
20f50 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
20f60 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
20f70 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
20f80 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
20f90 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
20fa0 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
20fb0 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
20fc0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
20fd0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
20fe0 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42  RE clause */.  B
20ff0 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
21000 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61       /* Which pa
21010 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65  rts of FROM have
21020 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
21030 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  ded */.  int nEx
21040 74 72 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f  traReg,        /
21050 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
21060 61 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  a registers to a
21070 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
21080 72 20 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20  r **pzAff       
21090 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74     /* OUT: Set t
210a0 6f 20 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e  o point to affin
210b0 69 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ity string */.){
210c0 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65  .  int nEq = pLe
210d0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20  vel->plan.nEq;  
210e0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
210f0 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
21100 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a  raints to code *
21110 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
21120 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20  arse->pVdbe;    
21130 20 20 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65    /* The vm unde
21140 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
21150 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b  /.  Index *pIdx;
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
21180 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
21190 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
211a0 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
211b0 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
211c0 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
211d0 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
211e0 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
211f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
21200 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
21210 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
21220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21230 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
21240 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
21250 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20   regBase;       
21260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61             /* Ba
21270 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  se register */. 
21280 20 69 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20   int nReg;      
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  * Number of regi
212b0 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74  sters to allocat
212c0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66  e */.  char *zAf
212d0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
212e0 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79       /* Affinity
212f0 20 73 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72   string to retur
21300 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n */..  /* This 
21310 6d 6f 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63  module is only c
21320 61 6c 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70  alled on query p
21330 6c 61 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e  lans that use an
21340 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73   index. */.  ass
21350 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  ert( pLevel->pla
21360 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
21370 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70  E_INDEXED );.  p
21380 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  Idx = pLevel->pl
21390 61 6e 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a  an.u.pIdx;..  /*
213a0 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
213b0 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
213c0 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
213d0 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
213e0 6d 2e 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73  m..  */.  regBas
213f0 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  e = pParse->nMem
21400 20 2b 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70   + 1;.  nReg = p
21410 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20  Level->plan.nEq 
21420 2b 20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70  + nExtraReg;.  p
21430 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e  Parse->nMem += n
21440 52 65 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73  Reg;..  zAff = s
21450 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
21460 50 61 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74  Parse->db, sqlit
21470 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53  e3IndexAffinityS
21480 74 72 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20  tr(v, pIdx));.  
21490 69 66 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20  if( !zAff ){.   
214a0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
214b0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
214c0 20 7d 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74   }..  /* Evaluat
214d0 65 20 74 68 65 20 65 71 75 61 6c 69 74 79 20 63  e the equality c
214e0 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a  onstraints.  */.
214f0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e    assert( pIdx->
21500 6e 43 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a  nColumn>=nEq );.
21510 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71    for(j=0; j<nEq
21520 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; j++){.    int 
21530 72 31 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20  r1;.    int k = 
21540 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
21550 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66  ];.    pTerm = f
21560 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
21570 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
21580 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
21590 6c 61 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20  lags, pIdx);.   
215a0 20 69 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d   if( NEVER(pTerm
215b0 3d 3d 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ==0) ) break;.  
215c0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
215d0 6e 67 20 74 72 75 65 20 66 6f 72 20 69 6e 64 69  ng true for indi
215e0 63 65 73 20 77 69 74 68 20 72 65 64 75 6e 64 61  ces with redunda
215f0 6e 74 20 63 6f 6c 75 6d 6e 73 2e 20 0a 20 20 20  nt columns. .   
21600 20 2a 2a 20 45 78 3a 20 43 52 45 41 54 45 20 49   ** Ex: CREATE I
21610 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61 2c  NDEX i1 ON t1(a,
21620 62 2c 61 29 3b 20 53 45 4c 45 43 54 20 2a 20 46  b,a); SELECT * F
21630 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 30  ROM t1 WHERE a=0
21640 20 41 4e 44 20 62 3d 30 3b 20 2a 2f 0a 20 20 20   AND b=0; */.   
21650 20 74 65 73 74 63 61 73 65 28 20 28 70 54 65 72   testcase( (pTer
21660 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
21670 4d 5f 43 4f 44 45 44 29 21 3d 30 20 29 3b 0a 20  M_CODED)!=0 );. 
21680 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
21690 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
216a0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
216b0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
216c0 36 32 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 63  62 */.    r1 = c
216d0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
216e0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
216f0 4c 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a  Level, regBase+j
21700 29 3b 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72  );.    if( r1!=r
21710 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20  egBase+j ){.    
21720 20 20 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b    if( nReg==1 ){
21730 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21740 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
21750 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b  Parse, regBase);
21760 0a 20 20 20 20 20 20 20 20 72 65 67 42 61 73 65  .        regBase
21770 20 3d 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = r1;.      }el
21780 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
21790 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
217a0 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72   OP_SCopy, r1, r
217b0 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20  egBase+j);.     
217c0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73   }.    }.    tes
217d0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
217e0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e  perator & WO_ISN
217f0 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ULL );.    testc
21800 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
21810 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b  rator & WO_IN );
21820 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d  .    if( (pTerm-
21830 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
21840 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d  _ISNULL|WO_IN))=
21850 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  =0 ){.      Expr
21860 20 2a 70 52 69 67 68 74 20 3d 20 70 54 65 72 6d   *pRight = pTerm
21870 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  ->pExpr->pRight;
21880 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
21890 70 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70  prCodeIsNullJump
218a0 28 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42  (v, pRight, regB
218b0 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61  ase+j, pLevel->a
218c0 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69  ddrBrk);.      i
218d0 66 28 20 7a 41 66 66 20 29 7b 0a 20 20 20 20 20  f( zAff ){.     
218e0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f     if( sqlite3Co
218f0 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 52  mpareAffinity(pR
21900 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
21910 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
21920 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
21930 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
21940 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
21950 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
21960 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
21970 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
21980 52 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 20  Right, zAff[j]) 
21990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 41 66  ){.          zAf
219a0 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  f[j] = SQLITE_AF
219b0 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
219c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
219d0 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d 20 7a    }.  *pzAff = z
219e0 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  Aff;.  return re
219f0 67 42 61 73 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  gBase;.}..#ifnde
21a00 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
21a10 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PLAIN./*.** This
21a20 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 65   routine is a he
21a30 6c 70 65 72 20 66 6f 72 20 65 78 70 6c 61 69 6e  lper for explain
21a40 49 6e 64 65 78 52 61 6e 67 65 28 29 20 62 65 6c  IndexRange() bel
21a50 6f 77 0a 2a 2a 0a 2a 2a 20 70 53 74 72 20 68 6f  ow.**.** pStr ho
21a60 6c 64 73 20 74 68 65 20 74 65 78 74 20 6f 66 20  lds the text of 
21a70 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
21a80 61 74 20 77 65 20 61 72 65 20 62 75 69 6c 64 69  at we are buildi
21a90 6e 67 20 75 70 20 6f 6e 65 20 74 65 72 6d 0a 2a  ng up one term.*
21aa0 2a 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68  * at a time.  Th
21ab0 69 73 20 72 6f 75 74 69 6e 65 20 61 64 64 73 20  is routine adds 
21ac0 61 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 68  a new term to th
21ad0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 65 78 70  e end of the exp
21ae0 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 65 72 6d  ression..** Term
21af0 73 20 61 72 65 20 73 65 70 61 72 61 74 65 64 20  s are separated 
21b00 62 79 20 41 4e 44 20 73 6f 20 61 64 64 20 74 68  by AND so add th
21b10 65 20 22 41 4e 44 22 20 74 65 78 74 20 66 6f 72  e "AND" text for
21b20 20 73 65 63 6f 6e 64 20 61 6e 64 20 73 75 62 73   second and subs
21b30 65 71 75 65 6e 74 0a 2a 2a 20 74 65 72 6d 73 20  equent.** terms 
21b40 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  only..*/.static 
21b50 76 6f 69 64 20 65 78 70 6c 61 69 6e 41 70 70 65  void explainAppe
21b60 6e 64 54 65 72 6d 28 0a 20 20 53 74 72 41 63 63  ndTerm(.  StrAcc
21b70 75 6d 20 2a 70 53 74 72 2c 20 20 20 20 20 20 20  um *pStr,       
21b80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78        /* The tex
21b90 74 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 69  t expression bei
21ba0 6e 67 20 62 75 69 6c 74 20 2a 2f 0a 20 20 69 6e  ng built */.  in
21bb0 74 20 69 54 65 72 6d 2c 20 20 20 20 20 20 20 20  t iTerm,        
21bc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
21bd0 65 78 20 6f 66 20 74 68 69 73 20 74 65 72 6d 2e  ex of this term.
21be0 20 20 46 69 72 73 74 20 69 73 20 7a 65 72 6f 20    First is zero 
21bf0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
21c00 2a 7a 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20  *zColumn,       
21c10 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
21c20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
21c30 74 20 63 68 61 72 20 2a 7a 4f 70 20 20 20 20 20  t char *zOp     
21c40 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
21c50 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20  of the operator 
21c60 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 54 65 72  */.){.  if( iTer
21c70 6d 20 29 20 73 71 6c 69 74 65 33 53 74 72 41 63  m ) sqlite3StrAc
21c80 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20  cumAppend(pStr, 
21c90 22 20 41 4e 44 20 22 2c 20 35 29 3b 0a 20 20 73  " AND ", 5);.  s
21ca0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
21cb0 70 65 6e 64 28 70 53 74 72 2c 20 7a 43 6f 6c 75  pend(pStr, zColu
21cc0 6d 6e 2c 20 2d 31 29 3b 0a 20 20 73 71 6c 69 74  mn, -1);.  sqlit
21cd0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
21ce0 28 70 53 74 72 2c 20 7a 4f 70 2c 20 31 29 3b 0a  (pStr, zOp, 1);.
21cf0 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
21d00 6d 41 70 70 65 6e 64 28 70 53 74 72 2c 20 22 3f  mAppend(pStr, "?
21d10 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ", 1);.}../*.** 
21d20 41 72 67 75 6d 65 6e 74 20 70 4c 65 76 65 6c 20  Argument pLevel 
21d30 64 65 73 63 72 69 62 65 73 20 61 20 73 74 72 61  describes a stra
21d40 74 65 67 79 20 66 6f 72 20 73 63 61 6e 6e 69 6e  tegy for scannin
21d50 67 20 74 61 62 6c 65 20 70 54 61 62 2e 20 54 68  g table pTab. Th
21d60 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
21d70 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
21d80 72 20 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  r to a string bu
21d90 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
21da0 61 20 64 65 73 63 72 69 70 74 69 6f 6e 0a 2a 2a  a description.**
21db0 20 6f 66 20 74 68 65 20 73 75 62 73 65 74 20 6f   of the subset o
21dc0 66 20 74 61 62 6c 65 20 72 6f 77 73 20 73 63 61  f table rows sca
21dd0 6e 6e 65 64 20 62 79 20 74 68 65 20 73 74 72 61  nned by the stra
21de0 74 65 67 79 20 69 6e 20 74 68 65 20 66 6f 72 6d  tegy in the form
21df0 20 6f 66 20 61 6e 0a 2a 2a 20 53 51 4c 20 65 78   of an.** SQL ex
21e00 70 72 65 73 73 69 6f 6e 2e 20 4f 72 2c 20 69 66  pression. Or, if
21e10 20 61 6c 6c 20 72 6f 77 73 20 61 72 65 20 73 63   all rows are sc
21e20 61 6e 6e 65 64 2c 20 4e 55 4c 4c 20 69 73 20 72  anned, NULL is r
21e30 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  eturned..**.** F
21e40 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
21e50 68 65 20 71 75 65 72 79 3a 0a 2a 2a 0a 2a 2a 20  he query:.**.** 
21e60 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
21e70 74 31 20 57 48 45 52 45 20 61 3d 31 20 41 4e 44  t1 WHERE a=1 AND
21e80 20 62 3e 32 3b 0a 2a 2a 0a 2a 2a 20 69 73 20 72   b>2;.**.** is r
21e90 75 6e 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  un and there is 
21ea0 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20  an index on (a, 
21eb0 62 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  b), then this fu
21ec0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
21ed0 0a 2a 2a 20 73 74 72 69 6e 67 20 73 69 6d 69 6c  .** string simil
21ee0 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ar to:.**.**   "
21ef0 61 3d 3f 20 41 4e 44 20 62 3e 3f 22 0a 2a 2a 0a  a=? AND b>?".**.
21f00 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
21f10 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 74  pointer points t
21f20 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
21f30 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62  d from sqlite3Db
21f40 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 74 20  Malloc()..** It 
21f50 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
21f60 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
21f70 6c 65 72 20 74 6f 20 66 72 65 65 20 74 68 65 20  ler to free the 
21f80 62 75 66 66 65 72 20 77 68 65 6e 20 69 74 20 69  buffer when it i
21f90 73 0a 2a 2a 20 6e 6f 20 6c 6f 6e 67 65 72 20 72  s.** no longer r
21fa0 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
21fb0 69 63 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e  ic char *explain
21fc0 49 6e 64 65 78 52 61 6e 67 65 28 73 71 6c 69 74  IndexRange(sqlit
21fd0 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4c 65 76  e3 *db, WhereLev
21fe0 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 54 61 62 6c  el *pLevel, Tabl
21ff0 65 20 2a 70 54 61 62 29 7b 0a 20 20 57 68 65 72  e *pTab){.  Wher
22000 65 50 6c 61 6e 20 2a 70 50 6c 61 6e 20 3d 20 26  ePlan *pPlan = &
22010 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 3b 0a 20 20  pLevel->plan;.  
22020 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
22030 70 50 6c 61 6e 2d 3e 75 2e 70 49 64 78 3b 0a 20  pPlan->u.pIdx;. 
22040 20 69 6e 74 20 6e 45 71 20 3d 20 70 50 6c 61 6e   int nEq = pPlan
22050 2d 3e 6e 45 71 3b 0a 20 20 69 6e 74 20 69 2c 20  ->nEq;.  int i, 
22060 6a 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 61 43 6f  j;.  Column *aCo
22070 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
22080 20 20 69 6e 74 20 2a 61 69 43 6f 6c 75 6d 6e 20    int *aiColumn 
22090 3d 20 70 49 6e 64 65 78 2d 3e 61 69 43 6f 6c 75  = pIndex->aiColu
220a0 6d 6e 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 74  mn;.  StrAccum t
220b0 78 74 3b 0a 0a 20 20 69 66 28 20 6e 45 71 3d 3d  xt;..  if( nEq==
220c0 30 20 26 26 20 28 70 50 6c 61 6e 2d 3e 77 73 46  0 && (pPlan->wsF
220d0 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42 54  lags & (WHERE_BT
220e0 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f  M_LIMIT|WHERE_TO
220f0 50 5f 4c 49 4d 49 54 29 29 3d 3d 30 20 29 7b 0a  P_LIMIT))==0 ){.
22100 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
22110 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 63  }.  sqlite3StrAc
22120 63 75 6d 49 6e 69 74 28 26 74 78 74 2c 20 30 2c  cumInit(&txt, 0,
22130 20 30 2c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c   0, SQLITE_MAX_L
22140 45 4e 47 54 48 29 3b 0a 20 20 74 78 74 2e 64 62  ENGTH);.  txt.db
22150 20 3d 20 64 62 3b 0a 20 20 73 71 6c 69 74 65 33   = db;.  sqlite3
22160 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
22170 74 78 74 2c 20 22 20 28 22 2c 20 32 29 3b 0a 20  txt, " (", 2);. 
22180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 71 3b   for(i=0; i<nEq;
22190 20 69 2b 2b 29 7b 0a 20 20 20 20 65 78 70 6c 61   i++){.    expla
221a0 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
221b0 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c  t, i, aCol[aiCol
221c0 75 6d 6e 5b 69 5d 5d 2e 7a 4e 61 6d 65 2c 20 22  umn[i]].zName, "
221d0 3d 22 29 3b 0a 20 20 7d 0a 0a 20 20 6a 20 3d 20  =");.  }..  j = 
221e0 69 3b 0a 20 20 69 66 28 20 70 50 6c 61 6e 2d 3e  i;.  if( pPlan->
221f0 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 42 54  wsFlags&WHERE_BT
22200 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 65  M_LIMIT ){.    e
22210 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65 72 6d  xplainAppendTerm
22220 28 26 74 78 74 2c 20 69 2b 2b 2c 20 61 43 6f 6c  (&txt, i++, aCol
22230 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
22240 61 6d 65 2c 20 22 3e 22 29 3b 0a 20 20 7d 0a 20  ame, ">");.  }. 
22250 20 69 66 28 20 70 50 6c 61 6e 2d 3e 77 73 46 6c   if( pPlan->wsFl
22260 61 67 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49  ags&WHERE_TOP_LI
22270 4d 49 54 20 29 7b 0a 20 20 20 20 65 78 70 6c 61  MIT ){.    expla
22280 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 26 74 78  inAppendTerm(&tx
22290 74 2c 20 69 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c  t, i, aCol[aiCol
222a0 75 6d 6e 5b 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22  umn[j]].zName, "
222b0 3c 22 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  <");.  }.  sqlit
222c0 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
222d0 28 26 74 78 74 2c 20 22 29 22 2c 20 31 29 3b 0a  (&txt, ")", 1);.
222e0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
222f0 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
22300 74 78 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  txt);.}../*.** T
22310 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22320 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 63  a no-op unless c
22330 75 72 72 65 6e 74 6c 79 20 70 72 6f 63 65 73 73  urrently process
22340 69 6e 67 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  ing an EXPLAIN Q
22350 55 45 52 59 20 50 4c 41 4e 0a 2a 2a 20 63 6f 6d  UERY PLAN.** com
22360 6d 61 6e 64 2e 20 49 66 20 74 68 65 20 71 75 65  mand. If the que
22370 72 79 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c 65  ry being compile
22380 64 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20  d is an EXPLAIN 
22390 51 55 45 52 59 20 50 4c 41 4e 2c 20 61 20 73 69  QUERY PLAN, a si
223a0 6e 67 6c 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69  ngle.** record i
223b0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6f  s added to the o
223c0 75 74 70 75 74 20 74 6f 20 64 65 73 63 72 69 62  utput to describ
223d0 65 20 74 68 65 20 74 61 62 6c 65 20 73 63 61 6e  e the table scan
223e0 20 73 74 72 61 74 65 67 79 20 69 6e 20 0a 2a 2a   strategy in .**
223f0 20 70 4c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74   pLevel..*/.stat
22400 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 4f  ic void explainO
22410 6e 65 53 63 61 6e 28 0a 20 20 50 61 72 73 65 20  neScan(.  Parse 
22420 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
22430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
22440 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  se context */.  
22450 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
22460 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
22470 2f 2a 20 54 61 62 6c 65 20 6c 69 73 74 20 74 68  /* Table list th
22480 69 73 20 6c 6f 6f 70 20 72 65 66 65 72 73 20 74  is loop refers t
22490 6f 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  o */.  WhereLeve
224a0 6c 20 2a 70 4c 65 76 65 6c 2c 20 20 20 20 20 20  l *pLevel,      
224b0 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 74         /* Scan t
224c0 6f 20 77 72 69 74 65 20 4f 50 5f 45 78 70 6c 61  o write OP_Expla
224d0 69 6e 20 6f 70 63 6f 64 65 20 66 6f 72 20 2a 2f  in opcode for */
224e0 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20     /* Value for 
22510 22 6c 65 76 65 6c 22 20 63 6f 6c 75 6d 6e 20 6f  "level" column o
22520 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e  f output */.  in
22530 74 20 69 46 72 6f 6d 2c 20 20 20 20 20 20 20 20  t iFrom,        
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22550 20 56 61 6c 75 65 20 66 6f 72 20 22 66 72 6f 6d   Value for "from
22560 22 20 63 6f 6c 75 6d 6e 20 6f 66 20 6f 75 74 70  " column of outp
22570 75 74 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72  ut */.  u16 wctr
22580 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
22590 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
225a0 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
225b0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 2a  e3WhereBegin() *
225c0 2f 0a 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73  /.){.  if( pPars
225d0 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b  e->explain==2 ){
225e0 0a 20 20 20 20 75 33 32 20 66 6c 61 67 73 20 3d  .    u32 flags =
225f0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
22600 46 6c 61 67 73 3b 0a 20 20 20 20 73 74 72 75 63  Flags;.    struc
22610 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22620 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
22630 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
22640 6f 6d 5d 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  om];.    Vdbe *v
22650 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
22660 3b 20 20 20 20 20 20 2f 2a 20 56 4d 20 62 65 69  ;      /* VM bei
22670 6e 67 20 63 6f 6e 73 74 72 75 63 74 65 64 20 2a  ng constructed *
22680 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64  /.    sqlite3 *d
22690 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
226a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
226b0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 63 68  handle */.    ch
226c0 61 72 20 2a 7a 4d 73 67 3b 20 20 20 20 20 20 20  ar *zMsg;       
226d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
226e0 65 78 74 20 74 6f 20 61 64 64 20 74 6f 20 45 51  ext to add to EQ
226f0 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  P output */.    
22700 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 52  sqlite3_int64 nR
22710 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ow;           /*
22720 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
22730 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
22740 20 62 79 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20   by scan */.    
22750 69 6e 74 20 69 49 64 20 3d 20 70 50 61 72 73 65  int iId = pParse
22760 2d 3e 69 53 65 6c 65 63 74 49 64 3b 20 20 2f 2a  ->iSelectId;  /*
22770 20 53 65 6c 65 63 74 20 69 64 20 28 6c 65 66 74   Select id (left
22780 2d 6d 6f 73 74 20 6f 75 74 70 75 74 20 63 6f 6c  -most output col
22790 75 6d 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  umn) */.    int 
227a0 69 73 53 65 61 72 63 68 3b 20 20 20 20 20 20 20  isSearch;       
227b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
227c0 65 20 66 6f 72 20 61 20 53 45 41 52 43 48 2e 20  e for a SEARCH. 
227d0 46 61 6c 73 65 20 66 6f 72 20 53 43 41 4e 2e 20  False for SCAN. 
227e0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 28 66 6c 61  */..    if( (fla
227f0 67 73 26 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f  gs&WHERE_MULTI_O
22800 52 29 20 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67  R) || (wctrlFlag
22810 73 26 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45  s&WHERE_ONETABLE
22820 5f 4f 4e 4c 59 29 20 29 20 72 65 74 75 72 6e 3b  _ONLY) ) return;
22830 0a 0a 20 20 20 20 69 73 53 65 61 72 63 68 20 3d  ..    isSearch =
22840 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e   (pLevel->plan.n
22850 45 71 3e 30 29 0a 20 20 20 20 20 20 20 20 20 20  Eq>0).          
22860 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 28 57 48     || (flags&(WH
22870 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
22880 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 21  ERE_TOP_LIMIT))!
22890 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  =0.             
228a0 7c 7c 20 28 77 63 74 72 6c 46 6c 61 67 73 26 28  || (wctrlFlags&(
228b0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49  WHERE_ORDERBY_MI
228c0 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  N|WHERE_ORDERBY_
228d0 4d 41 58 29 29 3b 0a 0a 20 20 20 20 7a 4d 73 67  MAX));..    zMsg
228e0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
228f0 66 28 64 62 2c 20 22 25 73 22 2c 20 69 73 53 65  f(db, "%s", isSe
22900 61 72 63 68 3f 22 53 45 41 52 43 48 22 3a 22 53  arch?"SEARCH":"S
22910 43 41 4e 22 29 3b 0a 20 20 20 20 69 66 28 20 70  CAN");.    if( p
22920 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Item->pSelect ){
22930 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71  .      zMsg = sq
22940 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
22950 2c 20 7a 4d 73 67 2c 20 22 25 73 20 53 55 42 51  , zMsg, "%s SUBQ
22960 55 45 52 59 20 25 64 22 2c 20 7a 4d 73 67 2c 70  UERY %d", zMsg,p
22970 49 74 65 6d 2d 3e 69 53 65 6c 65 63 74 49 64 29  Item->iSelectId)
22980 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
22990 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
229a0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
229b0 73 67 2c 20 22 25 73 20 54 41 42 4c 45 20 25 73  sg, "%s TABLE %s
229c0 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
229d0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 0a 20  zName);.    }.. 
229e0 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41     if( pItem->zA
229f0 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 7a 4d  lias ){.      zM
22a00 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
22a10 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
22a20 25 73 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c  %s AS %s", zMsg,
22a30 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b   pItem->zAlias);
22a40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
22a50 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  flags & WHERE_IN
22a60 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
22a70 20 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20     char *zWhere 
22a80 3d 20 65 78 70 6c 61 69 6e 49 6e 64 65 78 52 61  = explainIndexRa
22a90 6e 67 65 28 64 62 2c 20 70 4c 65 76 65 6c 2c 20  nge(db, pLevel, 
22aa0 70 49 74 65 6d 2d 3e 70 54 61 62 29 3b 0a 20 20  pItem->pTab);.  
22ab0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22ac0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22ad0 4d 73 67 2c 20 22 25 73 20 55 53 49 4e 47 20 25  Msg, "%s USING %
22ae0 73 25 73 49 4e 44 45 58 25 73 25 73 25 73 22 2c  s%sINDEX%s%s%s",
22af0 20 7a 4d 73 67 2c 20 0a 20 20 20 20 20 20 20 20   zMsg, .        
22b00 20 20 28 28 66 6c 61 67 73 20 26 20 57 48 45 52    ((flags & WHER
22b10 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f 22 41  E_TEMP_INDEX)?"A
22b20 55 54 4f 4d 41 54 49 43 20 22 3a 22 22 29 2c 0a  UTOMATIC ":""),.
22b30 20 20 20 20 20 20 20 20 20 20 28 28 66 6c 61 67            ((flag
22b40 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
22b50 4c 59 29 3f 22 43 4f 56 45 52 49 4e 47 20 22 3a  LY)?"COVERING ":
22b60 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28  ""),.          (
22b70 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  (flags & WHERE_T
22b80 45 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 22 20  EMP_INDEX)?"":" 
22b90 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 28  "),.          ((
22ba0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 45  flags & WHERE_TE
22bb0 4d 50 5f 49 4e 44 45 58 29 3f 22 22 3a 20 70 4c  MP_INDEX)?"": pL
22bc0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  evel->plan.u.pId
22bd0 78 2d 3e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  x->zName),.     
22be0 20 20 20 20 20 7a 57 68 65 72 65 0a 20 20 20 20       zWhere.    
22bf0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
22c00 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 57 68  e3DbFree(db, zWh
22c10 65 72 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ere);.    }else 
22c20 69 66 28 20 66 6c 61 67 73 20 26 20 28 57 48 45  if( flags & (WHE
22c30 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
22c40 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
22c50 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  {.      zMsg = s
22c60 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22c70 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53 49  b, zMsg, "%s USI
22c80 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
22c90 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
22ca0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
22cb0 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20  &WHERE_ROWID_EQ 
22cc0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
22cd0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
22ce0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
22cf0 28 72 6f 77 69 64 3d 3f 29 22 2c 20 7a 4d 73 67  (rowid=?)", zMsg
22d00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
22d10 66 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f  f( (flags&WHERE_
22d20 42 4f 54 48 5f 4c 49 4d 49 54 29 3d 3d 57 48 45  BOTH_LIMIT)==WHE
22d30 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54 20 29 7b  RE_BOTH_LIMIT ){
22d40 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
22d50 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
22d60 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72  db, zMsg, "%s (r
22d70 6f 77 69 64 3e 3f 20 41 4e 44 20 72 6f 77 69 64  owid>? AND rowid
22d80 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  <?)", zMsg);.   
22d90 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61     }else if( fla
22da0 67 73 26 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  gs&WHERE_BTM_LIM
22db0 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  IT ){.        zM
22dc0 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
22dd0 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
22de0 25 73 20 28 72 6f 77 69 64 3e 3f 29 22 2c 20 7a  %s (rowid>?)", z
22df0 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Msg);.      }els
22e00 65 20 69 66 28 20 66 6c 61 67 73 26 57 48 45 52  e if( flags&WHER
22e10 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20  E_TOP_LIMIT ){. 
22e20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
22e30 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62  lite3MAppendf(db
22e40 2c 20 7a 4d 73 67 2c 20 22 25 73 20 28 72 6f 77  , zMsg, "%s (row
22e50 69 64 3c 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20  id<?)", zMsg);. 
22e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
22e70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22e80 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
22e90 20 20 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67    else if( (flag
22ea0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
22eb0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
22ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
22ed0 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
22ee0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
22ef0 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
22f00 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
22f10 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
22f20 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c 20 54  g, "%s VIRTUAL T
22f30 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a 25 73  ABLE INDEX %d:%s
22f40 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20 20 20  ", zMsg,.       
22f50 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
22f60 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 70 56 74  Idx->idxNum, pVt
22f70 61 62 49 64 78 2d 3e 69 64 78 53 74 72 29 3b 0a  abIdx->idxStr);.
22f80 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22f90 20 69 66 28 20 77 63 74 72 6c 46 6c 61 67 73 26   if( wctrlFlags&
22fa0 28 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f 4d  (WHERE_ORDERBY_M
22fb0 49 4e 7c 57 48 45 52 45 5f 4f 52 44 45 52 42 59  IN|WHERE_ORDERBY
22fc0 5f 4d 41 58 29 20 29 7b 0a 20 20 20 20 20 20 74  _MAX) ){.      t
22fd0 65 73 74 63 61 73 65 28 20 77 63 74 72 6c 46 6c  estcase( wctrlFl
22fe0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
22ff0 52 42 59 5f 4d 49 4e 20 29 3b 0a 20 20 20 20 20  RBY_MIN );.     
23000 20 6e 52 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d   nRow = 1;.    }
23010 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 6f 77  else{.      nRow
23020 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
23030 34 29 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 6e  4)pLevel->plan.n
23040 52 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  Row;.    }.    z
23050 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
23060 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
23070 22 25 73 20 28 7e 25 6c 6c 64 20 72 6f 77 73 29  "%s (~%lld rows)
23080 22 2c 20 7a 4d 73 67 2c 20 6e 52 6f 77 29 3b 0a  ", zMsg, nRow);.
23090 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
230a0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c  ddOp4(v, OP_Expl
230b0 61 69 6e 2c 20 69 49 64 2c 20 69 4c 65 76 65 6c  ain, iId, iLevel
230c0 2c 20 69 46 72 6f 6d 2c 20 7a 4d 73 67 2c 20 50  , iFrom, zMsg, P
230d0 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 7d 0a  4_DYNAMIC);.  }.
230e0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
230f0 20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28   explainOneScan(
23100 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
23110 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
23120 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 0a  IT_EXPLAIN */...
23130 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
23140 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61 72  ode for the star
23150 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c 2d  t of the iLevel-
23160 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20 57  th loop in the W
23170 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20 69  HERE clause.** i
23180 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64 65  mplementation de
23190 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e 66  scribed by pWInf
231a0 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  o..*/.static Bit
231b0 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70  mask codeOneLoop
231c0 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49 6e  Start(.  WhereIn
231d0 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f 2a  fo *pWInfo,   /*
231e0 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72 6d   Complete inform
231f0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
23200 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
23210 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
23220 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
23230 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f 2d  level of pWInfo-
23240 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20 63  >a[] should be c
23250 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77 63  oded */.  u16 wc
23260 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20 2f  trlFlags,      /
23270 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48 45  * One of the WHE
23280 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69 6e  RE_* flags defin
23290 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74 2e  ed in sqliteInt.
232a0 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  h */.  Bitmask n
232b0 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20 57  otReady     /* W
232c0 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20  hich tables are 
232d0 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
232e0 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ble */.){.  int 
232f0 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  j, k;           
23300 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23310 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 3b  s */.  int iCur;
23320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
23330 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
23340 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a  or the table */.
23350 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20 20    int addrNxt;  
23360 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
23370 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74 69  to jump to conti
23380 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78  nue with the nex
23390 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20 69  t IN case */.  i
233a0 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20 20  nt omitTable;   
233b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
233c0 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
233d0 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  only */.  int bR
233e0 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ev;            /
233f0 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
23400 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
23410 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
23420 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
23430 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65 72  el;  /* The wher
23440 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63 6f  e level to be co
23450 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ded */.  WhereCl
23460 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f 2a  ause *pWC;    /*
23470 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f   Decomposition o
23480 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48 45  f the entire WHE
23490 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  RE clause */.  W
234a0 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
234b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
234c0 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73 65  * A WHERE clause
234d0 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73 65   term */.  Parse
234e0 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
234f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
23500 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
23510 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
23520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23530 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61 72     /* The prepar
23540 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63 6f  ed stmt under co
23550 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20  nstructions */. 
23560 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
23570 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20  item *pTabItem; 
23580 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20   /* FROM clause 
23590 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65 64  term being coded
235a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42 72   */.  int addrBr
235b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
235c0 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
235d0 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20  re to break out 
235e0 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20  of the loop */. 
235f0 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20 20   int addrCont;  
23600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23610 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f   /* Jump here to
23620 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 6e   continue with n
23630 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20 69  ext cycle */.  i
23640 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20 30  nt iRowidReg = 0
23650 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ;        /* Rowi
23660 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  d is stored in t
23670 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69 66  his register, if
23680 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20 69   not zero */.  i
23690 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d  nt iReleaseReg =
236a0 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d 70   0;      /* Temp
236b0 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72 65   register to fre
236c0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
236d0 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65 20  ng */..  pParse 
236e0 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65  = pWInfo->pParse
236f0 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d 3e  ;.  v = pParse->
23700 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20 70  pVdbe;.  pWC = p
23710 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c  WInfo->pWC;.  pL
23720 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  evel = &pWInfo->
23730 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54 61  a[iLevel];.  pTa
23740 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f 2d  bItem = &pWInfo-
23750 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  >pTabList->a[pLe
23760 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69  vel->iFrom];.  i
23770 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
23780 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76 20  iCursor;.  bRev 
23790 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  = (pLevel->plan.
237a0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
237b0 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20 6f  REVERSE)!=0;.  o
237c0 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76  mitTable = (pLev
237d0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
237e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
237f0 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  Y)!=0 .         
23800 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67 73    && (wctrlFlags
23810 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54   & WHERE_FORCE_T
23820 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20  ABLE)==0;..  /* 
23830 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66 6f  Create labels fo
23840 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61 6e  r the "break" an
23850 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73  d "continue" ins
23860 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20 66  tructions.  ** f
23870 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  or the current l
23880 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61 64  oop.  Jump to ad
23890 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  drBrk to break o
238a0 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
238b0 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20  ** Jump to cont 
238c0 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c  to go immediatel
238d0 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74  y to the next it
238e0 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20  eration of the. 
238f0 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20   ** loop..  **. 
23900 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20 69   ** When there i
23910 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  s an IN operator
23920 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20 61  , we also have a
23930 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c   "addrNxt" label
23940 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e 73   that.  ** means
23950 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
23960 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76 61  h the next IN va
23970 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  lue combination.
23980 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65 72    When.  ** ther
23990 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65 72  e are no IN oper
239a0 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f 6e  ators in the con
239b0 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22 61  straints, the "a
239c0 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20 20  ddrNxt" label.  
239d0 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ** is the same a
239e0 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20 2a  s "addrBrk"..  *
239f0 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70 4c  /.  addrBrk = pL
23a00 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d 20  evel->addrBrk = 
23a10 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 20  pLevel->addrNxt 
23a20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
23a30 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64 64  eLabel(v);.  add
23a40 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  rCont = pLevel->
23a50 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69 74  addrCont = sqlit
23a60 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
23a70 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  v);..  /* If thi
23a80 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74  s is the right t
23a90 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f  able of a LEFT O
23aa0 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63  UTER JOIN, alloc
23ab0 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e 69  ate and.  ** ini
23ac0 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
23ad0 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
23ae0 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
23af0 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 2a   matches any.  *
23b00 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
23b10 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
23b20 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
23b30 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20  pLevel->iFrom>0 
23b40 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e  && (pTabItem[0].
23b50 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
23b60 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 4c  FT)!=0 ){.    pL
23b70 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23b80 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
23b90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
23ba0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
23bb0 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65 6c  teger, 0, pLevel
23bc0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20  ->iLeftJoin);.  
23bd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
23be0 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  , "init LEFT JOI
23bf0 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
23c00 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ));.  }..#ifndef
23c10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23c20 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
23c30 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
23c40 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
23c50 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
23c60 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 30  ){.    /* Case 0
23c70 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73 20  :  The table is 
23c80 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 2e  a virtual-table.
23c90 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74 65    Use the VFilte
23ca0 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20 20  r and VNext.    
23cb0 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20 61  **          to a
23cc0 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a  ccess the data..
23cd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69      */.    int i
23ce0 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c  Reg;   /* P3 Val
23cf0 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65  ue for OP_VFilte
23d00 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  r */.    sqlite3
23d10 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56 74  _index_info *pVt
23d20 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  abIdx = pLevel->
23d30 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78 3b  plan.u.pVtabIdx;
23d40 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72  .    int nConstr
23d50 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78 2d  aint = pVtabIdx-
23d60 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >nConstraint;.  
23d70 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33    struct sqlite3
23d80 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
23d90 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20  t_usage *aUsage 
23da0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f 6e    pVtabIdx->aCon
23de0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
23df0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
23e00 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
23e10 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72  straint *aConstr
23e20 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20  aint =.         
23e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e50 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
23e60 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a 20  >aConstraint;.. 
23e70 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
23e80 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29 3b  chePush(pParse);
23e90 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69  .    iReg = sqli
23ea0 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28  te3GetTempRange(
23eb0 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61  pParse, nConstra
23ec0 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28  int+2);.    for(
23ed0 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61  j=1; j<=nConstra
23ee0 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
23ef0 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e   for(k=0; k<nCon
23f00 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20  straint; k++){. 
23f10 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67         if( aUsag
23f20 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d  e[k].argvIndex==
23f30 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  j ){.          i
23f40 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
23f50 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f  traint[k].iTermO
23f60 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20  ffset;.         
23f70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
23f80 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b  (pParse, pWC->a[
23f90 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52  iTerm].pExpr->pR
23fa0 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b  ight, iReg+j+1);
23fb0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
23fc0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23fd0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d    }.      if( k=
23fe0 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62  =nConstraint ) b
23ff0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
24000 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24010 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
24020 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75   pVtabIdx->idxNu
24030 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71  m, iReg);.    sq
24040 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
24050 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a  v, OP_Integer, j
24060 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20  -1, iReg+1);.   
24070 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24080 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72  p4(v, OP_VFilter
24090 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c  , iCur, addrBrk,
240a0 20 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d   iReg, pVtabIdx-
240b0 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20  >idxStr,.       
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
240d0 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46  VtabIdx->needToF
240e0 72 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d  reeIdxStr ? P4_M
240f0 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54  PRINTF : P4_STAT
24100 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64  IC);.    pVtabId
24110 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
24120 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  Str = 0;.    for
24130 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61  (j=0; j<nConstra
24140 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  int; j++){.     
24150 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f   if( aUsage[j].o
24160 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  mit ){.        i
24170 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73  nt iTerm = aCons
24180 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f  traint[j].iTermO
24190 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64  ffset;.        d
241a0 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
241b0 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d  l, &pWC->a[iTerm
241c0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
241d0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  }.    pLevel->op
241e0 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
241f0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
24200 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
24210 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  p2 = sqlite3Vdbe
24220 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
24230 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61      sqlite3Relea
24240 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72  seTempRange(pPar
24250 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74  se, iReg, nConst
24260 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 73 71  raint+2);.    sq
24270 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
24280 70 28 70 50 61 72 73 65 2c 20 31 29 3b 0a 20 20  p(pParse, 1);.  
24290 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20  }else.#endif /* 
242a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
242b0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69  UALTABLE */..  i
242c0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
242d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
242e0 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20  ROWID_EQ ){.    
242f0 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63  /* Case 1:  We c
24300 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
24310 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
24320 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
24330 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75 61  **          equa
24340 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
24350 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
24360 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20  D field.  Or.   
24370 20 2a 2a 20 20 20 20 20 20 20 20 20 20 77 65 20   **          we 
24380 72 65 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70  reference multip
24390 6c 65 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20  le rows using a 
243a0 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22  "rowid IN (...)"
243b0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
243c0 20 63 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20   construct..    
243d0 2a 2f 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52  */.    iReleaseR
243e0 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
243f0 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
24400 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
24410 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
24420 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
24430 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20  _EQ|WO_IN, 0);. 
24440 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
24450 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
24460 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
24470 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
24480 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
24490 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
244a0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
244b0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  le==0 );.    tes
244c0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
244d0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52  Flags & TERM_VIR
244e0 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52  TUAL ); /* EV: R
244f0 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a  -30575-11662 */.
24500 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
24510 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
24520 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
24530 70 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65  pLevel, iRelease
24540 52 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78  Reg);.    addrNx
24550 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
24560 4e 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Nxt;.    sqlite3
24570 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24580 5f 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77  _MustBeInt, iRow
24590 69 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b  idReg, addrNxt);
245a0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
245b0 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74  AddOp3(v, OP_Not
245c0 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64  Exists, iCur, ad
245d0 64 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67  drNxt, iRowidReg
245e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
245f0 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61  prCacheStore(pPa
24600 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69  rse, iCur, -1, i
24610 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56  RowidReg);.    V
24620 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
24630 70 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  pk"));.    pLeve
24640 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  l->op = OP_Noop;
24650 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
24660 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
24670 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
24680 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20  RANGE ){.    /* 
24690 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65  Case 2:  We have
246a0 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63   an inequality c
246b0 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73  omparison agains
246c0 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c  t the ROWID fiel
246d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
246e0 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
246f0 6f 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72  op;.    int star
24700 74 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e  t;.    int memEn
24710 64 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20  dValue = 0;.    
24720 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
24730 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61  t, *pEnd;..    a
24740 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
24750 3d 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72  ==0 );.    pStar
24760 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  t = findTerm(pWC
24770 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52  , iCur, -1, notR
24780 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
24790 45 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20  E, 0);.    pEnd 
247a0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
247b0 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
247c0 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
247d0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65   0);.    if( bRe
247e0 76 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  v ){.      pTerm
247f0 20 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20   = pStart;.     
24800 20 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a   pStart = pEnd;.
24810 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65        pEnd = pTe
24820 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rm;.    }.    if
24830 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20  ( pStart ){.    
24840 20 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20    Expr *pX;     
24850 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
24860 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64  xpression that d
24870 65 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74  efines the start
24880 20 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20   bound */.      
24890 69 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20  int r1, rTemp;  
248a0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
248b0 72 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74  rs for holding t
248c0 68 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72  he start boundar
248d0 79 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54  y */..      /* T
248e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e  he following con
248f0 73 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78  stant maps TK_xx
24900 20 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72   codes into corr
24910 65 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20  esponding .     
24920 20 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73   ** seek opcodes
24930 2e 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e  .  It depends on
24940 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72   a particular or
24950 64 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a  dering of TK_xx.
24960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
24970 6f 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b  onst u8 aMoveOp[
24980 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
24990 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50   /* TK_GT */  OP
249a0 5f 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20  _SeekGt,.       
249b0 20 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20      /* TK_LE */ 
249c0 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20   OP_SeekLe,.    
249d0 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20         /* TK_LT 
249e0 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20  */  OP_SeekLt,. 
249f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
24a00 47 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65  GE */  OP_SeekGe
24a10 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20  .      };.      
24a20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54  assert( TK_LE==T
24a30 4b 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f  K_GT+1 );      /
24a40 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
24a50 6f 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20  ordering.. */.  
24a60 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
24a70 54 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20  T==TK_GT+2 );   
24a80 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68     /*  ... of th
24a90 65 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e  e TK_xx values..
24aa0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
24ab0 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b  t( TK_GE==TK_GT+
24ac0 33 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  3 );      /*  ..
24ad0 2e 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a  . is correcct. *
24ae0 2f 0a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  /..      testcas
24af0 65 28 20 70 53 74 61 72 74 2d 3e 77 74 46 6c 61  e( pStart->wtFla
24b00 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
24b10 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30  L ); /* EV: R-30
24b20 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20  575-11662 */.   
24b30 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
24b40 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
24b50 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20  ert( pX!=0 );.  
24b60 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 61      assert( pSta
24b70 72 74 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rt->leftCursor==
24b80 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 72 31  iCur );.      r1
24b90 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
24ba0 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
24bb0 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 54 65 6d  X->pRight, &rTem
24bc0 70 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  p);.      sqlite
24bd0 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 61  3VdbeAddOp3(v, a
24be0 4d 6f 76 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b  MoveOp[pX->op-TK
24bf0 5f 47 54 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  _GT], iCur, addr
24c00 42 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  Brk, r1);.      
24c10 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
24c20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 73 71  "pk"));.      sq
24c30 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 41 66  lite3ExprCacheAf
24c40 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70 50 61  finityChange(pPa
24c50 72 73 65 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20  rse, r1, 1);.   
24c60 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
24c70 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c  eTempReg(pParse,
24c80 20 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 64   rTemp);.      d
24c90 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
24ca0 6c 2c 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20  l, pStart);.    
24cb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
24cc0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24cd0 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
24ce0 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
24cf0 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
24d00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 6e 64    }.    if( pEnd
24d10 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
24d20 70 58 3b 0a 20 20 20 20 20 20 70 58 20 3d 20 70  pX;.      pX = p
24d30 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  End->pExpr;.    
24d40 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
24d50 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
24d60 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f   pEnd->leftCurso
24d70 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  r==iCur );.     
24d80 20 74 65 73 74 63 61 73 65 28 20 70 45 6e 64 2d   testcase( pEnd-
24d90 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24da0 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
24db0 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
24dc0 2a 2f 0a 20 20 20 20 20 20 6d 65 6d 45 6e 64 56  */.      memEndV
24dd0 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  alue = ++pParse-
24de0 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c  >nMem;.      sql
24df0 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
24e00 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
24e10 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20   memEndValue);. 
24e20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d       if( pX->op=
24e30 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LT || pX->op
24e40 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20  ==TK_GT ){.     
24e50 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76     testOp = bRev
24e60 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65   ? OP_Le : OP_Ge
24e70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
24e80 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
24e90 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
24ea0 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  P_Gt;.      }.  
24eb0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
24ec0 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20  pLevel, pEnd);. 
24ed0 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74 20 3d     }.    start =
24ee0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
24ef0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
24f00 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
24f10 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
24f20 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  _Next;.    pLeve
24f30 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
24f40 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
24f50 74 61 72 74 3b 0a 20 20 20 20 69 66 28 20 70 53  tart;.    if( pS
24f60 74 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d  tart==0 && pEnd=
24f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76  =0 ){.      pLev
24f80 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f  el->p5 = SQLITE_
24f90 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53  STMTSTATUS_FULLS
24fa0 43 41 4e 5f 53 54 45 50 3b 0a 20 20 20 20 7d 65  CAN_STEP;.    }e
24fb0 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
24fc0 74 28 20 70 4c 65 76 65 6c 2d 3e 70 35 3d 3d 30  t( pLevel->p5==0
24fd0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   );.    }.    if
24fe0 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f  ( testOp!=OP_Noo
24ff0 70 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69  p ){.      iRowi
25000 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52  dReg = iReleaseR
25010 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  eg = sqlite3GetT
25020 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
25030 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
25040 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
25050 77 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69  wid, iCur, iRowi
25060 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
25070 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
25080 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
25090 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
250a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
250b0 62 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74  beAddOp3(v, test
250c0 4f 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c  Op, memEndValue,
250d0 20 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64   addrBrk, iRowid
250e0 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
250f0 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
25100 76 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  v, SQLITE_AFF_NU
25110 4d 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a  MERIC | SQLITE_J
25120 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
25130 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c  }.  }else if( pL
25140 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
25150 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
25160 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43  MN_RANGE|WHERE_C
25170 4f 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20  OLUMN_EQ) ){.   
25180 20 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63   /* Case 3: A sc
25190 61 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65  an using an inde
251a0 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  x..    **.    **
251b0 20 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45           The WHE
251c0 52 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f  RE clause may co
251d0 6e 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f  ntain zero or mo
251e0 72 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20  re equality .   
251f0 20 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d   **         term
25200 73 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  s ("==" or "IN" 
25210 6f 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20  operators) that 
25220 72 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20  refer to the N. 
25230 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65     **         le
25240 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ft-most columns 
25250 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74  of the index. It
25260 20 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69   may also contai
25270 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
25280 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
25290 74 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e  traints (>, <, >
252a0 3d 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20  = or <=) on the 
252b0 69 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20  indexed.    **  
252c0 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68         column th
252d0 61 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  at immediately f
252e0 6f 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75  ollows the N equ
252f0 61 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20  alities. Only . 
25300 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
25310 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c  e right-most col
25320 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e  umn can be an in
25330 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72  equality - the r
25340 65 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20  est must.    ** 
25350 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20          use the 
25360 22 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70  "==" and "IN" op
25370 65 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61  erators. For exa
25380 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20  mple, if the .  
25390 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64    **         ind
253a0 65 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29  ex is on (x,y,z)
253b0 2c 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f  , then the follo
253c0 77 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65  wing clauses are
253d0 20 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20   all .    **    
253e0 20 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a       optimized:.
253f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
25400 20 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20           x=5.   
25410 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
25420 3d 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20  =5 AND y=10.    
25430 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
25440 35 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a  5 AND y<10.    *
25450 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
25460 20 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31   AND y>5 AND y<1
25470 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
25480 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20      x=5 AND y=5 
25490 41 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a  AND z<=10.    **
254a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
254b0 54 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66  The z<10 term of
254c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
254d0 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f  annot be used, o
254e0 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  nly.    **      
254f0 20 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a     the x=5 term:
25500 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
25510 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
25520 44 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20  D z<10.    **.  
25530 20 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d    **         N m
25540 61 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68  ay be zero if th
25550 65 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69  ere are inequali
25560 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  ty constraints..
25570 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49      **         I
25580 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69  f there are no i
25590 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
255a0 61 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73  aints, then N is
255b0 20 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   at.    **      
255c0 20 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20     least one..  
255d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
255e0 20 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73      This case is
255f0 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20   also used when 
25600 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45  there are no WHE
25610 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a  RE clause.    **
25620 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61           constra
25630 69 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65  ints but an inde
25640 78 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e  x is selected an
25650 79 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20  yway, in order. 
25660 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
25670 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
25680 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
25690 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
256a0 59 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20  Y..    */  .    
256b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
256c0 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
256d0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
256e0 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
256f0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
25700 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
25710 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
25720 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
25730 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
25740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
25750 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
25760 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
25770 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
25780 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
25790 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
257a0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
257b0 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
257c0 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
257d0 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
257e0 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
257f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
25800 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
25810 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
25820 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
25830 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
25840 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
25850 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
25860 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
25870 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
25880 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
25890 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
258a0 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
258b0 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
258c0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
258d0 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  aEndOp[] = {.   
258e0 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20     OP_Noop,     
258f0 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21          /* 0: (!
25900 65 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29  end_constraints)
25910 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78   */.      OP_Idx
25920 47 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  GE,            /
25930 2a 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72  * 1: (end_constr
25940 61 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20  aints && !bRev) 
25950 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c  */.      OP_IdxL
25960 54 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  T             /*
25970 20 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   2: (end_constra
25980 69 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f  ints && bRev) */
25990 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20  .    };.    int 
259a0 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c  nEq = pLevel->pl
259b0 61 6e 2e 6e 45 71 3b 20 20 2f 2a 20 4e 75 6d 62  an.nEq;  /* Numb
259c0 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 74  er of == or IN t
259d0 65 72 6d 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  erms */.    int 
259e0 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20  isMinQuery = 0; 
259f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
25a00 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
25a10 7a 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78  zed SELECT min(x
25a20 29 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ).. */.    int r
25a30 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
25a40 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20          /* Base 
25a50 72 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  register holding
25a60 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
25a70 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31  es */.    int r1
25a80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25a90 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72         /* Temp r
25aa0 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57  egister */.    W
25ab0 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
25ac0 53 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49  Start = 0;  /* I
25ad0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
25ae0 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74  aint at range st
25af0 61 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  art */.    Where
25b00 54 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20  Term *pRangeEnd 
25b10 3d 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75  = 0;    /* Inequ
25b20 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
25b30 20 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f   at range end */
25b40 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71  .    int startEq
25b50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25b60 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e    /* True if ran
25b70 67 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d  ge start uses ==
25b80 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20  , >= or <= */.  
25b90 20 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20    int endEq;    
25ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25bb0 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20  * True if range 
25bc0 65 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20  end uses ==, >= 
25bd0 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74  or <= */.    int
25be0 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e   start_constrain
25bf0 74 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61  ts;       /* Sta
25c00 72 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63  rt of range is c
25c10 6f 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20  onstrained */.  
25c20 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
25c30 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
25c40 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
25c50 74 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a  traint terms */.
25c60 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b      Index *pIdx;
25c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c80 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
25c90 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
25ca0 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
25cb0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
25cc0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
25cd0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
25ce0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  dex */.    int n
25cf0 45 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20  ExtraReg = 0;   
25d00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
25d10 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
25d20 74 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20  ters needed */. 
25d30 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20     int op;      
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 2f 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f  /* Instruction o
25d60 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61  pcode */.    cha
25d70 72 20 2a 7a 53 74 61 72 74 41 66 66 3b 20 20 20  r *zStartAff;   
25d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66            /* Aff
25d90 69 6e 69 74 79 20 66 6f 72 20 73 74 61 72 74 20  inity for start 
25da0 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  of range constra
25db0 69 6e 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  int */.    char 
25dc0 2a 7a 45 6e 64 41 66 66 3b 20 20 20 20 20 20 20  *zEndAff;       
25dd0 20 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e          /* Affin
25de0 69 74 79 20 66 6f 72 20 65 6e 64 20 6f 66 20 72  ity for end of r
25df0 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ange constraint 
25e00 2a 2f 0a 0a 20 20 20 20 70 49 64 78 20 3d 20 70  */..    pIdx = p
25e10 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49  Level->plan.u.pI
25e20 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
25e30 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
25e40 72 3b 0a 20 20 20 20 6b 20 3d 20 70 49 64 78 2d  r;.    k = pIdx-
25e50 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20  >aiColumn[nEq]; 
25e60 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f      /* Column fo
25e70 72 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  r inequality con
25e80 73 74 72 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20  straints */..   
25e90 20 2f 2a 20 49 66 20 74 68 69 73 20 6c 6f 6f 70   /* If this loop
25ea0 20 73 61 74 69 73 66 69 65 73 20 61 20 73 6f 72   satisfies a sor
25eb0 74 20 6f 72 64 65 72 20 28 70 4f 72 64 65 72 42  t order (pOrderB
25ec0 79 29 20 72 65 71 75 65 73 74 20 74 68 61 74 20  y) request that 
25ed0 0a 20 20 20 20 2a 2a 20 77 61 73 20 70 61 73 73  .    ** was pass
25ee0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
25ef0 69 6f 6e 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  ion to implement
25f00 20 61 20 22 53 45 4c 45 43 54 20 6d 69 6e 28 78   a "SELECT min(x
25f10 29 20 2e 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71  ) ..." .    ** q
25f20 75 65 72 79 2c 20 74 68 65 6e 20 74 68 65 20 63  uery, then the c
25f30 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20  aller will only 
25f40 61 6c 6c 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74  allow the loop t
25f50 6f 20 72 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a  o run for.    **
25f60 20 61 20 73 69 6e 67 6c 65 20 69 74 65 72 61 74   a single iterat
25f70 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ion. This means 
25f80 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
25f90 6f 77 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  ow returned.    
25fa0 2a 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61  ** should not ha
25fb0 76 65 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  ve a NULL value 
25fc0 73 74 6f 72 65 64 20 69 6e 20 27 78 27 2e 20 49  stored in 'x'. I
25fd0 66 20 63 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a  f column 'x' is.
25fe0 20 20 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74      ** the first
25ff0 20 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20 6e   one after the n
26000 45 71 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  Eq equality cons
26010 74 72 61 69 6e 74 73 20 69 6e 20 74 68 65 20 69  traints in the i
26020 6e 64 65 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69  ndex,.    ** thi
26030 73 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20  s requires some 
26040 73 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67  special handling
26050 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
26060 20 28 77 63 74 72 6c 46 6c 61 67 73 26 57 48 45   (wctrlFlags&WHE
26070 52 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21  RE_ORDERBY_MIN)!
26080 3d 30 0a 20 20 20 20 20 26 26 20 28 70 4c 65 76  =0.     && (pLev
26090 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
260a0 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 0a  &WHERE_ORDERBY).
260b0 20 20 20 20 20 26 26 20 28 70 49 64 78 2d 3e 6e       && (pIdx->n
260c0 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20  Column>nEq).    
260d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  ){.      /* asse
260e0 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  rt( pOrderBy->nE
260f0 78 70 72 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  xpr==1 ); */.   
26100 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
26110 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78  rderBy->a[0].pEx
26120 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  pr->iColumn==pId
26130 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d  x->aiColumn[nEq]
26140 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d   ); */.      isM
26150 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a 20 20 20  inQuery = 1;.   
26160 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31     nExtraReg = 1
26170 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
26180 46 69 6e 64 20 61 6e 79 20 69 6e 65 71 75 61 6c  Find any inequal
26190 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  ity constraint t
261a0 65 72 6d 73 20 66 6f 72 20 74 68 65 20 73 74 61  erms for the sta
261b0 72 74 20 61 6e 64 20 65 6e 64 20 0a 20 20 20 20  rt and end .    
261c0 2a 2a 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e  ** of the range.
261d0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
261e0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
261f0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f  Flags & WHERE_TO
26200 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  P_LIMIT ){.     
26210 20 70 52 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e   pRangeEnd = fin
26220 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
26230 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57   k, notReady, (W
26240 4f 5f 4c 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64  O_LT|WO_LE), pId
26250 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61  x);.      nExtra
26260 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Reg = 1;.    }. 
26270 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
26280 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
26290 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
262a0 0a 20 20 20 20 20 20 70 52 61 6e 67 65 53 74 61  .      pRangeSta
262b0 72 74 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rt = findTerm(pW
262c0 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
262d0 65 61 64 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f  eady, (WO_GT|WO_
262e0 47 45 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  GE), pIdx);.    
262f0 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b    nExtraReg = 1;
26300 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
26310 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
26320 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
26330 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
26340 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
26350 20 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68   ** and store th
26360 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f 73  e values of thos
26370 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 61 72  e terms in an ar
26380 72 61 79 20 6f 66 20 72 65 67 69 73 74 65 72 73  ray of registers
26390 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e 67  .    ** starting
263a0 20 61 74 20 72 65 67 42 61 73 65 2e 0a 20 20 20   at regBase..   
263b0 20 2a 2f 0a 20 20 20 20 72 65 67 42 61 73 65 20   */.    regBase 
263c0 3d 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74  = codeAllEqualit
263d0 79 54 65 72 6d 73 28 0a 20 20 20 20 20 20 20 20  yTerms(.        
263e0 70 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20  pParse, pLevel, 
263f0 70 57 43 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  pWC, notReady, n
26400 45 78 74 72 61 52 65 67 2c 20 26 7a 53 74 61 72  ExtraReg, &zStar
26410 74 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  tAff.    );.    
26420 7a 45 6e 64 41 66 66 20 3d 20 73 71 6c 69 74 65  zEndAff = sqlite
26430 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
26440 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
26450 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20  ;.    addrNxt = 
26460 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b  pLevel->addrNxt;
26470 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61  ..    /* If we a
26480 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72  re doing a rever
26490 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  se order scan on
264a0 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
264b0 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61  dex, or.    ** a
264c0 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73   forward order s
264d0 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64  can on a descend
264e0 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72  ing index, inter
264f0 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20  change the .    
26500 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  ** start and end
26510 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74   terms (pRangeSt
26520 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e  art and pRangeEn
26530 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  d)..    */.    i
26540 66 28 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  f( nEq<pIdx->nCo
26550 6c 75 6d 6e 20 26 26 20 62 52 65 76 3d 3d 28 70  lumn && bRev==(p
26560 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
26570 6e 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  nEq]==SQLITE_SO_
26580 41 53 43 29 20 29 7b 0a 20 20 20 20 20 20 53 57  ASC) ){.      SW
26590 41 50 28 57 68 65 72 65 54 65 72 6d 20 2a 2c 20  AP(WhereTerm *, 
265a0 70 52 61 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67  pRangeEnd, pRang
265b0 65 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a  eStart);.    }..
265c0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52      testcase( pR
265d0 61 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61  angeStart && pRa
265e0 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61  ngeStart->eOpera
265f0 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
26600 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26610 6e 67 65 53 74 61 72 74 20 26 26 20 70 52 61 6e  ngeStart && pRan
26620 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
26630 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
26640 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
26650 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
26660 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
26670 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
26680 74 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64  tcase( pRangeEnd
26690 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65   && pRangeEnd->e
266a0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
266b0 20 29 3b 0a 20 20 20 20 73 74 61 72 74 45 71 20   );.    startEq 
266c0 3d 20 21 70 52 61 6e 67 65 53 74 61 72 74 20 7c  = !pRangeStart |
266d0 7c 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  | pRangeStart->e
266e0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
266f0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e  E|WO_GE);.    en
26700 64 45 71 20 3d 20 20 20 21 70 52 61 6e 67 65 45  dEq =   !pRangeE
26710 6e 64 20 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d  nd || pRangeEnd-
26720 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
26730 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20  _LE|WO_GE);.    
26740 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
26750 73 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 20  s = pRangeStart 
26760 7c 7c 20 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f  || nEq>0;..    /
26770 2a 20 53 65 65 6b 20 74 68 65 20 69 6e 64 65 78  * Seek the index
26780 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 73   cursor to the s
26790 74 61 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67  tart of the rang
267a0 65 2e 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74  e. */.    nConst
267b0 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20  raint = nEq;.   
267c0 20 69 66 28 20 70 52 61 6e 67 65 53 74 61 72 74   if( pRangeStart
267d0 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
267e0 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 53  pRight = pRangeS
267f0 74 61 72 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69  tart->pExpr->pRi
26800 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
26810 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
26820 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
26830 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 69  se+nEq);.      i
26840 66 28 20 28 70 52 61 6e 67 65 53 74 61 72 74 2d  f( (pRangeStart-
26850 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
26860 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20 20  VNULL)==0 ){.   
26870 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
26880 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28 76  CodeIsNullJump(v
26890 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  , pRight, regBas
268a0 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
268b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
268c0 66 28 20 7a 53 74 61 72 74 41 66 66 20 29 7b 0a  f( zStartAff ){.
268d0 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
268e0 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
268f0 74 79 28 70 52 69 67 68 74 2c 20 7a 53 74 61 72  ty(pRight, zStar
26900 74 41 66 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49  tAff[nEq])==SQLI
26910 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20  TE_AFF_NONE){.  
26920 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
26930 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
26940 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d  is to be perform
26950 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65  ed with no conve
26960 72 73 69 6f 6e 73 0a 20 20 20 20 20 20 20 20 20  rsions.         
26970 20 2a 2a 20 61 70 70 6c 69 65 64 20 74 6f 20 74   ** applied to t
26980 68 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74  he operands, set
26990 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
269a0 20 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74   apply to pRight
269b0 20 74 6f 20 0a 20 20 20 20 20 20 20 20 20 20 2a   to .          *
269c0 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  * SQLITE_AFF_NON
269d0 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  E.  */.         
269e0 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20   zStartAff[nEq] 
269f0 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  = SQLITE_AFF_NON
26a00 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
26a10 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
26a20 45 78 70 72 4e 65 65 64 73 4e 6f 41 66 66 69 6e  ExprNeedsNoAffin
26a30 69 74 79 43 68 61 6e 67 65 28 70 52 69 67 68 74  ityChange(pRight
26a40 2c 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d  , zStartAff[nEq]
26a50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ) ){.          z
26a60 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 20 3d 20  StartAff[nEq] = 
26a70 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
26a80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
26a90 20 7d 20 20 0a 20 20 20 20 20 20 6e 43 6f 6e 73   }  .      nCons
26aa0 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  traint++;.      
26ab0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
26ac0 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
26ad0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
26ae0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
26af0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 65 6c  11662 */.    }el
26b00 73 65 20 69 66 28 20 69 73 4d 69 6e 51 75 65 72  se if( isMinQuer
26b10 79 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  y ){.      sqlit
26b20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
26b30 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42  OP_Null, 0, regB
26b40 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20  ase+nEq);.      
26b50 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20  nConstraint++;. 
26b60 20 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 30       startEq = 0
26b70 3b 0a 20 20 20 20 20 20 73 74 61 72 74 5f 63 6f  ;.      start_co
26b80 6e 73 74 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20  nstraints = 1;. 
26b90 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 41 70 70     }.    codeApp
26ba0 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72 73  lyAffinity(pPars
26bb0 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e  e, regBase, nCon
26bc0 73 74 72 61 69 6e 74 2c 20 7a 53 74 61 72 74 41  straint, zStartA
26bd0 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
26be0 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
26bf0 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
26c00 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
26c10 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
26c20 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
26c30 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26c40 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
26c50 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
26c60 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
26c70 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
26c80 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
26c90 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
26ca0 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
26cb0 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
26cc0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
26cd0 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
26ce0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
26cf0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
26d00 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
26d10 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
26d20 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 0a 20 20 20  onstraint);..   
26d30 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61 6c   /* Load the val
26d40 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71 75  ue for the inequ
26d50 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
26d60 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
26d70 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65 20  he.    ** range 
26d80 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a 2f  (if any)..    */
26d90 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74  .    nConstraint
26da0 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20   = nEq;.    if( 
26db0 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20 20  pRangeEnd ){.   
26dc0 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
26dd0 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45 78  = pRangeEnd->pEx
26de0 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
26df0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
26e00 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c  heRemove(pParse,
26e10 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 31 29   regBase+nEq, 1)
26e20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26e30 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
26e40 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
26e50 6e 45 71 29 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq);.      if( 
26e60 28 70 52 61 6e 67 65 45 6e 64 2d 3e 77 74 46 6c  (pRangeEnd->wtFl
26e70 61 67 73 20 26 20 54 45 52 4d 5f 56 4e 55 4c 4c  ags & TERM_VNULL
26e80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
26e90 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 49  sqlite3ExprCodeI
26ea0 73 4e 75 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69  sNullJump(v, pRi
26eb0 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
26ec0 2c 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20  , addrNxt);.    
26ed0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 45    }.      if( zE
26ee0 6e 64 41 66 66 20 29 7b 0a 20 20 20 20 20 20 20  ndAff ){.       
26ef0 20 69 66 28 20 73 71 6c 69 74 65 33 43 6f 6d 70   if( sqlite3Comp
26f00 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
26f10 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d  ht, zEndAff[nEq]
26f20 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
26f30 4e 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  NE){.          /
26f40 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
26f50 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
26f60 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
26f70 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20  o conversions.  
26f80 20 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69          ** appli
26f90 65 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ed to the operan
26fa0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
26fb0 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
26fc0 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
26fd0 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
26fe0 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20  AFF_NONE.  */.  
26ff0 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
27000 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
27010 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
27020 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  }.        if( sq
27030 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e 6f  lite3ExprNeedsNo
27040 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28 70  AffinityChange(p
27050 52 69 67 68 74 2c 20 7a 45 6e 64 41 66 66 5b 6e  Right, zEndAff[n
27060 45 71 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Eq]) ){.        
27070 20 20 7a 45 6e 64 41 66 66 5b 6e 45 71 5d 20 3d    zEndAff[nEq] =
27080 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
27090 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
270a0 20 20 7d 20 20 0a 20 20 20 20 20 20 63 6f 64 65    }  .      code
270b0 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50  ApplyAffinity(pP
270c0 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e  arse, regBase, n
270d0 45 71 2b 31 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  Eq+1, zEndAff);.
270e0 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
270f0 74 2b 2b 3b 0a 20 20 20 20 20 20 74 65 73 74 63  t++;.      testc
27100 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 2d 3e  ase( pRangeEnd->
27110 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
27120 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a  IRTUAL ); /* EV:
27130 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20 2a   R-30575-11662 *
27140 2f 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  /.    }.    sqli
27150 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
27160 2d 3e 64 62 2c 20 7a 53 74 61 72 74 41 66 66 29  ->db, zStartAff)
27170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
27180 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
27190 7a 45 6e 64 41 66 66 29 3b 0a 0a 20 20 20 20 2f  zEndAff);..    /
271a0 2a 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  * Top of the loo
271b0 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c  p body */.    pL
271c0 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
271d0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
271e0 72 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(v);..    /* Ch
271f0 65 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78  eck if the index
27200 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20   cursor is past 
27210 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
27220 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20  ange. */.    op 
27230 3d 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65  = aEndOp[(pRange
27240 45 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31  End || nEq) * (1
27250 20 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74   + bRev)];.    t
27260 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
27270 4e 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74  Noop );.    test
27280 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78  case( op==OP_Idx
27290 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  GE );.    testca
272a0 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54  se( op==OP_IdxLT
272b0 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d   );.    if( op!=
272c0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
272d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
272e0 70 34 49 6e 74 28 76 2c 20 6f 70 2c 20 69 49 64  p4Int(v, op, iId
272f0 78 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 72  xCur, addrNxt, r
27300 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61  egBase, nConstra
27310 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
27320 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
27330 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f  v, endEq!=bRev ?
27340 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  1:0);.    }..   
27350 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
27360 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
27370 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74  traints, check t
27380 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20  hat the value.  
27390 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c    ** of the tabl
273a0 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68  e column that th
273b0 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
273c0 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55  trains is not NU
273d0 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74  LL..    ** If it
273e0 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65   is, jump to the
273f0 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20   next iteration 
27400 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20  of the loop..   
27410 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c   */.    r1 = sql
27420 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70  ite3GetTempReg(p
27430 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74  Parse);.    test
27440 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c  case( pLevel->pl
27450 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
27460 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a  RE_BTM_LIMIT );.
27470 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4c      testcase( pL
27480 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
27490 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
274a0 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20  IMIT );.    if( 
274b0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
274c0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
274d0 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
274e0 4f 50 5f 4c 49 4d 49 54 29 29 21 3d 30 20 29 7b  OP_LIMIT))!=0 ){
274f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
27500 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43  beAddOp3(v, OP_C
27510 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75 72 2c 20  olumn, iIdxCur, 
27520 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  nEq, r1);.      
27530 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
27540 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
27550 72 31 2c 20 61 64 64 72 43 6f 6e 74 29 3b 0a 20  r1, addrCont);. 
27560 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27570 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
27580 50 61 72 73 65 2c 20 72 31 29 3b 0a 0a 20 20 20  Parse, r1);..   
27590 20 2f 2a 20 53 65 65 6b 20 74 68 65 20 74 61 62   /* Seek the tab
275a0 6c 65 20 63 75 72 73 6f 72 2c 20 69 66 20 72 65  le cursor, if re
275b0 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 64 69  quired */.    di
275c0 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
275d0 2c 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a  , pRangeStart);.
275e0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
275f0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 45 6e  pLevel, pRangeEn
27600 64 29 3b 0a 20 20 20 20 69 66 28 20 21 6f 6d 69  d);.    if( !omi
27610 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
27620 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65 6c  iRowidReg = iRel
27630 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74 65  easeReg = sqlite
27640 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
27650 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
27660 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
27670 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
27680 78 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  xCur, iRowidReg)
27690 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
276a0 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70 50  xprCacheStore(pP
276b0 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20  arse, iCur, -1, 
276c0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
276d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
276e0 4f 70 32 28 76 2c 20 4f 50 5f 53 65 65 6b 2c 20  Op2(v, OP_Seek, 
276f0 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67 29  iCur, iRowidReg)
27700 3b 20 20 2f 2a 20 44 65 66 65 72 72 65 64 20 73  ;  /* Deferred s
27710 65 65 6b 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  eek */.    }..  
27720 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
27730 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64  instruction used
27740 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68   to terminate th
27750 65 20 6c 6f 6f 70 2e 20 44 69 73 61 62 6c 65 20  e loop. Disable 
27760 0a 20 20 20 20 2a 2a 20 57 48 45 52 45 20 63 6c  .    ** WHERE cl
27770 61 75 73 65 20 74 65 72 6d 73 20 6d 61 64 65 20  ause terms made 
27780 72 65 64 75 6e 64 61 6e 74 20 62 79 20 74 68 65  redundant by the
27790 20 69 6e 64 65 78 20 72 61 6e 67 65 20 73 63 61   index range sca
277a0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
277b0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
277c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  sFlags & WHERE_U
277d0 4e 49 51 55 45 20 29 7b 0a 20 20 20 20 20 20 70  NIQUE ){.      p
277e0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
277f0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
27800 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
27810 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
27820 5f 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65  _Prev;.    }else
27830 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
27840 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  op = OP_Next;.  
27850 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
27860 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20  p1 = iIdxCur;.  
27870 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
27880 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
27890 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  TIMIZATION.  if(
278a0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
278b0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55  Flags & WHERE_MU
278c0 4c 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a  LTI_OR ){.    /*
278d0 20 43 61 73 65 20 34 3a 20 20 54 77 6f 20 6f 72   Case 4:  Two or
278e0 20 6d 6f 72 65 20 73 65 70 61 72 61 74 65 6c 79   more separately
278f0 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
27900 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 0a 20  onnected by OR. 
27910 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61     **.    ** Exa
27920 6d 70 6c 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mple:.    **.   
27930 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
27940 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a  LE t1(a,b,c,d);.
27950 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
27960 49 4e 44 45 58 20 69 31 20 4f 4e 20 74 31 28 61  INDEX i1 ON t1(a
27970 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
27980 54 45 20 49 4e 44 45 58 20 69 32 20 4f 4e 20 74  TE INDEX i2 ON t
27990 31 28 62 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  1(b);.    **   C
279a0 52 45 41 54 45 20 49 4e 44 45 58 20 69 33 20 4f  REATE INDEX i3 O
279b0 4e 20 74 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a  N t1(c);.    **.
279c0 20 20 20 20 2a 2a 20 20 20 53 45 4c 45 43 54 20      **   SELECT 
279d0 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
279e0 61 3d 35 20 4f 52 20 62 3d 37 20 4f 52 20 28 63  a=5 OR b=7 OR (c
279f0 3d 31 31 20 41 4e 44 20 64 3d 31 33 29 0a 20 20  =11 AND d=13).  
27a00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74    **.    ** In t
27a10 68 65 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 72  he example, ther
27a20 65 20 61 72 65 20 74 68 72 65 65 20 69 6e 64 65  e are three inde
27a30 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63  xed terms connec
27a40 74 65 64 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a  ted by OR..    *
27a50 2a 20 54 68 65 20 74 6f 70 20 6f 66 20 74 68 65  * The top of the
27a60 20 6c 6f 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65   loop looks like
27a70 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
27a80 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75    **          Nu
27a90 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20 20  ll       1      
27aa0 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f            # Zero
27ab0 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72   the rowset in r
27ac0 65 67 20 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20  eg 1.    **.    
27ad0 2a 2a 20 54 68 65 6e 2c 20 66 6f 72 20 65 61 63  ** Then, for eac
27ae0 68 20 69 6e 64 65 78 65 64 20 74 65 72 6d 2c 20  h indexed term, 
27af0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54  the following. T
27b00 68 65 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a  he arguments to.
27b10 20 20 20 20 2a 2a 20 52 6f 77 53 65 74 54 65 73      ** RowSetTes
27b20 74 20 61 72 65 20 73 75 63 68 20 74 68 61 74 20  t are such that 
27b30 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65  the rowid of the
27b40 20 63 75 72 72 65 6e 74 20 72 6f 77 20 69 73 20   current row is 
27b50 69 6e 73 65 72 74 65 64 0a 20 20 20 20 2a 2a 20  inserted.    ** 
27b60 69 6e 74 6f 20 74 68 65 20 52 6f 77 53 65 74 2e  into the RowSet.
27b70 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   If it is alread
27b80 79 20 70 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72  y present, contr
27b90 6f 6c 20 73 6b 69 70 73 20 74 68 65 0a 20 20 20  ol skips the.   
27ba0 20 2a 2a 20 47 6f 73 75 62 20 6f 70 63 6f 64 65   ** Gosub opcode
27bb0 20 61 6e 64 20 6a 75 6d 70 73 20 73 74 72 61 69   and jumps strai
27bc0 67 68 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20  ght to the code 
27bd0 67 65 6e 65 72 61 74 65 64 20 62 79 20 57 68 65  generated by Whe
27be0 72 65 45 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a  reEnd()..    **.
27bf0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71      **        sq
27c00 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
27c10 3c 74 65 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20  <term>).    **  
27c20 20 20 20 20 20 20 20 20 52 6f 77 53 65 74 54 65          RowSetTe
27c30 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
27c40 20 20 20 20 23 20 49 6e 73 65 72 74 20 72 6f 77      # Insert row
27c50 69 64 20 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20  id into rowset. 
27c60 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
27c70 6f 73 75 62 20 20 20 20 20 20 32 20 41 0a 20 20  osub      2 A.  
27c80 20 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69    **        sqli
27c90 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a 20 20  te3WhereEnd().  
27ca0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c    **.    ** Foll
27cb0 6f 77 69 6e 67 20 74 68 65 20 61 62 6f 76 65 2c  owing the above,
27cc0 20 63 6f 64 65 20 74 6f 20 74 65 72 6d 69 6e 61   code to termina
27cd0 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62  te the loop. Lab
27ce0 65 6c 20 41 2c 20 74 68 65 20 74 61 72 67 65 74  el A, the target
27cf0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 47  .    ** of the G
27d00 6f 73 75 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70  osub above, jump
27d10 73 20 74 6f 20 74 68 65 20 69 6e 73 74 72 75 63  s to the instruc
27d20 74 69 6f 6e 20 72 69 67 68 74 20 61 66 74 65 72  tion right after
27d30 20 74 68 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a   the Goto..    *
27d40 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  *.    **        
27d50 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20 20    Null       1  
27d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
27d70 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74 20  Zero the rowset 
27d80 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a 20  in reg 1.    ** 
27d90 20 20 20 20 20 20 20 20 20 47 6f 74 6f 20 20 20           Goto   
27da0 20 20 20 20 42 20 20 20 20 20 20 20 20 20 20 20      B           
27db0 20 20 20 20 20 23 20 54 68 65 20 6c 6f 6f 70 20       # The loop 
27dc0 69 73 20 66 69 6e 69 73 68 65 64 2e 0a 20 20 20  is finished..   
27dd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27de0 20 41 3a 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20   A: <loop body> 
27df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e00 23 20 52 65 74 75 72 6e 20 64 61 74 61 2c 20 77  # Return data, w
27e10 68 61 74 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a  hatever..    **.
27e20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
27e30 52 65 74 75 72 6e 20 20 20 20 20 32 20 20 20 20  Return     2    
27e40 20 20 20 20 20 20 20 20 20 20 20 20 23 20 4a 75              # Ju
27e50 6d 70 20 62 61 63 6b 20 74 6f 20 74 68 65 20 47  mp back to the G
27e60 6f 73 75 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20  osub.    **.    
27e70 2a 2a 20 20 20 20 20 20 20 42 3a 20 3c 61 66 74  **       B: <aft
27e80 65 72 20 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20  er the loop>.   
27e90 20 2a 2a 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57   **.    */.    W
27ea0 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
27eb0 63 3b 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d  c;    /* The OR-
27ec0 63 6c 61 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75  clause broken ou
27ed0 74 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  t into subterms 
27ee0 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  */.    SrcList *
27ef0 70 4f 72 54 61 62 3b 20 20 20 20 20 20 20 2f 2a  pOrTab;       /*
27f00 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65   Shortened table
27f10 20 6c 69 73 74 20 6f 72 20 4f 52 2d 63 6c 61 75   list or OR-clau
27f20 73 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f  se generation */
27f30 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52 65 74  ..    int regRet
27f40 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  urn = ++pParse->
27f50 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
27f60 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73 65 64  /* Register used
27f70 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62 20 2a   with OP_Gosub *
27f80 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77  /.    int regRow
27f90 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  set = 0;        
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fb0 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
27fc0 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20 2a 2f  RowSet object */
27fd0 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f 77 69  .    int regRowi
27fe0 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  d = 0;          
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28000 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69  * Register holdi
28010 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20 20  ng rowid */.    
28020 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20 3d 20  int iLoopBody = 
28030 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
28040 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53 74 61  abel(v);  /* Sta
28050 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64 79 20  rt of loop body 
28060 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 74 49  */.    int iRetI
28070 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
280a0 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20 2a 2f  egReturn init */
280b0 0a 20 20 20 20 69 6e 74 20 75 6e 74 65 73 74 65  .    int unteste
280c0 64 54 65 72 6d 73 20 3d 20 30 3b 20 20 20 20 20  dTerms = 0;     
280d0 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 6d 65 20          /* Some 
280e0 74 65 72 6d 73 20 6e 6f 74 20 63 6f 6d 70 6c 65  terms not comple
280f0 74 65 6c 79 20 74 65 73 74 65 64 20 2a 2f 0a 20  tely tested */. 
28100 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 0a 20     int ii;.   . 
28110 20 20 20 70 54 65 72 6d 20 3d 20 70 4c 65 76 65     pTerm = pLeve
28120 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b  l->plan.u.pTerm;
28130 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
28140 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  rm!=0 );.    ass
28150 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
28160 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a  rator==WO_OR );.
28170 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
28180 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
28190 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d 30 20 29 3b  RM_ORINFO)!=0 );
281a0 0a 20 20 20 20 70 4f 72 57 63 20 3d 20 26 70 54  .    pOrWc = &pT
281b0 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e  erm->u.pOrInfo->
281c0 77 63 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  wc;.    pLevel->
281d0 6f 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a  op = OP_Return;.
281e0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
281f0 20 72 65 67 52 65 74 75 72 6e 3b 0a 0a 20 20 20   regReturn;..   
28200 20 2f 2a 20 53 65 74 20 75 70 20 61 20 6e 65 77   /* Set up a new
28210 20 53 72 63 4c 69 73 74 20 6e 69 20 70 4f 72 54   SrcList ni pOrT
28220 61 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ab containing th
28230 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
28240 61 6e 6e 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  anned.    ** by 
28250 74 68 69 73 20 6c 6f 6f 70 20 69 6e 20 74 68 65  this loop in the
28260 20 61 5b 30 5d 20 73 6c 6f 74 20 61 6e 64 20 61   a[0] slot and a
28270 6c 6c 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  ll notReady tabl
28280 65 73 20 69 6e 20 61 5b 31 2e 2e 5d 20 73 6c 6f  es in a[1..] slo
28290 74 73 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ts..    ** This 
282a0 62 65 63 6f 6d 65 73 20 74 68 65 20 53 72 63 4c  becomes the SrcL
282b0 69 73 74 20 69 6e 20 74 68 65 20 72 65 63 75 72  ist in the recur
282c0 73 69 76 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c  sive call to sql
282d0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
282e0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
282f0 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3e   pWInfo->nLevel>
28300 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  1 ){.      int n
28310 4e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20 20  NotReady;       
28320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28330 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 74 52 65   number of notRe
28340 61 64 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ady tables */.  
28350 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
28360 73 74 5f 69 74 65 6d 20 2a 6f 72 69 67 53 72 63  st_item *origSrc
28370 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
28380 6c 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  l list of tables
28390 20 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 52 65   */.      nNotRe
283a0 61 64 79 20 3d 20 70 57 49 6e 66 6f 2d 3e 6e 4c  ady = pWInfo->nL
283b0 65 76 65 6c 20 2d 20 69 4c 65 76 65 6c 20 2d 20  evel - iLevel - 
283c0 31 3b 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20  1;.      pOrTab 
283d0 3d 20 73 71 6c 69 74 65 33 53 74 61 63 6b 41 6c  = sqlite3StackAl
283e0 6c 6f 63 52 61 77 28 70 50 61 72 73 65 2d 3e 64  locRaw(pParse->d
283f0 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
28410 69 7a 65 6f 66 28 2a 70 4f 72 54 61 62 29 2b 20  izeof(*pOrTab)+ 
28420 6e 4e 6f 74 52 65 61 64 79 2a 73 69 7a 65 6f 66  nNotReady*sizeof
28430 28 70 4f 72 54 61 62 2d 3e 61 5b 30 5d 29 29 3b  (pOrTab->a[0]));
28440 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 61  .      if( pOrTa
28450 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 6e 6f  b==0 ) return no
28460 74 52 65 61 64 79 3b 0a 20 20 20 20 20 20 70 4f  tReady;.      pO
28470 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 28  rTab->nAlloc = (
28480 69 31 36 29 28 6e 4e 6f 74 52 65 61 64 79 20 2b  i16)(nNotReady +
28490 20 31 29 3b 0a 20 20 20 20 20 20 70 4f 72 54 61   1);.      pOrTa
284a0 62 2d 3e 6e 53 72 63 20 3d 20 70 4f 72 54 61 62  b->nSrc = pOrTab
284b0 2d 3e 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 20 20  ->nAlloc;.      
284c0 6d 65 6d 63 70 79 28 70 4f 72 54 61 62 2d 3e 61  memcpy(pOrTab->a
284d0 2c 20 70 54 61 62 49 74 65 6d 2c 20 73 69 7a 65  , pTabItem, size
284e0 6f 66 28 2a 70 54 61 62 49 74 65 6d 29 29 3b 0a  of(*pTabItem));.
284f0 20 20 20 20 20 20 6f 72 69 67 53 72 63 20 3d 20        origSrc = 
28500 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
28510 2d 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ->a;.      for(k
28520 3d 31 3b 20 6b 3c 3d 6e 4e 6f 74 52 65 61 64 79  =1; k<=nNotReady
28530 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
28540 6d 65 6d 63 70 79 28 26 70 4f 72 54 61 62 2d 3e  memcpy(&pOrTab->
28550 61 5b 6b 5d 2c 20 26 6f 72 69 67 53 72 63 5b 70  a[k], &origSrc[p
28560 4c 65 76 65 6c 5b 6b 5d 2e 69 46 72 6f 6d 5d 2c  Level[k].iFrom],
28570 20 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e   sizeof(pOrTab->
28580 61 5b 6b 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a  a[k]));.      }.
28590 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
285a0 20 70 4f 72 54 61 62 20 3d 20 70 57 49 6e 66 6f   pOrTab = pWInfo
285b0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20 20 20 20  ->pTabList;.    
285c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  }..    /* Initia
285d0 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20  lize the rowset 
285e0 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74  register to cont
285f0 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c  ain NULL. An SQL
28600 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a   NULL is .    **
28610 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61   equivalent to a
28620 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a  n empty rowset..
28630 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c      **.    ** Al
28640 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65  so initialize re
28650 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61  gReturn to conta
28660 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  in the address o
28670 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  f the instructio
28680 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  n .    ** immedi
28690 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
286a0 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74  the OP_Return at
286b0 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74   the bottom of t
286c0 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20  he loop. This.  
286d0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
286e0 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72   in a few obscur
286f0 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65  e LEFT JOIN case
28700 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20  s where control 
28710 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65  jumps.    ** ove
28720 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  r the top of the
28730 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62   loop into the b
28740 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68  ody of it. In th
28750 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20 20  is case the .   
28760 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70   ** correct resp
28770 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64  onse for the end
28780 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74  -of-loop code (t
28790 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73  he OP_Return) is
287a0 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c   to .    ** fall
287b0 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20   through to the 
287c0 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
287d0 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f  , just as an OP_
287e0 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20  Next does if.   
287f0 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   ** called on an
28800 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63   uninitialized c
28810 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  ursor..    */.  
28820 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
28830 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43  s & WHERE_DUPLIC
28840 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20  ATES_OK)==0 ){. 
28850 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d       regRowset =
28860 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
28870 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64 20  .      regRowid 
28880 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
28890 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
288a0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
288b0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
288c0 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  et);.    }.    i
288d0 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65  RetInit = sqlite
288e0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
288f0 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65  P_Integer, 0, re
28900 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66  gReturn);..    f
28910 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57  or(ii=0; ii<pOrW
28920 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b  c->nTerm; ii++){
28930 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  .      WhereTerm
28940 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72   *pOrTerm = &pOr
28950 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20  Wc->a[ii];.     
28960 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65   if( pOrTerm->le
28970 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c  ftCursor==iCur |
28980 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  | pOrTerm->eOper
28990 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a  ator==WO_AND ){.
289a0 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e 66          WhereInf
289b0 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20  o *pSubWInfo;   
289c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66         /* Info f
289d0 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72  or single OR-ter
289e0 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20  m scan */.      
289f0 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
28a00 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20  h table entries 
28a10 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20  that match term 
28a20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  pOrTerm. */.    
28a30 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20      pSubWInfo = 
28a40 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
28a50 6e 28 70 50 61 72 73 65 2c 20 70 4f 72 54 61 62  n(pParse, pOrTab
28a60 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72  , pOrTerm->pExpr
28a70 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 57 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20  WHERE_OMIT_OPEN 
28aa0 7c 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f  | WHERE_OMIT_CLO
28ab0 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
28ad0 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 20 7c  RE_FORCE_TABLE |
28ae0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
28af0 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20 69  ONLY);.        i
28b00 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a  f( pSubWInfo ){.
28b10 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
28b20 6e 4f 6e 65 53 63 61 6e 28 0a 20 20 20 20 20 20  nOneScan(.      
28b30 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2c 20          pParse, 
28b40 70 4f 72 54 61 62 2c 20 26 70 53 75 62 57 49 6e  pOrTab, &pSubWIn
28b50 66 6f 2d 3e 61 5b 30 5d 2c 20 69 4c 65 76 65 6c  fo->a[0], iLevel
28b60 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
28b70 20 30 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a   0.          );.
28b80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 77            if( (w
28b90 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
28ba0 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29  E_DUPLICATES_OK)
28bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
28bc0 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28     int iSet = ((
28bd0 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ii==pOrWc->nTerm
28be0 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20  -1)?-1:ii);.    
28bf0 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20          int r;. 
28c00 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20 73             r = s
28c10 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65  qlite3ExprCodeGe
28c20 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20  tColumn(pParse, 
28c30 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20  pTabItem->pTab, 
28c40 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20  -1, iCur, .     
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c70 20 20 20 20 72 65 67 52 6f 77 69 64 29 3b 0a 20      regRowid);. 
28c80 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
28c90 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
28ca0 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74  v, OP_RowSetTest
28cb0 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20  , regRowset,.   
28cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
28ce0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
28cf0 41 64 64 72 28 76 29 2b 32 2c 20 72 2c 20 69 53  Addr(v)+2, r, iS
28d00 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  et);.          }
28d10 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
28d20 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28d30 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65 74  OP_Gosub, regRet
28d40 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b  urn, iLoopBody);
28d50 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ..          /* T
28d60 68 65 20 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e  he pSubWInfo->un
28d70 74 65 73 74 65 64 54 65 72 6d 73 20 66 6c 61 67  testedTerms flag
28d80 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 69 73   means that this
28d90 20 4f 52 20 74 65 72 6d 0a 20 20 20 20 20 20 20   OR term.       
28da0 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 65 64 20     ** contained 
28db0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 41 4e 44 20  one or more AND 
28dc0 74 65 72 6d 20 66 72 6f 6d 20 61 20 6e 6f 74 52  term from a notR
28dd0 65 61 64 79 20 74 61 62 6c 65 2e 20 20 54 68 65  eady table.  The
28de0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 65  .          ** te
28df0 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 6e 6f 74  rms from the not
28e00 52 65 61 64 79 20 74 61 62 6c 65 20 63 6f 75 6c  Ready table coul
28e10 64 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  d not be tested 
28e20 61 6e 64 20 77 69 6c 6c 0a 20 20 20 20 20 20 20  and will.       
28e30 20 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 62 65     ** need to be
28e40 20 74 65 73 74 65 64 20 6c 61 74 65 72 2e 0a 20   tested later.. 
28e50 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
28e60 20 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49        if( pSubWI
28e70 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72  nfo->untestedTer
28e80 6d 73 20 29 20 75 6e 74 65 73 74 65 64 54 65 72  ms ) untestedTer
28e90 6d 73 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20  ms = 1;..       
28ea0 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65     /* Finish the
28eb0 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61   loop through ta
28ec0 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74  ble entries that
28ed0 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54   match term pOrT
28ee0 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  erm. */.        
28ef0 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
28f00 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20  d(pSubWInfo);.  
28f10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28f20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
28f30 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c  3VdbeChangeP1(v,
28f40 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74   iRetInit, sqlit
28f50 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
28f60 72 28 76 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  r(v));.    sqlit
28f70 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
28f80 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76  OP_Goto, 0, pLev
28f90 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
28fa0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
28fb0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c 6f  olveLabel(v, iLo
28fc0 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 69 66  opBody);..    if
28fd0 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  ( pWInfo->nLevel
28fe0 3e 31 20 29 20 73 71 6c 69 74 65 33 53 74 61 63  >1 ) sqlite3Stac
28ff0 6b 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  kFree(pParse->db
29000 2c 20 70 4f 72 54 61 62 29 3b 0a 20 20 20 20 69  , pOrTab);.    i
29010 66 28 20 21 75 6e 74 65 73 74 65 64 54 65 72 6d  f( !untestedTerm
29020 73 20 29 20 64 69 73 61 62 6c 65 54 65 72 6d 28  s ) disableTerm(
29030 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a  pLevel, pTerm);.
29040 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
29050 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52  * SQLITE_OMIT_OR
29060 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
29070 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20 43 61 73  ..  {.    /* Cas
29080 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20 6e  e 5:  There is n
29090 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e 20  o usable index. 
290a0 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63 6f   We must do a co
290b0 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a 20 20 20  mplete.    **   
290c0 20 20 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74         scan of t
290d0 68 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e  he entire table.
290e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
290f0 69 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 65  ic const u8 aSte
29100 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65 78 74 2c  p[] = { OP_Next,
29110 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20 20 20 20   OP_Prev };.    
29120 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
29130 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20 4f 50 5f  aStart[] = { OP_
29140 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61 73 74 20  Rewind, OP_Last 
29150 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 62  };.    assert( b
29160 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65 76 3d 3d  Rev==0 || bRev==
29170 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
29180 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b   omitTable==0 );
29190 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
291a0 3d 20 61 53 74 65 70 5b 62 52 65 76 5d 3b 0a 20  = aStep[bRev];. 
291b0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
291c0 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
291d0 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
291e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
291f0 61 53 74 61 72 74 5b 62 52 65 76 5d 2c 20 69 43  aStart[bRev], iC
29200 75 72 2c 20 61 64 64 72 42 72 6b 29 3b 0a 20 20  ur, addrBrk);.  
29210 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
29220 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
29230 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
29240 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64 79 20 26    }.  notReady &
29250 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e  = ~getMask(pWC->
29260 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b  pMaskSet, iCur);
29270 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f  ..  /* Insert co
29280 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72 79  de to test every
29290 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 74   subexpression t
292a0 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c  hat can be compl
292b0 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f 6d 70 75  etely.  ** compu
292c0 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75  ted using the cu
292d0 72 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62  rrent set of tab
292e0 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  les..  **.  ** I
292f0 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
29300 3a 20 52 2d 34 39 35 32 35 2d 35 30 39 33 35 20  : R-49525-50935 
29310 54 65 72 6d 73 20 74 68 61 74 20 63 61 6e 6e 6f  Terms that canno
29320 74 20 62 65 20 73 61 74 69 73 66 69 65 64 20 74  t be satisfied t
29330 68 72 6f 75 67 68 0a 20 20 2a 2a 20 74 68 65 20  hrough.  ** the 
29340 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 20 62  use of indices b
29350 65 63 6f 6d 65 20 74 65 73 74 73 20 74 68 61 74  ecome tests that
29360 20 61 72 65 20 65 76 61 6c 75 61 74 65 64 20 61   are evaluated a
29370 67 61 69 6e 73 74 20 65 61 63 68 20 72 6f 77 20  gainst each row 
29380 6f 66 0a 20 20 2a 2a 20 74 68 65 20 72 65 6c 65  of.  ** the rele
29390 76 61 6e 74 20 69 6e 70 75 74 20 74 61 62 6c 65  vant input table
293a0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 54  s..  */.  for(pT
293b0 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57  erm=pWC->a, j=pW
293c0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a  C->nTerm; j>0; j
293d0 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  --, pTerm++){.  
293e0 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20    Expr *pE;.    
293f0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
29400 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
29410 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 49 4d  VIRTUAL ); /* IM
29420 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
29430 20 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65   */.    testcase
29440 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
29450 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
29460 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
29470 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
29480 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
29490 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
294a0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
294b0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
294c0 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
294d0 20 20 74 65 73 74 63 61 73 65 28 20 70 57 49 6e    testcase( pWIn
294e0 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
294f0 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  s==0.           
29500 20 20 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e      && (pWInfo->
29510 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
29520 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59  RE_ONETABLE_ONLY
29530 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57  )!=0 );.      pW
29540 49 6e 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65  Info->untestedTe
29550 72 6d 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 63  rms = 1;.      c
29560 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
29570 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
29580 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
29590 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
295a0 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
295b0 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
295c0 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
295d0 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
295e0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
295f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
29600 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
29610 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
29620 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
29630 4c 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77  L);.    pTerm->w
29640 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
29650 4f 44 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ODED;.  }..  /* 
29660 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52  For a LEFT OUTER
29670 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20   JOIN, generate 
29680 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72  code that will r
29690 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74  ecord the fact t
296a0 68 61 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73  hat.  ** at leas
296b0 74 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65  t one row of the
296c0 20 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73   right table has
296d0 20 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66   matched the lef
296e0 74 20 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a  t table.  .  */.
296f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
29700 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70  eftJoin ){.    p
29710 4c 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74  Level->addrFirst
29720 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
29730 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
29740 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
29750 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
29760 72 2c 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 1, pLevel->iL
29770 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
29780 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72  beComment((v, "r
29790 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
297a0 68 69 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69  hit"));.    sqli
297b0 74 65 33 45 78 70 72 43 61 63 68 65 43 6c 65 61  te3ExprCacheClea
297c0 72 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66  r(pParse);.    f
297d0 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c  or(pTerm=pWC->a,
297e0 20 6a 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65   j=0; j<pWC->nTe
297f0 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; j++, pTerm++
29800 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
29810 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
29820 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
29830 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33   );  /* IMP: R-3
29840 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20  0575-11662 */.  
29850 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
29860 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
29870 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20  ERM_CODED );.   
29880 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74     if( pTerm->wt
29890 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  Flags & (TERM_VI
298a0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
298b0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
298c0 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
298d0 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
298e0 65 61 64 79 29 21 3d 30 20 29 7b 0a 20 20 20 20  eady)!=0 ){.    
298f0 20 20 20 20 61 73 73 65 72 74 28 20 70 57 49 6e      assert( pWIn
29900 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
29910 73 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  s );.        con
29920 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
29930 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
29940 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20  rm->pExpr );.   
29950 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
29960 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54  False(pParse, pT
29970 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64 64 72  erm->pExpr, addr
29980 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
29990 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20  PIFNULL);.      
299a0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
299b0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
299c0 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
299d0 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
299e0 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61 73 65  pParse, iRelease
299f0 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Reg);..  return 
29a00 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23 69 66  notReady;.}..#if
29a10 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
29a20 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TEST)./*.** The 
29a30 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
29a40 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20  le holds a text 
29a50 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71  description of q
29a60 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61  uery plan genera
29a70 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f  ted.** by the mo
29a80 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74  st recent call t
29a90 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  o sqlite3WhereBe
29aa0 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c  gin().  Each cal
29ab0 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a  l to WhereBegin.
29ac0 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
29ad0 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69  e previous.  Thi
29ae0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
29af0 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
29b00 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69  g and.** analysi
29b10 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20  s only..*/.char 
29b20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
29b30 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f  an[BMS*2*40];  /
29b40 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f  * Text of the jo
29b50 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  in */.static int
29b60 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20   nQPlan = 0;    
29b70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
29b80 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f  t free slow in _
29b90 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a  query_plan[] */.
29ba0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
29bb0 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  E_TEST */.../*.*
29bc0 2a 20 46 72 65 65 20 61 20 57 68 65 72 65 49 6e  * Free a WhereIn
29bd0 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a  fo structure.*/.
29be0 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
29bf0 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69 74 65  eInfoFree(sqlite
29c00 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e 66 6f  3 *db, WhereInfo
29c10 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66 28   *pWInfo){.  if(
29c20 20 41 4c 57 41 59 53 28 70 57 49 6e 66 6f 29 20   ALWAYS(pWInfo) 
29c30 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
29c40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49    for(i=0; i<pWI
29c50 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b  nfo->nLevel; i++
29c60 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29c70 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e  _index_info *pIn
29c80 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  fo = pWInfo->a[i
29c90 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
29ca0 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20    if( pInfo ){. 
29cb0 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74         /* assert
29cc0 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
29cd0 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20  reeIdxStr==0 || 
29ce0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
29cf0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69   ); */.        i
29d00 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f  f( pInfo->needTo
29d10 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20  FreeIdxStr ){.  
29d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
29d30 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53  free(pInfo->idxS
29d40 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  tr);.        }. 
29d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
29d60 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b  Free(db, pInfo);
29d70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
29d80 66 28 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e  f( pWInfo->a[i].
29d90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
29da0 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 20  HERE_TEMP_INDEX 
29db0 29 7b 0a 20 20 20 20 20 20 20 20 49 6e 64 65 78  ){.        Index
29dc0 20 2a 70 49 64 78 20 3d 20 70 57 49 6e 66 6f 2d   *pIdx = pWInfo-
29dd0 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 75 2e 70 49 64  >a[i].plan.u.pId
29de0 78 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  x;.        if( p
29df0 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Idx ){.         
29e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
29e10 62 2c 20 70 49 64 78 2d 3e 7a 43 6f 6c 41 66 66  b, pIdx->zColAff
29e20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
29e30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
29e40 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Idx);.        }.
29e50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
29e60 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
29e70 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b  ar(pWInfo->pWC);
29e80 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
29e90 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
29ea0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
29eb0 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
29ec0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
29ed0 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
29ee0 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
29ef0 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
29f00 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
29f10 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
29f20 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
29f30 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
29f40 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
29f50 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
29f60 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
29f70 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
29f80 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
29f90 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
29fa0 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
29fb0 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
29fc0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
29fd0 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
29fe0 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
29ff0 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
2a000 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
2a010 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
2a020 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2a030 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
2a040 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
2a050 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
2a060 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
2a070 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
2a080 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2a090 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
2a0a0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
2a0b0 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
2a0c0 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
2a0d0 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
2a0e0 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
2a0f0 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2a100 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
2a110 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
2a120 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
2a130 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
2a140 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
2a150 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
2a160 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
2a170 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
2a180 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
2a190 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
2a1a0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
2a1b0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
2a1c0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2a1d0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2a1e0 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2a1f0 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
2a200 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2a210 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
2a220 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
2a230 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
2a240 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
2a250 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a270 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
2a280 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
2a290 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
2a2b0 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
2a2c0 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
2a2d0 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
2a2e0 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
2a2f0 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
2a300 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
2a310 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
2a320 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
2a330 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
2a340 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2a350 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
2a360 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
2a370 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
2a380 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
2a390 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
2a3a0 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
2a3b0 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
2a3c0 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
2a3d0 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
2a3e0 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
2a3f0 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
2a400 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
2a410 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
2a420 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
2a430 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
2a440 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
2a450 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
2a460 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
2a470 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
2a480 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
2a490 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
2a4a0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
2a4b0 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
2a4c0 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
2a4d0 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
2a4e0 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
2a4f0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
2a500 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
2a510 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
2a520 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
2a530 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
2a540 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
2a550 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
2a560 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
2a570 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
2a580 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
2a590 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
2a5a0 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
2a5b0 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
2a5c0 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
2a5d0 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
2a5e0 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
2a5f0 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
2a600 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
2a610 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
2a620 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
2a630 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
2a640 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
2a650 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
2a660 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
2a670 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
2a680 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
2a690 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
2a6a0 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
2a6b0 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
2a6c0 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
2a6d0 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
2a6e0 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
2a6f0 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
2a700 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
2a710 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
2a720 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
2a730 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
2a740 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
2a750 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
2a760 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
2a770 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
2a780 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
2a790 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
2a7a0 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
2a7b0 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
2a7c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
2a7d0 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
2a7e0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
2a7f0 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
2a800 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
2a810 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
2a820 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
2a830 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
2a840 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
2a850 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
2a860 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
2a870 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
2a880 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
2a890 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
2a8a0 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
2a8b0 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
2a8c0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
2a8d0 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
2a8e0 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
2a8f0 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
2a900 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
2a910 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
2a920 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
2a930 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
2a940 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
2a950 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
2a960 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
2a970 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
2a980 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
2a990 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
2a9a0 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
2a9b0 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
2a9c0 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
2a9d0 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
2a9e0 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
2a9f0 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
2aa00 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
2aa10 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
2aa20 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
2aa30 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
2aa40 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
2aa50 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
2aa60 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
2aa70 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
2aa80 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
2aa90 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
2aaa0 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
2aab0 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
2aac0 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
2aad0 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
2aae0 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
2aaf0 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
2ab00 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
2ab10 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
2ab20 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
2ab30 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
2ab40 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
2ab50 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
2ab60 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
2ab70 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
2ab80 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
2ab90 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
2aba0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
2abb0 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
2abc0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
2abd0 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
2abe0 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
2abf0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
2ac00 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
2ac10 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
2ac20 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
2ac30 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
2ac40 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
2ac50 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
2ac60 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
2ac70 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
2ac80 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
2ac90 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
2aca0 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
2acb0 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
2acc0 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
2acd0 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
2ace0 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
2acf0 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
2ad00 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
2ad10 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
2ad20 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
2ad30 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
2ad40 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
2ad50 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
2ad60 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
2ad70 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
2ad80 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
2ad90 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
2ada0 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
2adb0 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
2adc0 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
2add0 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
2ade0 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
2adf0 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
2ae00 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
2ae10 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
2ae20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
2ae30 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
2ae40 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
2ae50 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
2ae60 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
2ae70 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
2ae80 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20  **ppOrderBy, /* 
2ae90 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
2aea0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
2aeb0 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74   ExprList *pDist
2aec0 69 6e 63 74 2c 20 20 2f 2a 20 54 68 65 20 73 65  inct,  /* The se
2aed0 6c 65 63 74 2d 6c 69 73 74 20 66 6f 72 20 44 49  lect-list for DI
2aee0 53 54 49 4e 43 54 20 71 75 65 72 69 65 73 20 2d  STINCT queries -
2aef0 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31   or NULL */.  u1
2af00 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
2af10 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
2af20 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20  e WHERE_* flags 
2af30 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74  defined in sqlit
2af40 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69  eInt.h */.){.  i
2af50 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
2af60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
2af70 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
2af80 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20  nt nByteWInfo;  
2af90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2afa0 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65  . bytes allocate
2afb0 64 20 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20  d for WhereInfo 
2afc0 73 74 72 75 63 74 20 2a 2f 0a 20 20 69 6e 74 20  struct */.  int 
2afd0 6e 54 61 62 4c 69 73 74 3b 20 20 20 20 20 20 20  nTabList;       
2afe0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2aff0 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20   of elements in 
2b000 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
2b010 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
2b020 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
2b030 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
2b040 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
2b050 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
2b060 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
2b070 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
2b080 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
2b090 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42 69  e engine */.  Bi
2b0a0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
2b0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
2b0c0 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
2b0d0 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
2b0e0 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
2b0f0 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20 20  t *pMaskSet;    
2b100 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
2b110 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
2b120 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
2b130 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b140 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e  /* Decomposition
2b150 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2b160 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  ause */.  struct
2b170 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
2b180 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
2b190 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
2b1a0 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
2b1b0 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
2b1c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
2b1d0 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
2b1e0 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
2b1f0 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72  ist */.  int iFr
2b200 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  om;             
2b210 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2b220 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c  t unused FROM cl
2b230 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  ause element */.
2b240 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20    int andFlags; 
2b250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b260 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69  AND-ed combinati
2b270 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e 61  on of all pWC->a
2b280 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20 20  [].wtFlags */.  
2b290 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2b2a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2b2b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2b2c0 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  n */..  /* The n
2b2d0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
2b2e0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
2b2f0 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
2b300 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
2b310 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
2b320 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 74 65  tmask .  */.  te
2b330 73 74 63 61 73 65 28 20 70 54 61 62 4c 69 73 74  stcase( pTabList
2b340 2d 3e 6e 53 72 63 3d 3d 42 4d 53 20 29 3b 0a 20  ->nSrc==BMS );. 
2b350 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e   if( pTabList->n
2b360 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73  Src>BMS ){.    s
2b370 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
2b380 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20  Parse, "at most 
2b390 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a  %d tables in a j
2b3a0 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20  oin", BMS);.    
2b3b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
2b3c0 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
2b3d0 6e 20 6e 6f 72 6d 61 6c 6c 79 20 67 65 6e 65 72  n normally gener
2b3e0 61 74 65 73 20 61 20 6e 65 73 74 65 64 20 6c 6f  ates a nested lo
2b3f0 6f 70 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  op for all table
2b400 73 20 69 6e 20 0a 20 20 2a 2a 20 70 54 61 62 4c  s in .  ** pTabL
2b410 69 73 74 2e 20 20 42 75 74 20 69 66 20 74 68 65  ist.  But if the
2b420 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2b430 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2b440 2c 20 74 68 65 6e 20 77 65 20 73 68 6f 75 6c 64  , then we should
2b450 0a 20 20 2a 2a 20 6f 6e 6c 79 20 67 65 6e 65 72  .  ** only gener
2b460 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  ate code for the
2b470 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 6e 20   first table in 
2b480 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 73 73  pTabList and ass
2b490 75 6d 65 20 74 68 61 74 0a 20 20 2a 2a 20 61 6e  ume that.  ** an
2b4a0 79 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  y cursors associ
2b4b0 61 74 65 64 20 77 69 74 68 20 73 75 62 73 65 71  ated with subseq
2b4c0 75 65 6e 74 20 74 61 62 6c 65 73 20 61 72 65 20  uent tables are 
2b4d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
2b4e0 20 2a 2f 0a 20 20 6e 54 61 62 4c 69 73 74 20 3d   */.  nTabList =
2b4f0 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
2b500 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e  HERE_ONETABLE_ON
2b510 4c 59 29 20 3f 20 31 20 3a 20 70 54 61 62 4c 69  LY) ? 1 : pTabLi
2b520 73 74 2d 3e 6e 53 72 63 3b 0a 0a 20 20 2f 2a 20  st->nSrc;..  /* 
2b530 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69  Allocate and ini
2b540 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72  tialize the Wher
2b550 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
2b560 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65  that will become
2b570 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e   the.  ** return
2b580 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65   value. A single
2b590 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75   allocation is u
2b5a0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
2b5b0 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20   WhereInfo.  ** 
2b5c0 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f 6e 74  struct, the cont
2b5d0 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49 6e 66  ents of WhereInf
2b5e0 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65 72 65  o.a[], the Where
2b5f0 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2b600 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  .  ** and the Wh
2b610 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72 75 63  ereMaskSet struc
2b620 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68 65 72  ture. Since Wher
2b630 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 73  eClause contains
2b640 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20   an 8-byte.  ** 
2b650 66 69 65 6c 64 20 28 74 79 70 65 20 42 69 74 6d  field (type Bitm
2b660 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62 65 20  ask) it must be 
2b670 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d  aligned on an 8-
2b680 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e  byte boundary on
2b690 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69  .  ** some archi
2b6a0 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63 65 20  tectures. Hence 
2b6b0 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62 65 6c  the ROUND8() bel
2b6c0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20  ow..  */.  db = 
2b6d0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42  pParse->db;.  nB
2b6e0 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44  yteWInfo = ROUND
2b6f0 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  8(sizeof(WhereIn
2b700 66 6f 29 2b 28 6e 54 61 62 4c 69 73 74 2d 31 29  fo)+(nTabList-1)
2b710 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
2b720 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66 6f 20 3d  el));.  pWInfo =
2b730 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
2b740 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20 20 20 20  Zero(db, .      
2b750 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20 0a 20 20  nByteWInfo + .  
2b760 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65      sizeof(Where
2b770 43 6c 61 75 73 65 29 20 2b 0a 20 20 20 20 20 20  Clause) +.      
2b780 73 69 7a 65 6f 66 28 57 68 65 72 65 4d 61 73 6b  sizeof(WhereMask
2b790 53 65 74 29 0a 20 20 29 3b 0a 20 20 69 66 28 20  Set).  );.  if( 
2b7a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
2b7b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
2b7c0 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
2b7d0 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 20 3d 20  );.    pWInfo = 
2b7e0 30 3b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72  0;.    goto wher
2b7f0 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d  eBeginError;.  }
2b800 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  .  pWInfo->nLeve
2b810 6c 20 3d 20 6e 54 61 62 4c 69 73 74 3b 0a 20 20  l = nTabList;.  
2b820 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d  pWInfo->pParse =
2b830 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66   pParse;.  pWInf
2b840 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54  o->pTabList = pT
2b850 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f  abList;.  pWInfo
2b860 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74  ->iBreak = sqlit
2b870 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2b880 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57  v);.  pWInfo->pW
2b890 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65  C = pWC = (Where
2b8a0 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a  Clause *)&((u8 *
2b8b0 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49  )pWInfo)[nByteWI
2b8c0 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  nfo];.  pWInfo->
2b8d0 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74  wctrlFlags = wct
2b8e0 72 6c 46 6c 61 67 73 3b 0a 20 20 70 57 49 6e 66  rlFlags;.  pWInf
2b8f0 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c 6f  o->savedNQueryLo
2b900 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 6e 51 75  op = pParse->nQu
2b910 65 72 79 4c 6f 6f 70 3b 0a 20 20 70 4d 61 73 6b  eryLoop;.  pMask
2b920 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b  Set = (WhereMask
2b930 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20  Set*)&pWC[1];.. 
2b940 20 2f 2a 20 44 69 73 61 62 6c 65 20 74 68 65 20   /* Disable the 
2b950 44 49 53 54 49 4e 43 54 20 6f 70 74 69 6d 69 7a  DISTINCT optimiz
2b960 61 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ation if SQLITE_
2b970 44 69 73 74 69 6e 63 74 4f 70 74 20 69 73 20 73  DistinctOpt is s
2b980 65 74 20 76 69 61 0a 20 20 2a 2a 20 73 71 6c 69  et via.  ** sqli
2b990 74 65 33 5f 74 65 73 74 5f 63 74 72 6c 28 53 51  te3_test_ctrl(SQ
2b9a0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50  LITE_TESTCTRL_OP
2b9b0 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 2e 2e 2e 29  TIMIZATIONS,...)
2b9c0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c   */.  if( db->fl
2b9d0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 44 69 73  ags & SQLITE_Dis
2b9e0 74 69 6e 63 74 4f 70 74 20 29 20 70 44 69 73 74  tinctOpt ) pDist
2b9f0 69 6e 63 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  inct = 0;..  /* 
2ba00 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45 20  Split the WHERE 
2ba10 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61  clause into sepa
2ba20 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73 69  rate subexpressi
2ba30 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a 20  ons where each. 
2ba40 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f   ** subexpressio
2ba50 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20 62  n is separated b
2ba60 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  y an AND operato
2ba70 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61  r..  */.  initMa
2ba80 73 6b 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b  skSet(pMaskSet);
2ba90 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e  .  whereClauseIn
2baa0 69 74 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20  it(pWC, pParse, 
2bab0 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c  pMaskSet);.  sql
2bac0 69 74 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73  ite3ExprCodeCons
2bad0 74 61 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57  tants(pParse, pW
2bae0 68 65 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70  here);.  whereSp
2baf0 6c 69 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c  lit(pWC, pWhere,
2bb00 20 54 4b 5f 41 4e 44 29 3b 20 20 20 2f 2a 20 49   TK_AND);   /* I
2bb10 4d 50 3a 20 52 2d 31 35 38 34 32 2d 35 33 32 39  MP: R-15842-5329
2bb20 36 20 2a 2f 0a 20 20 20 20 0a 20 20 2f 2a 20 53  6 */.    .  /* S
2bb30 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57  pecial case: a W
2bb40 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74  HERE clause that
2bb50 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45   is constant.  E
2bb60 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a  valuate the.  **
2bb70 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
2bb80 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72  either jump over
2bb90 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65   all of the code
2bba0 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20   or fall thru.. 
2bbb0 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65   */.  if( pWhere
2bbc0 20 26 26 20 28 6e 54 61 62 4c 69 73 74 3d 3d 30   && (nTabList==0
2bbd0 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
2bbe0 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e  sConstantNotJoin
2bbf0 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20  (pWhere)) ){.   
2bc00 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
2bc10 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68 65  lse(pParse, pWhe
2bc20 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  re, pWInfo->iBre
2bc30 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  ak, SQLITE_JUMPI
2bc40 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65  FNULL);.    pWhe
2bc50 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  re = 0;.  }..  /
2bc60 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20 66  * Assign a bit f
2bc70 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20  rom the bitmask 
2bc80 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
2bc90 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
2bca0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
2bcb0 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61   assigning bitma
2bcc0 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f  sk values to FRO
2bcd0 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73  M clause cursors
2bce0 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a  , it must be.  *
2bcf0 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20  * the case that 
2bd00 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74 6d  if X is the bitm
2bd10 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  ask for the N-th
2bd20 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
2bd30 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20  m then.  ** the 
2bd40 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
2bd50 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2bd60 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
2bd70 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20   the N-th term. 
2bd80 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20   ** is (X-1).   
2bd90 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72  An expression fr
2bda0 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  om the ON clause
2bdb0 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
2bdc0 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73  can use.  ** its
2bdd0 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e   Expr.iRightJoin
2bde0 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66  Table value to f
2bdf0 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20  ind the bitmask 
2be00 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
2be10 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a  le.  ** of the j
2be20 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e  oin.  Subtractin
2be30 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72  g one from the r
2be40 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61  ight table bitma
2be50 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20  sk gives a.  ** 
2be60 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20  bitmask for all 
2be70 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
2be80 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20  ft of the join. 
2be90 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74   Knowing the bit
2bea0 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c  mask.  ** for al
2beb0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
2bec0 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a  left of a left j
2bed0 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  oin is important
2bee0 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e  .  Ticket #3015.
2bef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69  .  **.  ** Confi
2bf00 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43 6c  gure the WhereCl
2bf10 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61  ause.vmask varia
2bf20 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74 73  ble so that bits
2bf30 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
2bf40 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c  .  ** to virtual
2bf50 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61   table cursors a
2bf60 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73 20  re set. This is 
2bf70 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76  used to selectiv
2bf80 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a  ely disable .  *
2bf90 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74  * the OR-to-IN t
2bfa0 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  ransformation in
2bfb0 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65   exprAnalyzeOrTe
2bfc0 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20  rm(). It is not 
2bfd0 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69  helpful .  ** wi
2bfe0 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  th virtual table
2bff0 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  s..  **.  ** Not
2c000 65 20 74 68 61 74 20 62 69 74 6d 61 73 6b 73 20  e that bitmasks 
2c010 61 72 65 20 63 72 65 61 74 65 64 20 66 6f 72 20  are created for 
2c020 61 6c 6c 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  all pTabList->nS
2c030 72 63 20 74 61 62 6c 65 73 20 69 6e 0a 20 20 2a  rc tables in.  *
2c040 2a 20 70 54 61 62 4c 69 73 74 2c 20 6e 6f 74 20  * pTabList, not 
2c050 6a 75 73 74 20 74 68 65 20 66 69 72 73 74 20 6e  just the first n
2c060 54 61 62 4c 69 73 74 20 74 61 62 6c 65 73 2e 20  TabList tables. 
2c070 20 6e 54 61 62 4c 69 73 74 20 69 73 20 6e 6f 72   nTabList is nor
2c080 6d 61 6c 6c 79 0a 20 20 2a 2a 20 65 71 75 61 6c  mally.  ** equal
2c090 20 74 6f 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53   to pTabList->nS
2c0a0 72 63 20 62 75 74 20 6d 69 67 68 74 20 62 65 20  rc but might be 
2c0b0 73 68 6f 72 74 65 6e 65 64 20 74 6f 20 31 20 69  shortened to 1 i
2c0c0 66 20 74 68 65 0a 20 20 2a 2a 20 57 48 45 52 45  f the.  ** WHERE
2c0d0 5f 4f 4e 45 54 41 42 4c 45 5f 4f 4e 4c 59 20 66  _ONETABLE_ONLY f
2c0e0 6c 61 67 20 69 73 20 73 65 74 2e 0a 20 20 2a 2f  lag is set..  */
2c0f0 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e  .  assert( pWC->
2c100 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73  vmask==0 && pMas
2c110 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  kSet->n==0 );.  
2c120 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
2c130 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
2c140 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
2c150 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2c160 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
2c170 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
2c180 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2c190 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
2c1a0 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
2c1b0 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72  ].pTab) && IsVir
2c1c0 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61  tual(pTabList->a
2c1d0 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [i].pTab) ){.   
2c1e0 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d     pWC->vmask |=
2c1f0 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20   ((Bitmask)1 << 
2c200 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  i);.    }.#endif
2c210 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
2c220 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
2c230 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
2c240 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
2c250 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
2c260 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69  ; i++){.      Bi
2c270 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
2c280 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2c290 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
2c2a0 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
2c2b0 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
2c2c0 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
2c2d0 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
2c2e0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
2c2f0 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
2c300 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
2c310 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
2c320 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
2c330 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
2c340 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
2c350 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2c360 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2c370 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
2c380 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
2c390 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
2c3a0 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
2c3b0 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
2c3c0 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
2c3d0 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
2c3e0 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
2c3f0 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
2c400 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
2c410 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
2c420 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
2c430 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d   pWC);.  if( db-
2c440 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
2c450 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
2c460 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
2c470 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
2c480 65 20 44 49 53 54 49 4e 43 54 20 71 75 61 6c 69  e DISTINCT quali
2c490 66 69 65 72 2c 20 69 66 20 74 68 65 72 65 20 69  fier, if there i
2c4a0 73 20 6f 6e 65 2c 20 69 73 20 72 65 64 75 6e 64  s one, is redund
2c4b0 61 6e 74 2e 20 0a 20 20 2a 2a 20 49 66 20 69 74  ant. .  ** If it
2c4c0 20 69 73 2c 20 74 68 65 6e 20 73 65 74 20 70 44   is, then set pD
2c4d0 69 73 74 69 6e 63 74 20 74 6f 20 4e 55 4c 4c 20  istinct to NULL 
2c4e0 61 6e 64 20 57 68 65 72 65 49 6e 66 6f 2e 65 44  and WhereInfo.eD
2c4f0 69 73 74 69 6e 63 74 20 74 6f 0a 20 20 2a 2a 20  istinct to.  ** 
2c500 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 55  WHERE_DISTINCT_U
2c510 4e 49 51 55 45 20 74 6f 20 74 65 6c 6c 20 74 68  NIQUE to tell th
2c520 65 20 63 61 6c 6c 65 72 20 74 6f 20 69 67 6e 6f  e caller to igno
2c530 72 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 2e  re the DISTINCT.
2c540 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 44 69 73  .  */.  if( pDis
2c550 74 69 6e 63 74 20 26 26 20 69 73 44 69 73 74 69  tinct && isDisti
2c560 6e 63 74 52 65 64 75 6e 64 61 6e 74 28 70 50 61  nctRedundant(pPa
2c570 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70  rse, pTabList, p
2c580 57 43 2c 20 70 44 69 73 74 69 6e 63 74 29 20 29  WC, pDistinct) )
2c590 7b 0a 20 20 20 20 70 44 69 73 74 69 6e 63 74 20  {.    pDistinct 
2c5a0 3d 20 30 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  = 0;.    pWInfo-
2c5b0 3e 65 44 69 73 74 69 6e 63 74 20 3d 20 57 48 45  >eDistinct = WHE
2c5c0 52 45 5f 44 49 53 54 49 4e 43 54 5f 55 4e 49 51  RE_DISTINCT_UNIQ
2c5d0 55 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68  UE;.  }..  /* Ch
2c5e0 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64  ose the best ind
2c5f0 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61  ex to use for ea
2c600 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  ch table in the 
2c610 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a  FROM clause..  *
2c620 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
2c630 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f   fills in the fo
2c640 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a  llowing fields:.
2c650 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e    **.  **   pWIn
2c660 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20  fo->a[].pIdx    
2c670 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75    The index to u
2c680 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65  se for this leve
2c690 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  l of the loop.. 
2c6a0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
2c6b0 5d 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45 52  ].wsFlags   WHER
2c6c0 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f  E_xxx flags asso
2c6d0 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78  ciated with pIdx
2c6e0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2c6f0 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68  a[].nEq       Th
2c700 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61  e number of == a
2c710 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  nd IN constraint
2c720 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  s.  **   pWInfo-
2c730 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57  >a[].iFrom     W
2c740 68 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65  hich term of the
2c750 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
2c760 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a  being coded.  **
2c770 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
2c780 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42  TabCur   The VDB
2c790 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
2c7a0 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a   database table.
2c7b0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
2c7c0 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65  [].iIdxCur   The
2c7d0 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
2c7e0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
2c7f0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54    pWInfo->a[].pT
2c800 65 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46  erm     When wsF
2c810 6c 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65  lags==WO_OR, the
2c820 20 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a   OR-clause term.
2c830 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
2c840 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73  oop also figures
2c850 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67   out the nesting
2c860 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
2c870 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a   in the FROM.  *
2c880 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
2c890 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2c8a0 74 6d 61 73 6b 29 30 3b 0a 20 20 61 6e 64 46 6c  tmask)0;.  andFl
2c8b0 61 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52  ags = ~0;.  WHER
2c8c0 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
2c8d0 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
2c8e0 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69  \n"));.  for(i=i
2c8f0 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  From=0, pLevel=p
2c900 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54 61 62  WInfo->a; i<nTab
2c910 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65 76 65  List; i++, pLeve
2c920 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72 65 43  l++){.    WhereC
2c930 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20 20 20  ost bestPlan;   
2c940 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66        /* Most ef
2c950 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73 65 65  ficient plan see
2c960 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
2c970 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
2c980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c990 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
2c9a0 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
2c9b0 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20  */.    int j;   
2c9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c9d0 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2c9e0 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c  g over FROM tabl
2c9f0 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  es */.    int be
2ca00 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20 20 20  stJ = -1;       
2ca10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
2ca20 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
2ca30 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
2ca40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
2ca50 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
2ca60 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
2ca70 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b    int isOptimal;
2ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca90 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6f 70   Iterator for op
2caa0 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61  timal/non-optima
2cab0 6c 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20  l search */.    
2cac0 69 6e 74 20 6e 55 6e 63 6f 6e 73 74 72 61 69 6e  int nUnconstrain
2cad0 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ed;         /* N
2cae0 75 6d 62 65 72 20 74 61 62 6c 65 73 20 77 69 74  umber tables wit
2caf0 68 6f 75 74 20 49 4e 44 45 58 45 44 20 42 59 20  hout INDEXED BY 
2cb00 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6e  */.    Bitmask n
2cb10 6f 74 49 6e 64 65 78 65 64 3b 20 20 20 20 20 20  otIndexed;      
2cb20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 61     /* Mask of ta
2cb30 62 6c 65 73 20 74 68 61 74 20 63 61 6e 6e 6f 74  bles that cannot
2cb40 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 2a 2f   use an index */
2cb50 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65  ..    memset(&be
2cb60 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  stPlan, 0, sizeo
2cb70 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20  f(bestPlan));.  
2cb80 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74    bestPlan.rCost
2cb90 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
2cba0 4c 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43  L;.    WHERETRAC
2cbb0 45 28 28 22 2a 2a 2a 20 42 65 67 69 6e 20 73 65  E(("*** Begin se
2cbc0 61 72 63 68 20 66 6f 72 20 6c 6f 6f 70 20 25 64  arch for loop %d
2cbd0 20 2a 2a 2a 5c 6e 22 2c 20 69 29 29 3b 0a 0a 20   ***\n", i));.. 
2cbe0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
2cbf0 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  gh the remaining
2cc00 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2cc10 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f 20 66  FROM clause to f
2cc20 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ind the.    ** n
2cc30 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ext nested loop.
2cc40 20 54 68 65 20 6c 6f 6f 70 20 74 65 73 74 73 20   The loop tests 
2cc50 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  all FROM clause 
2cc60 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 65  entries.    ** e
2cc70 69 74 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77  ither once or tw
2cc80 69 63 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20  ice. .    **.   
2cc90 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 65   ** The first te
2cca0 73 74 20 69 73 20 61 6c 77 61 79 73 20 70 65 72  st is always per
2ccb0 66 6f 72 6d 65 64 20 69 66 20 74 68 65 72 65 20  formed if there 
2ccc0 61 72 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  are two or more 
2ccd0 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 72  entries.    ** r
2cce0 65 6d 61 69 6e 69 6e 67 20 61 6e 64 20 6e 65 76  emaining and nev
2ccf0 65 72 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  er performed if 
2cd00 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  there is only on
2cd10 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  e FROM clause en
2cd20 74 72 79 0a 20 20 20 20 2a 2a 20 74 6f 20 63 68  try.    ** to ch
2cd30 6f 6f 73 65 20 66 72 6f 6d 2e 20 20 54 68 65 20  oose from.  The 
2cd40 66 69 72 73 74 20 74 65 73 74 20 6c 6f 6f 6b 73  first test looks
2cd50 20 66 6f 72 20 61 6e 20 22 6f 70 74 69 6d 61 6c   for an "optimal
2cd60 22 20 73 63 61 6e 2e 20 20 49 6e 0a 20 20 20 20  " scan.  In.    
2cd70 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20  ** this context 
2cd80 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20  an optimal scan 
2cd90 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73  is one that uses
2cda0 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74 65   the same strate
2cdb0 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  gy.    ** for th
2cdc0 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61  e given FROM cla
2cdd0 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75  use entry as wou
2cde0 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20 69  ld be selected i
2cdf0 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20  f the entry.    
2ce00 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73 20  ** were used as 
2ce10 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65  the innermost ne
2ce20 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20 6f  sted loop.  In o
2ce30 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74 61  ther words, a ta
2ce40 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63 68  ble.    ** is ch
2ce50 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20 74  osen such that t
2ce60 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e 69  he cost of runni
2ce70 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63 61  ng that table ca
2ce80 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 0a  nnot be reduced.
2ce90 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69 6e      ** by waitin
2cea0 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62 6c  g for other tabl
2ceb0 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74 2e  es to run first.
2cec0 20 20 54 68 69 73 20 22 6f 70 74 69 6d 61 6c 22    This "optimal"
2ced0 20 74 65 73 74 20 77 6f 72 6b 73 0a 20 20 20 20   test works.    
2cee0 2a 2a 20 62 79 20 66 69 72 73 74 20 61 73 73 75  ** by first assu
2cef0 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20 46 52  ming that the FR
2cf00 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6f 6e 20  OM clause is on 
2cf10 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 61  the inner loop a
2cf20 6e 64 20 66 69 6e 64 69 6e 67 0a 20 20 20 20 2a  nd finding.    *
2cf30 2a 20 69 74 73 20 71 75 65 72 79 20 70 6c 61 6e  * its query plan
2cf40 2c 20 74 68 65 6e 20 63 68 65 63 6b 69 6e 67 20  , then checking 
2cf50 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 20 71  to see if that q
2cf60 75 65 72 79 20 70 6c 61 6e 20 75 73 65 73 20 61  uery plan uses a
2cf70 6e 79 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  ny.    ** other 
2cf80 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
2cf90 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 52 65  s that are notRe
2cfa0 61 64 79 2e 20 20 49 66 20 6e 6f 20 6e 6f 74 52  ady.  If no notR
2cfb0 65 61 64 79 20 74 65 72 6d 73 20 61 72 65 0a 20  eady terms are. 
2cfc0 20 20 20 2a 2a 20 75 73 65 64 20 74 68 65 6e 20     ** used then 
2cfd0 74 68 65 20 22 6f 70 74 69 6d 61 6c 22 20 71 75  the "optimal" qu
2cfe0 65 72 79 20 70 6c 61 6e 20 77 6f 72 6b 73 2e 0a  ery plan works..
2cff0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f      **.    ** No
2d000 74 65 20 74 68 61 74 20 74 68 65 20 57 68 65 72  te that the Wher
2d010 65 43 6f 73 74 2e 6e 52 6f 77 20 70 61 72 61 6d  eCost.nRow param
2d020 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 74 69  eter for an opti
2d030 6d 61 6c 20 73 63 61 6e 20 6d 69 67 68 74 0a 20  mal scan might. 
2d040 20 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 73 20     ** not be as 
2d050 73 6d 61 6c 6c 20 61 73 20 69 74 20 77 6f 75 6c  small as it woul
2d060 64 20 62 65 20 69 66 20 74 68 65 20 74 61 62 6c  d be if the tabl
2d070 65 20 72 65 61 6c 6c 79 20 77 65 72 65 20 74 68  e really were th
2d080 65 20 69 6e 6e 65 72 6d 6f 73 74 0a 20 20 20 20  e innermost.    
2d090 2a 2a 20 6a 6f 69 6e 2e 20 20 54 68 65 20 6e 52  ** join.  The nR
2d0a0 6f 77 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ow value can be 
2d0b0 72 65 64 75 63 65 64 20 62 79 20 57 48 45 52 45  reduced by WHERE
2d0c0 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72 61 69   clause constrai
2d0d0 6e 74 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  nts.    ** that 
2d0e0 64 6f 20 6e 6f 74 20 75 73 65 20 69 6e 64 69 63  do not use indic
2d0f0 65 73 2e 20 20 42 75 74 20 74 68 69 73 20 6e 52  es.  But this nR
2d100 6f 77 20 72 65 64 75 63 74 69 6f 6e 20 6f 6e 6c  ow reduction onl
2d110 79 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  y happens if the
2d120 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 72 65  .    ** table re
2d130 61 6c 6c 79 20 69 73 20 74 68 65 20 69 6e 6e 65  ally is the inne
2d140 72 6d 6f 73 74 20 6a 6f 69 6e 2e 20 20 0a 20 20  rmost join.  .  
2d150 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
2d160 73 65 63 6f 6e 64 20 6c 6f 6f 70 20 69 74 65 72  second loop iter
2d170 61 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65  ation is only pe
2d180 72 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70  rformed if no op
2d190 74 69 6d 61 6c 20 73 63 61 6e 0a 20 20 20 20 2a  timal scan.    *
2d1a0 2a 20 73 74 72 61 74 65 67 69 65 73 20 77 65 72  * strategies wer
2d1b0 65 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66  e found by the f
2d1c0 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2e 20  irst iteration. 
2d1d0 54 68 69 73 20 73 65 63 6f 6e 64 20 69 74 65 72  This second iter
2d1e0 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 69 73 20  ation.    ** is 
2d1f0 75 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66  used to search f
2d200 6f 72 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f  or the lowest co
2d210 73 74 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e  st scan overall.
2d220 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50  .    **.    ** P
2d230 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
2d240 20 6f 66 20 53 51 4c 69 74 65 20 70 65 72 66 6f   of SQLite perfo
2d250 72 6d 65 64 20 6f 6e 6c 79 20 74 68 65 20 73 65  rmed only the se
2d260 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2d  cond iteration -
2d270 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74  .    ** the next
2d280 20 6f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20   outermost loop 
2d290 77 61 73 20 61 6c 77 61 79 73 20 74 68 61 74 20  was always that 
2d2a0 77 69 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20  with the lowest 
2d2b0 6f 76 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63  overall.    ** c
2d2c0 6f 73 74 2e 20 48 6f 77 65 76 65 72 2c 20 74 68  ost. However, th
2d2d0 69 73 20 6d 65 61 6e 74 20 74 68 61 74 20 53 51  is meant that SQ
2d2e0 4c 69 74 65 20 63 6f 75 6c 64 20 73 65 6c 65 63  Lite could selec
2d2f0 74 20 74 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e  t the wrong plan
2d300 0a 20 20 20 20 2a 2a 20 66 6f 72 20 73 63 72 69  .    ** for scri
2d310 70 74 73 20 73 75 63 68 20 61 73 20 74 68 65 20  pts such as the 
2d320 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a  following:.    *
2d330 2a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20 43 52  *   .    **   CR
2d340 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c  EATE TABLE t1(a,
2d350 20 62 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43   b); .    **   C
2d360 52 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 63  REATE TABLE t2(c
2d370 2c 20 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53  , d);.    **   S
2d380 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c  ELECT * FROM t2,
2d390 20 74 31 20 57 48 45 52 45 20 74 32 2e 72 6f 77   t1 WHERE t2.row
2d3a0 69 64 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a  id = t1.a;.    *
2d3b0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73  *.    ** The bes
2d3c0 74 20 73 74 72 61 74 65 67 79 20 69 73 20 74 6f  t strategy is to
2d3d0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2d3e0 20 74 61 62 6c 65 20 74 31 20 66 69 72 73 74 2e   table t1 first.
2d3f0 20 48 6f 77 65 76 65 72 20 69 74 0a 20 20 20 20   However it.    
2d400 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  ** is not possib
2d410 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  le to determine 
2d420 74 68 69 73 20 77 69 74 68 20 61 20 73 69 6d 70  this with a simp
2d430 6c 65 20 67 72 65 65 64 79 20 61 6c 67 6f 72 69  le greedy algori
2d440 74 68 6d 2e 0a 20 20 20 20 2a 2a 20 53 69 6e 63  thm..    ** Sinc
2d450 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
2d460 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
2d470 75 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20  ugh table t2 is 
2d480 74 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a  the same .    **
2d490 20 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20   as the cost of 
2d4a0 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
2d4b0 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20  rough table t1, 
2d4c0 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
2d4d0 0a 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68  .    ** algorith
2d4e0 6d 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20  m may choose to 
2d4f0 75 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f  use t2 for the o
2d500 75 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68  uter loop, which
2d510 20 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a   is a much.    *
2d520 2a 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f  * costlier appro
2d530 61 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ach..    */.    
2d540 6e 55 6e 63 6f 6e 73 74 72 61 69 6e 65 64 20 3d  nUnconstrained =
2d550 20 30 3b 0a 20 20 20 20 6e 6f 74 49 6e 64 65 78   0;.    notIndex
2d560 65 64 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ed = 0;.    for(
2d570 69 73 4f 70 74 69 6d 61 6c 3d 28 69 46 72 6f 6d  isOptimal=(iFrom
2d580 3c 6e 54 61 62 4c 69 73 74 2d 31 29 3b 20 69 73  <nTabList-1); is
2d590 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62 65  Optimal>=0 && be
2d5a0 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61 6c  stJ<0; isOptimal
2d5b0 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  --){.      Bitma
2d5c0 73 6b 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20  sk mask;        
2d5d0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
2d5e0 74 61 62 6c 65 73 20 6e 6f 74 20 79 65 74 20 72  tables not yet r
2d5f0 65 61 64 79 20 2a 2f 0a 20 20 20 20 20 20 66 6f  eady */.      fo
2d600 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49  r(j=iFrom, pTabI
2d610 74 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61  tem=&pTabList->a
2d620 5b 6a 5d 3b 20 6a 3c 6e 54 61 62 4c 69 73 74 3b  [j]; j<nTabList;
2d630 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
2d640 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 64  ){.        int d
2d650 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 20 20  oNotReorder;    
2d660 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2d670 74 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74  table should not
2d680 20 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f   be reordered */
2d690 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6f  .        WhereCo
2d6a0 73 74 20 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a  st sCost;     /*
2d6b0 20 43 6f 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f   Cost informatio
2d6c0 6e 20 66 72 6f 6d 20 62 65 73 74 5b 56 69 72 74  n from best[Virt
2d6d0 75 61 6c 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20  ual]Index() */. 
2d6e0 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
2d6f0 2a 70 4f 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f  *pOrderBy;  /* O
2d700 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
2d710 6f 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69  or index to opti
2d720 6d 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  mize */.        
2d730 45 78 70 72 4c 69 73 74 20 2a 70 44 69 73 74 3b  ExprList *pDist;
2d740 20 20 20 20 20 2f 2a 20 44 49 53 54 49 4e 43 54       /* DISTINCT
2d750 20 63 6c 61 75 73 65 20 66 6f 72 20 69 6e 64 65   clause for inde
2d760 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f  x to optimize */
2d770 0a 20 20 0a 20 20 20 20 20 20 20 20 64 6f 4e 6f  .  .        doNo
2d780 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54 61  tReorder =  (pTa
2d790 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20  bItem->jointype 
2d7a0 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
2d7b0 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  OSS))!=0;.      
2d7c0 20 20 69 66 28 20 6a 21 3d 69 46 72 6f 6d 20 26    if( j!=iFrom &
2d7d0 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  & doNotReorder )
2d7e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2d7f0 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  m = getMask(pMas
2d800 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
2d810 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
2d820 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65    if( (m & notRe
2d830 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ady)==0 ){.     
2d840 20 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f       if( j==iFro
2d850 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20  m ) iFrom++;.   
2d860 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2d870 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d880 20 20 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70 74     mask = (isOpt
2d890 69 6d 61 6c 20 3f 20 6d 20 3a 20 6e 6f 74 52 65  imal ? m : notRe
2d8a0 61 64 79 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  ady);.        pO
2d8b0 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30 20  rderBy = ((i==0 
2d8c0 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f 2a  && ppOrderBy )?*
2d8d0 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20 20  ppOrderBy:0);.  
2d8e0 20 20 20 20 20 20 70 44 69 73 74 20 3d 20 28 69        pDist = (i
2d8f0 3d 3d 30 20 3f 20 70 44 69 73 74 69 6e 63 74 20  ==0 ? pDistinct 
2d900 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  : 0);.        if
2d910 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e 64  ( pTabItem->pInd
2d920 65 78 3d 3d 30 20 29 20 6e 55 6e 63 6f 6e 73 74  ex==0 ) nUnconst
2d930 72 61 69 6e 65 64 2b 2b 3b 0a 20 20 0a 20 20 20  rained++;.  .   
2d940 20 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28       WHERETRACE(
2d950 28 22 3d 3d 3d 20 74 72 79 69 6e 67 20 74 61 62  ("=== trying tab
2d960 6c 65 20 25 64 20 77 69 74 68 20 69 73 4f 70 74  le %d with isOpt
2d970 69 6d 61 6c 3d 25 64 20 3d 3d 3d 5c 6e 22 2c 0a  imal=%d ===\n",.
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d990 20 20 20 20 6a 2c 20 69 73 4f 70 74 69 6d 61 6c      j, isOptimal
2d9a0 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
2d9b0 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  rt( pTabItem->pT
2d9c0 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ab );.#ifndef SQ
2d9d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2d9e0 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69  LTABLE.        i
2d9f0 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  f( IsVirtual(pTa
2da00 62 49 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a  bItem->pTab) ){.
2da10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2da20 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
2da30 70 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a  p = &pWInfo->a[j
2da40 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ].pIdxInfo;.    
2da50 20 20 20 20 20 20 62 65 73 74 56 69 72 74 75 61        bestVirtua
2da60 6c 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  lIndex(pParse, p
2da70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d 61  WC, pTabItem, ma
2da80 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f  sk, notReady, pO
2da90 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20 20 20  rderBy,.        
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dab0 20 20 20 26 73 43 6f 73 74 2c 20 70 70 29 3b 0a     &sCost, pp);.
2dac0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23          }else .#
2dad0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
2dae0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74            bestBt
2daf0 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  reeIndex(pParse,
2db00 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
2db10 6d 61 73 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  mask, notReady, 
2db20 70 4f 72 64 65 72 42 79 2c 0a 20 20 20 20 20 20  pOrderBy,.      
2db30 20 20 20 20 20 20 20 20 70 44 69 73 74 2c 20 26          pDist, &
2db40 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20  sCost);.        
2db50 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2db60 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20 28  ( isOptimal || (
2db70 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52 65  sCost.used&notRe
2db80 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  ady)==0 );..    
2db90 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e 44      /* If an IND
2dba0 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 69  EXED BY clause i
2dbb0 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e 20  s present, then 
2dbc0 74 68 65 20 70 6c 61 6e 20 6d 75 73 74 20 75 73  the plan must us
2dbd0 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  e that.        *
2dbe0 2a 20 69 6e 64 65 78 20 69 66 20 69 74 20 75 73  * index if it us
2dbf0 65 73 20 61 6e 79 20 69 6e 64 65 78 20 61 74 20  es any index at 
2dc00 61 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  all */.        a
2dc10 73 73 65 72 74 28 20 70 54 61 62 49 74 65 6d 2d  ssert( pTabItem-
2dc20 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20  >pIndex==0 .    
2dc30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
2dc40 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46   (sCost.plan.wsF
2dc50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54  lags & WHERE_NOT
2dc60 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20  _FULLSCAN)==0.  
2dc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc80 7c 7c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 75 2e  || sCost.plan.u.
2dc90 70 49 64 78 3d 3d 70 54 61 62 49 74 65 6d 2d 3e  pIdx==pTabItem->
2dca0 70 49 6e 64 65 78 20 29 3b 0a 0a 20 20 20 20 20  pIndex );..     
2dcb0 20 20 20 69 66 28 20 69 73 4f 70 74 69 6d 61 6c     if( isOptimal
2dcc0 20 26 26 20 28 73 43 6f 73 74 2e 70 6c 61 6e 2e   && (sCost.plan.
2dcd0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2dce0 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30  NOT_FULLSCAN)==0
2dcf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   ){.          no
2dd00 74 49 6e 64 65 78 65 64 20 7c 3d 20 6d 3b 0a 20  tIndexed |= m;. 
2dd10 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2dd20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 73 20    /* Conditions 
2dd30 75 6e 64 65 72 20 77 68 69 63 68 20 74 68 69 73  under which this
2dd40 20 74 61 62 6c 65 20 62 65 63 6f 6d 65 73 20 74   table becomes t
2dd50 68 65 20 62 65 73 74 20 73 6f 20 66 61 72 3a 0a  he best so far:.
2dd60 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2dd70 20 20 20 2a 2a 20 20 20 28 31 29 20 54 68 65 20     **   (1) The 
2dd80 74 61 62 6c 65 20 6d 75 73 74 20 6e 6f 74 20 64  table must not d
2dd90 65 70 65 6e 64 20 6f 6e 20 6f 74 68 65 72 20 74  epend on other t
2dda0 61 62 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  ables that have 
2ddb0 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  not.        **  
2ddc0 20 20 20 20 20 79 65 74 20 72 75 6e 2e 0a 20 20       yet run..  
2ddd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
2dde0 20 2a 2a 20 20 20 28 32 29 20 41 20 66 75 6c 6c   **   (2) A full
2ddf0 2d 74 61 62 6c 65 2d 73 63 61 6e 20 70 6c 61 6e  -table-scan plan
2de00 20 63 61 6e 6e 6f 74 20 73 75 70 65 72 63 65 64   cannot superced
2de10 65 20 69 6e 64 65 78 65 64 20 70 6c 61 6e 20 75  e indexed plan u
2de20 6e 6c 65 73 73 0a 20 20 20 20 20 20 20 20 2a 2a  nless.        **
2de30 20 20 20 20 20 20 20 74 68 65 20 66 75 6c 6c 2d         the full-
2de40 74 61 62 6c 65 2d 73 63 61 6e 20 69 73 20 61 6e  table-scan is an
2de50 20 22 6f 70 74 69 6d 61 6c 22 20 70 6c 61 6e 20   "optimal" plan 
2de60 61 73 20 64 65 66 69 6e 65 64 20 61 62 6f 76 65  as defined above
2de70 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2de80 20 20 20 20 20 2a 2a 20 20 20 28 33 29 20 41 6c       **   (3) Al
2de90 6c 20 74 61 62 6c 65 73 20 68 61 76 65 20 61 6e  l tables have an
2dea0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2deb0 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
2dec0 20 6c 61 63 6b 73 20 61 6e 0a 20 20 20 20 20 20   lacks an.      
2ded0 20 20 2a 2a 20 20 20 20 20 20 20 49 4e 44 45 58    **       INDEX
2dee0 45 44 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20  ED BY clause or 
2def0 74 68 69 73 20 74 61 62 6c 65 20 75 73 65 73 20  this table uses 
2df00 74 68 65 20 73 70 65 63 69 66 69 63 0a 20 20 20  the specific.   
2df10 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 69 6e       **       in
2df20 64 65 78 20 73 70 65 63 69 66 69 65 64 20 62 79  dex specified by
2df30 20 69 74 73 20 49 4e 44 45 58 45 44 20 42 59 20   its INDEXED BY 
2df40 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 72 75  clause.  This ru
2df50 6c 65 20 65 6e 73 75 72 65 73 0a 20 20 20 20 20  le ensures.     
2df60 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 61 74     **       that
2df70 20 61 20 62 65 73 74 2d 73 6f 2d 66 61 72 20 69   a best-so-far i
2df80 73 20 61 6c 77 61 79 73 20 73 65 6c 65 63 74 65  s always selecte
2df90 64 20 65 76 65 6e 20 69 66 20 61 6e 20 69 6d 70  d even if an imp
2dfa0 6f 73 73 69 62 6c 65 0a 20 20 20 20 20 20 20 20  ossible.        
2dfb0 2a 2a 20 20 20 20 20 20 20 63 6f 6d 62 69 6e 61  **       combina
2dfc0 74 69 6f 6e 20 6f 66 20 49 4e 44 45 58 45 44 20  tion of INDEXED 
2dfd0 42 59 20 63 6c 61 75 73 65 73 20 61 72 65 20 67  BY clauses are g
2dfe0 69 76 65 6e 2e 20 20 54 68 65 20 65 72 72 6f 72  iven.  The error
2dff0 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2e000 20 20 77 69 6c 6c 20 62 65 20 64 65 74 65 63 74    will be detect
2e010 65 64 20 61 6e 64 20 72 65 6c 61 79 65 64 20 62  ed and relayed b
2e020 61 63 6b 20 74 6f 20 74 68 65 20 61 70 70 6c 69  ack to the appli
2e030 63 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 20 20  cation later..  
2e040 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 54        **       T
2e050 68 65 20 4e 45 56 45 52 28 29 20 63 6f 6d 65 73  he NEVER() comes
2e060 20 61 62 6f 75 74 20 62 65 63 61 75 73 65 20 72   about because r
2e070 75 6c 65 20 28 32 29 20 61 62 6f 76 65 20 70 72  ule (2) above pr
2e080 65 76 65 6e 74 73 0a 20 20 20 20 20 20 20 20 2a  events.        *
2e090 2a 20 20 20 20 20 20 20 41 6e 20 69 6e 64 65 78  *       An index
2e0a0 61 62 6c 65 20 66 75 6c 6c 2d 74 61 62 6c 65 2d  able full-table-
2e0b0 73 63 61 6e 20 66 72 6f 6d 20 72 65 61 63 68 69  scan from reachi
2e0c0 6e 67 20 72 75 6c 65 20 28 33 29 2e 0a 20 20 20  ng rule (3)..   
2e0d0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
2e0e0 2a 2a 20 20 20 28 34 29 20 54 68 65 20 70 6c 61  **   (4) The pla
2e0f0 6e 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20 6c  n cost must be l
2e100 6f 77 65 72 20 74 68 61 6e 20 70 72 69 6f 72 20  ower than prior 
2e110 70 6c 61 6e 73 20 6f 72 20 65 6c 73 65 20 74 68  plans or else th
2e120 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  e.        **    
2e130 20 20 20 63 6f 73 74 20 6d 75 73 74 20 62 65 20     cost must be 
2e140 74 68 65 20 73 61 6d 65 20 61 6e 64 20 74 68 65  the same and the
2e150 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
2e160 6d 75 73 74 20 62 65 20 6c 6f 77 65 72 2e 0a 20  must be lower.. 
2e170 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2e180 20 20 69 66 28 20 28 73 43 6f 73 74 2e 75 73 65    if( (sCost.use
2e190 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 20  d&notReady)==0  
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 20 20 20 20 2f 2a 20 28 31 29 20 2a 2f 0a 20       /* (1) */. 
2e1c0 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 62             && (b
2e1d0 65 73 74 4a 3c 30 20 7c 7c 20 28 6e 6f 74 49 6e  estJ<0 || (notIn
2e1e0 64 65 78 65 64 26 6d 29 21 3d 30 20 20 20 20 20  dexed&m)!=0     
2e1f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 32 29            /* (2)
2e200 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2e210 20 20 20 20 7c 7c 20 28 62 65 73 74 50 6c 61 6e      || (bestPlan
2e220 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e230 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2e240 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  AN)==0.         
2e250 20 20 20 20 20 20 20 7c 7c 20 28 73 43 6f 73 74         || (sCost
2e260 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e270 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2e280 41 4e 29 21 3d 30 29 0a 20 20 20 20 20 20 20 20  AN)!=0).        
2e290 20 20 20 20 26 26 20 28 6e 55 6e 63 6f 6e 73 74      && (nUnconst
2e2a0 72 61 69 6e 65 64 3d 3d 30 20 7c 7c 20 70 54 61  rained==0 || pTa
2e2b0 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30  bItem->pIndex==0
2e2c0 20 20 20 2f 2a 20 28 33 29 20 2a 2f 0a 20 20 20     /* (3) */.   
2e2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2e2e0 4e 45 56 45 52 28 28 73 43 6f 73 74 2e 70 6c 61  NEVER((sCost.pla
2e2f0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2e300 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 21  E_NOT_FULLSCAN)!
2e310 3d 30 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  =0)).           
2e320 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20   && (bestJ<0 || 
2e330 73 43 6f 73 74 2e 72 43 6f 73 74 3c 62 65 73 74  sCost.rCost<best
2e340 50 6c 61 6e 2e 72 43 6f 73 74 20 20 20 20 20 20  Plan.rCost      
2e350 2f 2a 20 28 34 29 20 2a 2f 0a 20 20 20 20 20 20  /* (4) */.      
2e360 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 43            || (sC
2e370 6f 73 74 2e 72 43 6f 73 74 3c 3d 62 65 73 74 50  ost.rCost<=bestP
2e380 6c 61 6e 2e 72 43 6f 73 74 20 0a 20 20 20 20 20  lan.rCost .     
2e390 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 73              && s
2e3a0 43 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 3c 62  Cost.plan.nRow<b
2e3b0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f  estPlan.plan.nRo
2e3c0 77 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  w)).        ){. 
2e3d0 20 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52           WHERETR
2e3e0 41 43 45 28 28 22 3d 3d 3d 20 74 61 62 6c 65 20  ACE(("=== table 
2e3f0 25 64 20 69 73 20 62 65 73 74 20 73 6f 20 66 61  %d is best so fa
2e400 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2e410 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2e420 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77  cost=%g and nRow
2e430 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 2c                j,
2e450 20 73 43 6f 73 74 2e 72 43 6f 73 74 2c 20 73 43   sCost.rCost, sC
2e460 6f 73 74 2e 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b  ost.plan.nRow));
2e470 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 50  .          bestP
2e480 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20 20 20  lan = sCost;.   
2e490 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a         bestJ = j
2e4a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e4b0 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f      if( doNotReo
2e4c0 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
2e4d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e4e0 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e 3d 30  assert( bestJ>=0
2e4f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2e500 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74 4d 61  notReady & getMa
2e510 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61  sk(pMaskSet, pTa
2e520 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
2e530 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 20 20  iCursor) );.    
2e540 57 48 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a  WHERETRACE(("***
2e550 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c 65 63   Optimizer selec
2e560 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20  ts table %d for 
2e570 6c 6f 6f 70 20 25 64 22 0a 20 20 20 20 20 20 20  loop %d".       
2e580 20 20 20 20 20 20 20 20 20 22 20 77 69 74 68 20           " with 
2e590 63 6f 73 74 3d 25 67 20 61 6e 64 20 6e 52 6f 77  cost=%g and nRow
2e5a0 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
2e5b0 20 20 20 20 20 20 20 20 62 65 73 74 4a 2c 20 70          bestJ, p
2e5c0 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 2c  Level-pWInfo->a,
2e5d0 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 2c   bestPlan.rCost,
2e5e0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e   bestPlan.plan.n
2e5f0 52 6f 77 29 29 3b 0a 20 20 20 20 69 66 28 20 28  Row));.    if( (
2e600 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2e610 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52  Flags & WHERE_OR
2e620 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20  DERBY)!=0 ){.   
2e630 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
2e640 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
2e650 20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e   (bestPlan.plan.
2e660 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e670 44 49 53 54 49 4e 43 54 29 21 3d 30 20 29 7b 0a  DISTINCT)!=0 ){.
2e680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 57        assert( pW
2e690 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 3d  Info->eDistinct=
2e6a0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 57 49 6e  =0 );.      pWIn
2e6b0 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74 20 3d 20  fo->eDistinct = 
2e6c0 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 5f 4f  WHERE_DISTINCT_O
2e6d0 52 44 45 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  RDERED;.    }.  
2e6e0 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62 65    andFlags &= be
2e6f0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
2e700 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
2e710 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61 6e  >plan = bestPlan
2e720 2e 70 6c 61 6e 3b 0a 20 20 20 20 74 65 73 74 63  .plan;.    testc
2e730 61 73 65 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c  ase( bestPlan.pl
2e740 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2e750 52 45 5f 49 4e 44 45 58 45 44 20 29 3b 0a 20 20  RE_INDEXED );.  
2e760 20 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74    testcase( best
2e770 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  Plan.plan.wsFlag
2e780 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s & WHERE_TEMP_I
2e790 4e 44 45 58 20 29 3b 0a 20 20 20 20 69 66 28 20  NDEX );.    if( 
2e7a0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
2e7b0 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 49  Flags & (WHERE_I
2e7c0 4e 44 45 58 45 44 7c 57 48 45 52 45 5f 54 45 4d  NDEXED|WHERE_TEM
2e7d0 50 5f 49 4e 44 45 58 29 20 29 7b 0a 20 20 20 20  P_INDEX) ){.    
2e7e0 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
2e7f0 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
2e800 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
2e810 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
2e820 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
2e830 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
2e840 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53   ~getMask(pMaskS
2e850 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
2e860 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
2e870 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
2e880 6f 6d 20 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a  om = (u8)bestJ;.
2e890 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
2e8a0 2e 70 6c 61 6e 2e 6e 52 6f 77 3e 3d 28 64 6f 75  .plan.nRow>=(dou
2e8b0 62 6c 65 29 31 20 29 7b 0a 20 20 20 20 20 20 70  ble)1 ){.      p
2e8c0 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f  Parse->nQueryLoo
2e8d0 70 20 2a 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c  p *= bestPlan.pl
2e8e0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d 0a 0a  an.nRow;.    }..
2e8f0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
2e900 74 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 73  t if the table s
2e910 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c  canned by this l
2e920 6f 6f 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61  oop iteration ha
2e930 64 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45  d an.    ** INDE
2e940 58 45 44 20 42 59 20 63 6c 61 75 73 65 20 61 74  XED BY clause at
2e950 74 61 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68  tached to it, th
2e960 61 74 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64  at the named ind
2e970 65 78 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  ex is being.    
2e980 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  ** used for the 
2e990 73 63 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68  scan. If not, th
2e9a0 65 6e 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61  en query compila
2e9b0 74 69 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e  tion has failed.
2e9c0 0a 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61  .    ** Return a
2e9d0 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a  n error..    */.
2e9e0 20 20 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c      pIdx = pTabL
2e9f0 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49  ist->a[bestJ].pI
2ea00 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49  ndex;.    if( pI
2ea10 64 78 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  dx ){.      if( 
2ea20 28 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77  (bestPlan.plan.w
2ea30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2ea40 4e 44 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20  NDEXED)==0 ){.  
2ea50 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
2ea60 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63  orMsg(pParse, "c
2ea70 61 6e 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a  annot use index:
2ea80 20 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d   %s", pIdx->zNam
2ea90 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  e);.        goto
2eaa0 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72   whereBeginError
2eab0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2eac0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
2ead0 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2eae0 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 20 62  e is used, the b
2eaf0 65 73 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74  estIndex() funct
2eb00 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a  ion is.        *
2eb10 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
2eb20 66 69 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73  find the index s
2eb30 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20  pecified in the 
2eb40 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73  INDEXED BY claus
2eb50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20  e.        ** if 
2eb60 69 74 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78  it find an index
2eb70 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20   at all. */.    
2eb80 20 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74      assert( best
2eb90 50 6c 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78  Plan.plan.u.pIdx
2eba0 3d 3d 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20  ==pIdx );.      
2ebb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48  }.    }.  }.  WH
2ebc0 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
2ebd0 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
2ebe0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66  d ***\n"));.  if
2ebf0 28 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c  ( pParse->nErr |
2ec00 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
2ec10 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
2ec20 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
2ec30 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
2ec40 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
2ec50 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
2ec60 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
2ec70 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
2ec80 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
2ec90 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
2eca0 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
2ecb0 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
2ecc0 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
2ecd0 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
2ece0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
2ecf0 65 20 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55  e caller is an U
2ed00 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
2ed10 73 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69  statement that i
2ed20 73 20 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a  s requesting.  *
2ed30 2a 20 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70  * to use a one-p
2ed40 61 73 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64  ass algorithm, d
2ed50 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73  etermine if this
2ed60 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e   is appropriate.
2ed70 0a 20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61  .  ** The one-pa
2ed80 73 73 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c  ss algorithm onl
2ed90 79 20 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57  y works if the W
2eda0 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
2edb0 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65  traints.  ** the
2edc0 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70   statement to up
2edd0 64 61 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  date a single ro
2ede0 77 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  w..  */.  assert
2edf0 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20  ( (wctrlFlags & 
2ee00 57 48 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45  WHERE_ONEPASS_DE
2ee10 53 49 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49  SIRED)==0 || pWI
2ee20 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29  nfo->nLevel==1 )
2ee30 3b 0a 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c  ;.  if( (wctrlFl
2ee40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2ee50 41 53 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20  ASS_DESIRED)!=0 
2ee60 26 26 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57  && (andFlags & W
2ee70 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20  HERE_UNIQUE)!=0 
2ee80 29 7b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f  ){.    pWInfo->o
2ee90 6b 4f 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20  kOnePass = 1;.  
2eea0 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70    pWInfo->a[0].p
2eeb0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e  lan.wsFlags &= ~
2eec0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a  WHERE_IDX_ONLY;.
2eed0 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61    }..  /* Open a
2eee0 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ll tables in the
2eef0 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e   pTabList and an
2ef00 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74  y indices select
2ef10 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72  ed for.  ** sear
2ef20 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c  ching those tabl
2ef30 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  es..  */.  sqlit
2ef40 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65  e3CodeVerifySche
2ef50 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20  ma(pParse, -1); 
2ef60 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f  /* Insert the co
2ef70 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47 6f  okie verifier Go
2ef80 74 6f 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  to */.  notReady
2ef90 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
2efa0 20 20 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75    pWInfo->nRowOu
2efb0 74 20 3d 20 28 64 6f 75 62 6c 65 29 31 3b 0a 20  t = (double)1;. 
2efc0 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
2efd0 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 6e 54  =pWInfo->a; i<nT
2efe0 61 62 4c 69 73 74 3b 20 69 2b 2b 2c 20 70 4c 65  abList; i++, pLe
2eff0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
2f000 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20  e *pTab;     /* 
2f010 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f  Table to open */
2f020 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20 20 20  .    int iDb;   
2f030 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
2f040 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61  f database conta
2f050 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65  ining table/inde
2f060 78 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  x */..    pTabIt
2f070 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
2f080 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
2f090 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
2f0a0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
2f0b0 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72   pLevel->iTabCur
2f0c0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2f0d0 72 73 6f 72 3b 0a 20 20 20 20 70 57 49 6e 66 6f  rsor;.    pWInfo
2f0e0 2d 3e 6e 52 6f 77 4f 75 74 20 2a 3d 20 70 4c 65  ->nRowOut *= pLe
2f0f0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a  vel->plan.nRow;.
2f100 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
2f110 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
2f120 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
2f130 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
2f140 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
2f150 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
2f160 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
2f170 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
2f180 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 65 6c  thing */.    }el
2f190 73 65 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  se.#ifndef SQLIT
2f1a0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
2f1b0 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c 65  BLE.    if( (pLe
2f1c0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
2f1d0 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55 41  s & WHERE_VIRTUA
2f1e0 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20  LTABLE)!=0 ){.  
2f1f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2f200 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  pVTab = (const c
2f210 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65 74  har *)sqlite3Get
2f220 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62 29  VTable(db, pTab)
2f230 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75 72  ;.      int iCur
2f240 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
2f250 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  rsor;.      sqli
2f260 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
2f270 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72 2c   OP_VOpen, iCur,
2f280 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50 34   0, 0, pVTab, P4
2f290 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73  _VTAB);.    }els
2f2a0 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  e.#endif.    if(
2f2b0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
2f2c0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
2f2d0 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20 20  DX_ONLY)==0.    
2f2e0 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c       && (wctrlFl
2f2f0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54  ags & WHERE_OMIT
2f300 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20 20  _OPEN)==0 ){.   
2f310 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49 6e     int op = pWIn
2f320 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f 20  fo->okOnePass ? 
2f330 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20 4f  OP_OpenWrite : O
2f340 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20 20  P_OpenRead;.    
2f350 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
2f360 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
2f370 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
2f380 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20 20  b, pTab, op);.  
2f390 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
2f3a0 61 62 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  ab->nCol==BMS-1 
2f3b0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
2f3c0 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d 42  e( pTab->nCol==B
2f3d0 4d 53 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  MS );.      if( 
2f3e0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
2f3f0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
2f400 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
2f410 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
2f420 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
2f430 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
2f440 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
2f450 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
2f460 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
2f470 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
2f480 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
2f490 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 0a 20  entAddr(v)-1, . 
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2f4c0 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 29 2c  E_INT_TO_PTR(n),
2f4d0 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20   P4_INT32);.    
2f4e0 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70      assert( n<=p
2f4f0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
2f500 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
2f510 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61 62        sqlite3Tab
2f520 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69  leLock(pParse, i
2f530 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20  Db, pTab->tnum, 
2f540 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  0, pTab->zName);
2f550 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
2f560 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d  QLITE_OMIT_AUTOM
2f570 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 69  ATIC_INDEX.    i
2f580 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
2f590 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2f5a0 5f 54 45 4d 50 5f 49 4e 44 45 58 29 21 3d 30 20  _TEMP_INDEX)!=0 
2f5b0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 72 75  ){.      constru
2f5c0 63 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78  ctAutomaticIndex
2f5d0 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54  (pParse, pWC, pT
2f5e0 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79  abItem, notReady
2f5f0 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  , pLevel);.    }
2f600 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
2f610 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
2f620 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
2f630 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
2f640 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
2f650 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
2f660 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b  .u.pIdx;.      K
2f670 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
2f680 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
2f690 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
2f6a0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43  .      int iIdxC
2f6b0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
2f6c0 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
2f6d0 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
2f6e0 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
2f6f0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2f700 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20   iIdxCur>=0 );. 
2f710 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
2f720 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
2f730 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
2f740 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
2f750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f760 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
2f770 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
2f780 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
2f790 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
2f7a0 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
2f7b0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
2f7c0 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
2f7d0 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
2f7e0 62 29 3b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79  b);.    notReady
2f7f0 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57 43   &= ~getMask(pWC
2f800 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  ->pMaskSet, pTab
2f810 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2f820 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
2f830 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
2f840 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
2f850 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2f860 46 61 69 6c 65 64 20 29 20 67 6f 74 6f 20 77 68  Failed ) goto wh
2f870 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 0a  ereBeginError;..
2f880 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
2f890 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
2f8a0 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
2f8b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
2f8c0 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
2f8d0 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
2f8e0 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
2f8f0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
2f900 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
2f910 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
2f920 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
2f930 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2f940 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a  nTabList; i++){.
2f950 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57      pLevel = &pW
2f960 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  Info->a[i];.    
2f970 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 70  explainOneScan(p
2f980 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2f990 20 70 4c 65 76 65 6c 2c 20 69 2c 20 70 4c 65 76   pLevel, i, pLev
2f9a0 65 6c 2d 3e 69 46 72 6f 6d 2c 20 77 63 74 72 6c  el->iFrom, wctrl
2f9b0 46 6c 61 67 73 29 3b 0a 20 20 20 20 6e 6f 74 52  Flags);.    notR
2f9c0 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e 65 4c 6f  eady = codeOneLo
2f9d0 6f 70 53 74 61 72 74 28 70 57 49 6e 66 6f 2c 20  opStart(pWInfo, 
2f9e0 69 2c 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 6e  i, wctrlFlags, n
2f9f0 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20 70 57  otReady);.    pW
2fa00 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
2fa10 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  = pLevel->addrCo
2fa20 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
2fa30 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
2fa40 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
2fa50 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
2fa60 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
2fa70 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
2fa80 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
2fa90 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
2faa0 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
2fab0 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
2fac0 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
2fad0 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
2fae0 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
2faf0 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
2fb00 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
2fb10 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
2fb20 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
2fb30 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
2fb40 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
2fb50 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
2fb60 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
2fb70 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
2fb80 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
2fb90 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  =0; i<nTabList; 
2fba0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
2fbb0 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  z;.    int n;.  
2fbc0 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
2fbd0 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54  fo->a[i];.    pT
2fbe0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
2fbf0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
2fc00 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54  rom];.    z = pT
2fc10 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a  abItem->zAlias;.
2fc20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
2fc30 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2fc40 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20  b->zName;.    n 
2fc50 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
2fc60 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  0(z);.    if( n+
2fc70 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
2fc80 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2fc90 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
2fca0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2fcb0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
2fcc0 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20  _IDX_ONLY ){.   
2fcd0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
2fce0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
2fcf0 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32  nQPlan], "{}", 2
2fd00 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
2fd10 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
2fd20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
2fd30 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
2fd40 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
2fd50 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20   z, n);.        
2fd60 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
2fd70 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
2fd80 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2fd90 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
2fda0 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73     }.    testcas
2fdb0 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  e( pLevel->plan.
2fdc0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2fdd0 52 4f 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20  ROWID_EQ );.    
2fde0 74 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c  testcase( pLevel
2fdf0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2fe00 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e   WHERE_ROWID_RAN
2fe10 47 45 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  GE );.    if( pL
2fe20 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
2fe30 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49  gs & (WHERE_ROWI
2fe40 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44  D_EQ|WHERE_ROWID
2fe50 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20  _RANGE) ){.     
2fe60 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2fe70 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2fe80 61 6e 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20  an], "* ", 2);. 
2fe90 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
2fea0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2feb0 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
2fec0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
2fed0 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
2fee0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
2fef0 72 6c 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70  rlen30(pLevel->p
2ff00 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d  lan.u.pIdx->zNam
2ff10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
2ff20 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
2ff30 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
2ff40 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
2ff50 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
2ff60 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
2ff70 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  an], pLevel->pla
2ff80 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c  n.u.pIdx->zName,
2ff90 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   n);.        nQP
2ffa0 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
2ffb0 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
2ffc0 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d  plan[nQPlan++] =
2ffd0 20 27 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ' ';.      }.  
2ffe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2fff0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
30000 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
30010 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20  ], "{} ", 3);.  
30020 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b      nQPlan += 3;
30030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
30040 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
30050 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
30060 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
30070 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
30080 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
30090 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
300a0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
300b0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
300c0 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
300d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
300e0 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20  TEST // Testing 
300f0 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
30100 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  e only */..  /* 
30110 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69  Record the conti
30120 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20  nuation address 
30130 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  in the WhereInfo
30140 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
30150 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20  n.  ** clean up 
30160 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
30170 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
30180 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
30190 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
301a0 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45  s */.whereBeginE
301b0 72 72 6f 72 3a 0a 20 20 69 66 28 20 70 57 49 6e  rror:.  if( pWIn
301c0 66 6f 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  fo ){.    pParse
301d0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70  ->nQueryLoop = p
301e0 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65  WInfo->savedNQue
301f0 72 79 4c 6f 6f 70 3b 0a 20 20 20 20 77 68 65 72  ryLoop;.    wher
30200 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70 57  eInfoFree(db, pW
30210 49 6e 66 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Info);.  }.  ret
30220 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
30230 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64  Generate the end
30240 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f   of the WHERE lo
30250 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74  op.  See comment
30260 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s on .** sqlite3
30270 57 68 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72  WhereBegin() for
30280 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
30290 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  rmation..*/.void
302a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
302b0 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
302c0 66 6f 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50  fo){.  Parse *pP
302d0 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  arse = pWInfo->p
302e0 50 61 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76  Parse;.  Vdbe *v
302f0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
30300 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65  ;.  int i;.  Whe
30310 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b  reLevel *pLevel;
30320 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
30330 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  List = pWInfo->p
30340 54 61 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74  TabList;.  sqlit
30350 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
30360 3e 64 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  >db;..  /* Gener
30370 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61  ate loop termina
30380 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  tion code..  */.
30390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
303a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
303b0 0a 20 20 66 6f 72 28 69 3d 70 57 49 6e 66 6f 2d  .  for(i=pWInfo-
303c0 3e 6e 4c 65 76 65 6c 2d 31 3b 20 69 3e 3d 30 3b  >nLevel-1; i>=0;
303d0 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
303e0 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
303f0 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
30400 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
30410 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f  , pLevel->addrCo
30420 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  nt);.    if( pLe
30430 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70  vel->op!=OP_Noop
30440 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
30450 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70  3VdbeAddOp2(v, p
30460 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65  Level->op, pLeve
30470 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70  l->p1, pLevel->p
30480 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
30490 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
304a0 20 70 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20   pLevel->p5);.  
304b0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
304c0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
304d0 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
304e0 20 26 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e   && pLevel->u.in
304f0 2e 6e 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  .nIn>0 ){.      
30500 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70  struct InLoop *p
30510 49 6e 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  In;.      int j;
30520 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
30530 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
30540 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  , pLevel->addrNx
30550 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
30560 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e  pLevel->u.in.nIn
30570 2c 20 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75  , pIn=&pLevel->u
30580 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d  .in.aInLoop[j-1]
30590 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d  ; j>0; j--, pIn-
305a0 2d 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  -){.        sqli
305b0 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
305c0 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f  v, pIn->addrInTo
305d0 70 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71  p+1);.        sq
305e0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
305f0 76 2c 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d  v, OP_Next, pIn-
30600 3e 69 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72  >iCur, pIn->addr
30610 49 6e 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20  InTop);.        
30620 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
30630 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72  ere(v, pIn->addr
30640 49 6e 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20  InTop-1);.      
30650 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  }.      sqlite3D
30660 62 46 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c  bFree(db, pLevel
30670 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b  ->u.in.aInLoop);
30680 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
30690 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
306a0 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  el(v, pLevel->ad
306b0 64 72 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  drBrk);.    if( 
306c0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
306d0 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  n ){.      int a
306e0 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ddr;.      addr 
306f0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
30700 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c  Op1(v, OP_IfPos,
30710 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
30720 69 6e 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  in);.      asser
30730 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  t( (pLevel->plan
30740 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
30750 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20  _IDX_ONLY)==0.  
30760 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 4c 65           || (pLe
30770 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
30780 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
30790 44 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  D)!=0 );.      i
307a0 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
307b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
307c0 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
307d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
307e0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
307f0 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
30800 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
30810 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30820 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
30830 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
30840 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30850 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
30860 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
30870 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
30880 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
30890 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
308a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
308b0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
308c0 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
308d0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
308e0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
308f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
30900 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
30910 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
30920 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
30930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30940 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
30950 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
30960 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
30970 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
30980 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
30990 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
309a0 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
309b0 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
309c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
309d0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
309e0 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
309f0 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
30a00 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
30a10 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
30a20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
30a30 69 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  in..  */.  asser
30a40 74 28 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  t( pWInfo->nLeve
30a50 6c 3d 3d 31 20 7c 7c 20 70 57 49 6e 66 6f 2d 3e  l==1 || pWInfo->
30a60 6e 4c 65 76 65 6c 3d 3d 70 54 61 62 4c 69 73 74  nLevel==pTabList
30a70 2d 3e 6e 53 72 63 20 29 3b 0a 20 20 66 6f 72 28  ->nSrc );.  for(
30a80 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  i=0, pLevel=pWIn
30a90 66 6f 2d 3e 61 3b 20 69 3c 70 57 49 6e 66 6f 2d  fo->a; i<pWInfo-
30aa0 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 2c 20 70 4c  >nLevel; i++, pL
30ab0 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72  evel++){.    str
30ac0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
30ad0 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54   *pTabItem = &pT
30ae0 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c  abList->a[pLevel
30af0 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61  ->iFrom];.    Ta
30b00 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62  ble *pTab = pTab
30b10 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
30b20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
30b30 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
30b40 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
30b50 45 70 68 65 6d 65 72 61 6c 29 3d 3d 30 0a 20 20  Ephemeral)==0.  
30b60 20 20 20 26 26 20 70 54 61 62 2d 3e 70 53 65 6c     && pTab->pSel
30b70 65 63 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 28  ect==0.     && (
30b80 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61  pWInfo->wctrlFla
30b90 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49 54 5f  gs & WHERE_OMIT_
30ba0 43 4c 4f 53 45 29 3d 3d 30 0a 20 20 20 20 29 7b  CLOSE)==0.    ){
30bb0 0a 20 20 20 20 20 20 69 6e 74 20 77 73 20 3d 20  .      int ws = 
30bc0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
30bd0 6c 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20  lags;.      if( 
30be0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
30bf0 73 73 20 26 26 20 28 77 73 20 26 20 57 48 45 52  ss && (ws & WHER
30c00 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
30c10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
30c20 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
30c30 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74 65  P_Close, pTabIte
30c40 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
30c50 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
30c60 77 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58  ws & WHERE_INDEX
30c70 45 44 29 21 3d 30 20 26 26 20 28 77 73 20 26 20  ED)!=0 && (ws & 
30c80 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58  WHERE_TEMP_INDEX
30c90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30ca0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30cb0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
30cc0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
30cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
30ce0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
30cf0 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
30d00 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
30d10 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
30d20 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
30d30 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
30d40 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
30d50 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
30d60 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
30d70 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
30d80 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
30d90 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
30da0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
30db0 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
30dc0 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
30dd0 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
30de0 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
30df0 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
30e00 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
30e10 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
30e20 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
30e30 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
30e40 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
30e50 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
30e60 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
30e70 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
30e80 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
30e90 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
30ea0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
30eb0 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
30ec0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
30ed0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
30ee0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
30ef0 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
30f00 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
30f10 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
30f20 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
30f30 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
30f40 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
30f50 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
30f60 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
30f70 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
30f80 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
30f90 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
30fa0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
30fb0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
30fc0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
30fd0 58 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d 3e  XED)!=0 && !db->
30fe0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20  mallocFailed){. 
30ff0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
31000 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
31010 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
31020 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
31030 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
31040 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
31050 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
31060 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
31070 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66  beGetOp(v, pWInf
31080 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  o->iTop);.      
31090 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
310a0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
310b0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57  ;.      for(k=pW
310c0 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61  Info->iTop; k<la
310d0 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
310e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
310f0 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
31100 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
31110 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
31120 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
31130 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
31140 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
31150 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
31160 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
31170 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
31180 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
311a0 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
311b0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
311c0 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
311d0 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur;.            
311e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
311f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31200 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
31210 65 72 74 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  ert( (pLevel->pl
31220 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
31230 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a  RE_IDX_ONLY)==0.
31240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
31250 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  | j<pIdx->nColum
31260 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n );.        }el
31270 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
31280 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a  de==OP_Rowid ){.
31290 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70            pOp->p
312a0 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  1 = pLevel->iIdx
312b0 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Cur;.          p
312c0 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f  Op->opcode = OP_
312d0 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  IdxRowid;.      
312e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
312f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
31300 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
31310 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
31320 6f 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61  oop = pWInfo->sa
31330 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  vedNQueryLoop;. 
31340 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
31350 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
31360 74 75 72 6e 3b 0a 7d 0a                          turn;.}.