/ Hex Artifact Content
Login

Artifact b641d399cfd8588d0e20d9790d1582b663a732a8:


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 20 3d 20 70 53 2d 3e 70 53 72   *pSrc = pS->pSr
4760: 63 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  c;.    mask |= e
4770: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
4780: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4790: 70 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73  pEList);.    mas
47a0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
47b0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
47c0: 2c 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b  , pS->pGroupBy);
47d0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
47e0: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
47f0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f  pMaskSet, pS->pO
4800: 72 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73  rderBy);.    mas
4810: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4820: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4830: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d  ->pWhere);.    m
4840: 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65  ask |= exprTable
4850: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
4860: 70 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  pS->pHaving);.  
4870: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 53 72    if( ALWAYS(pSr
4880: 63 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69  c!=0) ){.      i
4890: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
48a0: 69 3d 30 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72  i=0; i<pSrc->nSr
48b0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  c; i++){.       
48c0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c   mask |= exprSel
48d0: 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  ectTableUsage(pM
48e0: 61 73 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b  askSet, pSrc->a[
48f0: 69 5d 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  i].pSelect);.   
4900: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
4910: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
4920: 6b 53 65 74 2c 20 70 53 72 63 2d 3e 61 5b 69 5d  kSet, pSrc->a[i]
4930: 2e 70 4f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  .pOn);.      }. 
4940: 20 20 20 7d 0a 20 20 20 20 70 53 20 3d 20 70 53     }.    pS = pS
4950: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20  ->pPrior;.  }.  
4960: 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a  return mask;.}..
4970: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
4980: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f  E if the given o
4990: 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f  perator is one o
49a0: 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  f the operators 
49b0: 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77  that is.** allow
49c0: 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61  ed for an indexa
49d0: 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ble WHERE clause
49e0: 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f   term.  The allo
49f0: 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72  wed operators ar
4a00: 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22  e.** "=", "<", "
4a10: 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20  >", "<=", ">=", 
4a20: 61 6e 64 20 22 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  and "IN"..**.** 
4a30: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
4a40: 46 3a 20 52 2d 35 39 39 32 36 2d 32 36 33 39 33  F: R-59926-26393
4a50: 20 54 6f 20 62 65 20 75 73 61 62 6c 65 20 62 79   To be usable by
4a60: 20 61 6e 20 69 6e 64 65 78 20 61 20 74 65 72 6d   an index a term
4a70: 20 6d 75 73 74 20 62 65 0a 2a 2a 20 6f 66 20 6f   must be.** of o
4a80: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
4a90: 69 6e 67 20 66 6f 72 6d 73 3a 20 63 6f 6c 75 6d  ing forms: colum
4aa0: 6e 20 3d 20 65 78 70 72 65 73 73 69 6f 6e 20 63  n = expression c
4ab0: 6f 6c 75 6d 6e 20 3e 20 65 78 70 72 65 73 73 69  olumn > expressi
4ac0: 6f 6e 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 3e 3d 20  on.** column >= 
4ad0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6c 75 6d  expression colum
4ae0: 6e 20 3c 20 65 78 70 72 65 73 73 69 6f 6e 20 63  n < expression c
4af0: 6f 6c 75 6d 6e 20 3c 3d 20 65 78 70 72 65 73 73  olumn <= express
4b00: 69 6f 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ion.** expressio
4b10: 6e 20 3d 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  n = column expre
4b20: 73 73 69 6f 6e 20 3e 20 63 6f 6c 75 6d 6e 20 65  ssion > column e
4b30: 78 70 72 65 73 73 69 6f 6e 20 3e 3d 20 63 6f 6c  xpression >= col
4b40: 75 6d 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  umn.** expressio
4b50: 6e 20 3c 20 63 6f 6c 75 6d 6e 20 65 78 70 72 65  n < column expre
4b60: 73 73 69 6f 6e 20 3c 3d 20 63 6f 6c 75 6d 6e 20  ssion <= column 
4b70: 63 6f 6c 75 6d 6e 20 49 4e 0a 2a 2a 20 28 65 78  column IN.** (ex
4b80: 70 72 65 73 73 69 6f 6e 2d 6c 69 73 74 29 20 63  pression-list) c
4b90: 6f 6c 75 6d 6e 20 49 4e 20 28 73 75 62 71 75 65  olumn IN (subque
4ba0: 72 79 29 20 63 6f 6c 75 6d 6e 20 49 53 20 4e 55  ry) column IS NU
4bb0: 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  LL.*/.static int
4bc0: 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f   allowedOp(int o
4bd0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b  p){.  assert( TK
4be0: 5f 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _GT>TK_EQ && TK_
4bf0: 47 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  GT<TK_GE );.  as
4c00: 73 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45  sert( TK_LT>TK_E
4c10: 51 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45  Q && TK_LT<TK_GE
4c20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b   );.  assert( TK
4c30: 5f 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f  _LE>TK_EQ && TK_
4c40: 4c 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73  LE<TK_GE );.  as
4c50: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
4c60: 45 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e  EQ+4 );.  return
4c70: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f   op==TK_IN || (o
4c80: 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d  p>=TK_EQ && op<=
4c90: 54 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b  TK_GE) || op==TK
4ca0: 5f 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a  _ISNULL;.}../*.*
4cb0: 2a 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63  * Swap two objec
4cc0: 74 73 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e  ts of type TYPE.
4cd0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .*/.#define SWAP
4ce0: 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45  (TYPE,A,B) {TYPE
4cf0: 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d   t=A; A=B; B=t;}
4d00: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20  ../*.** Commute 
4d10: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
4d20: 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69  rator.  Expressi
4d30: 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ons of the form 
4d40: 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20  "X op Y".** are 
4d50: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22  converted into "
4d60: 59 20 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49  Y op X"..**.** I
4d70: 66 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  f a collation se
4d80: 71 75 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69  quence is associ
4d90: 61 74 65 64 20 77 69 74 68 20 65 69 74 68 65 72  ated with either
4da0: 20 74 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67   the left or rig
4db0: 68 74 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68  ht.** side of th
4dc0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74  e comparison, it
4dd0: 20 72 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61   remains associa
4de0: 74 65 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  ted with the sam
4df0: 65 20 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20  e side after.** 
4e00: 74 68 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e  the commutation.
4e10: 20 53 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e   So "Y collate N
4e20: 4f 43 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f  OCASE op X" beco
4e30: 6d 65 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61  mes .** "X colla
4e40: 74 65 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e  te NOCASE op Y".
4e50: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
4e60: 20 61 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   any collation s
4e70: 65 71 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68  equence on.** th
4e80: 65 20 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65  e left hand side
4e90: 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   of a comparison
4ea0: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 63   overrides any c
4eb0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
4ec0: 65 20 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74  e .** attached t
4ed0: 6f 20 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72  o the right. For
4ee0: 20 74 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e   the same reason
4ef0: 20 74 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61   the EP_ExpColla
4f00: 74 65 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f  te flag.** is no
4f10: 74 20 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73  t commuted..*/.s
4f20: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43  tatic void exprC
4f30: 6f 6d 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50  ommute(Parse *pP
4f40: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
4f50: 72 29 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67  r){.  u16 expRig
4f60: 68 74 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69  ht = (pExpr->pRi
4f70: 67 68 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ght->flags & EP_
4f80: 45 78 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75  ExpCollate);.  u
4f90: 31 36 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45  16 expLeft = (pE
4fa0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4fb0: 73 20 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74  s & EP_ExpCollat
4fc0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  e);.  assert( al
4fd0: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
4fe0: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
4ff0: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70  =TK_IN );.  pExp
5000: 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c  r->pRight->pColl
5010: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
5020: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
5030: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
5040: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43  pExpr->pLeft->pC
5050: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5060: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5070: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
5080: 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c    SWAP(CollSeq*,
5090: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70  pExpr->pRight->p
50a0: 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66  Coll,pExpr->pLef
50b0: 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78  t->pColl);.  pEx
50c0: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
50d0: 73 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67  s = (pExpr->pRig
50e0: 68 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f  ht->flags & ~EP_
50f0: 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78  ExpCollate) | ex
5100: 70 4c 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e  pLeft;.  pExpr->
5110: 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28  pLeft->flags = (
5120: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c  pExpr->pLeft->fl
5130: 61 67 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c  ags & ~EP_ExpCol
5140: 6c 61 74 65 29 20 7c 20 65 78 70 52 69 67 68 74  late) | expRight
5150: 3b 0a 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70  ;.  SWAP(Expr*,p
5160: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78  Expr->pRight,pEx
5170: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66  pr->pLeft);.  if
5180: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
5190: 47 54 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  GT ){.    assert
51a0: 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
51b0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
51c0: 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29  TK_GE==TK_LE+2 )
51d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
51e0: 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20  _GT>TK_EQ );.   
51f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54   assert( TK_GT<T
5200: 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65  K_LE );.    asse
5210: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  rt( pExpr->op>=T
5220: 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f  K_GT && pExpr->o
5230: 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p<=TK_GE );.    
5240: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45  pExpr->op = ((pE
5250: 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32  xpr->op-TK_GT)^2
5260: 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a  )+TK_GT;.  }.}..
5270: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
5280: 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61  from TK_xx opera
5290: 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74  tor to WO_xx bit
52a0: 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mask..*/.static 
52b0: 75 31 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  u16 operatorMask
52c0: 28 69 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20  (int op){.  u16 
52d0: 63 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c  c;.  assert( all
52e0: 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20  owedOp(op) );.  
52f0: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b  if( op==TK_IN ){
5300: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a  .    c = WO_IN;.
5310: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
5320: 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20  TK_ISNULL ){.   
5330: 20 63 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a   c = WO_ISNULL;.
5340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
5350: 65 72 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70  ert( (WO_EQ<<(op
5360: 2d 54 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66  -TK_EQ)) < 0x7ff
5370: 66 20 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31  f );.    c = (u1
5380: 36 29 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b  6)(WO_EQ<<(op-TK
5390: 5f 45 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73  _EQ));.  }.  ass
53a0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55  ert( op!=TK_ISNU
53b0: 4c 4c 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55  LL || c==WO_ISNU
53c0: 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  LL );.  assert( 
53d0: 6f 70 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d  op!=TK_IN || c==
53e0: 57 4f 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72  WO_IN );.  asser
53f0: 74 28 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20  t( op!=TK_EQ || 
5400: 63 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73  c==WO_EQ );.  as
5410: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20  sert( op!=TK_LT 
5420: 7c 7c 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20  || c==WO_LT );. 
5430: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
5440: 4c 45 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29  LE || c==WO_LE )
5450: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d  ;.  assert( op!=
5460: 54 4b 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47  TK_GT || c==WO_G
5470: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  T );.  assert( o
5480: 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57  p!=TK_GE || c==W
5490: 4f 5f 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  O_GE );.  return
54a0: 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61   c;.}../*.** Sea
54b0: 72 63 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69  rch for a term i
54c0: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
54d0: 73 65 20 74 68 61 74 20 69 73 20 6f 66 20 74 68  se that is of th
54e0: 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c  e form "X <op> <
54f0: 65 78 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20  expr>".** where 
5500: 58 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  X is a reference
5510: 20 74 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20   to the iColumn 
5520: 6f 66 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e  of table iCur an
5530: 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  d <op> is one of
5540: 0a 2a 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70  .** the WO_xx op
5550: 65 72 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65  erator codes spe
5560: 63 69 66 69 65 64 20 62 79 20 74 68 65 20 6f 70  cified by the op
5570: 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52   parameter..** R
5580: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
5590: 74 6f 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65  to the term.  Re
55a0: 74 75 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f  turn 0 if not fo
55b0: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57  und..*/.static W
55c0: 68 65 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65  hereTerm *findTe
55d0: 72 6d 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73  rm(.  WhereClaus
55e0: 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
55f0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5600: 74 6f 20 62 65 20 73 65 61 72 63 68 65 64 20 2a  to be searched *
5610: 2f 0a 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20  /.  int iCur,   
5620: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5630: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48  sor number of LH
5640: 53 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75  S */.  int iColu
5650: 6d 6e 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  mn,          /* 
5660: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
5670: 20 4c 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73   LHS */.  Bitmas
5680: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
5690: 2f 2a 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20  /* RHS must not 
56a0: 6f 76 65 72 6c 61 70 20 77 69 74 68 20 74 68 69  overlap with thi
56b0: 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20  s mask */.  u32 
56c0: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
56d0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f    /* Mask of WO_
56e0: 78 78 20 76 61 6c 75 65 73 20 64 65 73 63 72 69  xx values descri
56f0: 62 69 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f  bing operator */
5700: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20  .  Index *pIdx  
5710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74           /* Must
5720: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
5730: 69 74 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20  ith this index, 
5740: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
5750: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
5760: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20  Term;.  int k;. 
5770: 20 61 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30   assert( iCur>=0
5780: 20 29 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41   );.  op &= WO_A
5790: 4c 4c 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d  LL;.  for(pTerm=
57a0: 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
57b0: 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54  Term; k; k--, pT
57c0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
57d0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
57e0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26  r==iCur.       &
57f0: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
5800: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
5810: 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
5820: 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
5830: 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20  mn==iColumn.    
5840: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f     && (pTerm->eO
5850: 70 65 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30  perator & op)!=0
5860: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
5870: 28 20 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d  ( pIdx && pTerm-
5880: 3e 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49  >eOperator!=WO_I
5890: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
58a0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
58b0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
58c0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
58d0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69  ;.        char i
58e0: 64 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69  dxaff;.        i
58f0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61  nt j;.        Pa
5900: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57  rse *pParse = pW
5910: 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20  C->pParse;..    
5920: 20 20 20 20 69 64 78 61 66 66 20 3d 20 70 49 64      idxaff = pId
5930: 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b  x->pTable->aCol[
5940: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
5950: 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  y;.        if( !
5960: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
5970: 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66  nityOk(pX, idxaf
5980: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  f) ) continue;..
5990: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72          /* Figur
59a0: 65 20 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74  e out the collat
59b0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71  ion sequence req
59c0: 75 69 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e  uired from an in
59d0: 64 65 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20  dex for.        
59e0: 2a 2a 20 69 74 20 74 6f 20 62 65 20 75 73 65 66  ** it to be usef
59f0: 75 6c 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e  ul for optimisin
5a00: 67 20 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e  g expression pX.
5a10: 20 53 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20   Store this.    
5a20: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20      ** value in 
5a30: 76 61 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a  variable pColl..
5a40: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
5a50: 20 20 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c     assert(pX->pL
5a60: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43  eft);.        pC
5a70: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e  oll = sqlite3Bin
5a80: 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65  aryCompareCollSe
5a90: 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c  q(pParse, pX->pL
5aa0: 65 66 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  eft, pX->pRight)
5ab0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5ac0: 28 70 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65  (pColl || pParse
5ad0: 2d 3e 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20  ->nErr);..      
5ae0: 20 20 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d    for(j=0; pIdx-
5af0: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43  >aiColumn[j]!=iC
5b00: 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  olumn; j++){.   
5b10: 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45 52         if( NEVER
5b20: 28 6a 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  (j>=pIdx->nColum
5b30: 6e 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  n) ) return 0;. 
5b40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5b50: 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71   if( pColl && sq
5b60: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
5b70: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
5b80: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
5b90: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
5ba0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65        return pTe
5bb0: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rm;.    }.  }.  
5bc0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
5bd0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
5be0: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
5bf0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63   exprAnalyze(Src
5c00: 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75  List*, WhereClau
5c10: 73 65 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  se*, int);../*.*
5c20: 2a 20 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79  * Call exprAnaly
5c30: 7a 65 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20  ze on all terms 
5c40: 69 6e 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  in a WHERE claus
5c50: 65 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74  e.  .**.**.*/.st
5c60: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e  atic void exprAn
5c70: 61 6c 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c  alyzeAll(.  SrcL
5c80: 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
5c90: 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d       /* the FROM
5ca0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
5cb0: 72 65 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20  reClause *pWC   
5cc0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
5cd0: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
5ce0: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
5cf0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
5d00: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  pWC->nTerm-1; i>
5d10: 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78  =0; i--){.    ex
5d20: 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69  prAnalyze(pTabLi
5d30: 73 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d  st, pWC, i);.  }
5d40: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
5d50: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
5d60: 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
5d70: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
5d80: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
5d90: 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f  sion is a LIKE o
5da0: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
5db0: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  that.** can be o
5dc0: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69  ptimized using i
5dd0: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
5de0: 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54  aints.  Return T
5df0: 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  RUE if it is.** 
5e00: 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  so and false if 
5e10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  not..**.** In or
5e20: 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72  der for the oper
5e30: 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d  ator to be optim
5e40: 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20  izible, the RHS 
5e50: 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67  must be a string
5e60: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74  .** literal that
5e70: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
5e80: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e  with a wildcard.
5e90: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
5ea0: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
5eb0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5ec0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e     /* Parsing an
5ed0: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
5ee0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
5ef0: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
5f00: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
5f10: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78  pression */.  Ex
5f20: 70 72 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20  pr **ppPrefix,  
5f30: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b  /* Pointer to TK
5f40: 5f 53 54 52 49 4e 47 20 65 78 70 72 65 73 73 69  _STRING expressi
5f50: 6f 6e 20 77 69 74 68 20 70 61 74 74 65 72 6e 20  on with pattern 
5f60: 70 72 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20  prefix */.  int 
5f70: 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a  *pisComplete, /*
5f80: 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c   True if the onl
5f90: 79 20 77 69 6c 64 63 61 72 64 20 69 73 20 25 20  y wildcard is % 
5fa0: 69 6e 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  in the last char
5fb0: 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a  acter */.  int *
5fc0: 70 6e 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20  pnoCase      /* 
5fd0: 54 72 75 65 20 69 66 20 75 70 70 65 72 63 61 73  True if uppercas
5fe0: 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  e is equivalent 
5ff0: 74 6f 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a  to lowercase */.
6000: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6010: 2a 7a 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  *z = 0;         
6020: 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53  /* String on RHS
6030: 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f   of LIKE operato
6040: 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69  r */.  Expr *pRi
6050: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20  ght, *pLeft;    
6060: 20 20 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c    /* Right and l
6070: 65 66 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45  eft size of LIKE
6080: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45   operator */.  E
6090: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20  xprList *pList; 
60a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
60b0: 74 20 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f  t of operands to
60c0: 20 74 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74   the LIKE operat
60d0: 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20  or */.  int c;  
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63     /* One charac
6100: 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20  ter in z[] */.  
6110: 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20  int cnt;        
6120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
6130: 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64  mber of non-wild
6140: 63 61 72 64 20 70 72 65 66 69 78 20 63 68 61 72  card prefix char
6150: 61 63 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72  acters */.  char
6160: 20 77 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20   wc[3];         
6170: 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61         /* Wildca
6180: 72 64 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f  rd characters */
6190: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
61a0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
61b0: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
61c0: 74 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tion */.  sqlite
61d0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20  3_value *pVal = 
61e0: 30 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20  0;.  int op;    
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 2f 2a 20 4f 70 63 6f 64 65 20 6f 66 20 70 52 69  /* Opcode of pRi
6210: 67 68 74 20 2a 2f 0a 0a 20 20 69 66 28 20 21 73  ght */..  if( !s
6220: 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63  qlite3IsLikeFunc
6230: 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20  tion(db, pExpr, 
6240: 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a  pnoCase, wc) ){.
6250: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6260: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
6270: 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70 6e  EBCDIC.  if( *pn
6280: 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20 30  oCase ) return 0
6290: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73 74  ;.#endif.  pList
62a0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
62b0: 74 3b 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69  t;.  pLeft = pLi
62c0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
62d0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21    if( pLeft->op!
62e0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 73 71  =TK_COLUMN || sq
62f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
6300: 79 28 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45  y(pLeft)!=SQLITE
6310: 5f 41 46 46 5f 54 45 58 54 20 29 7b 0a 20 20 20  _AFF_TEXT ){.   
6320: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 32 30 36 35   /* IMP: R-02065
6330: 2d 34 39 34 36 35 20 54 68 65 20 6c 65 66 74 2d  -49465 The left-
6340: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
6350: 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70   LIKE or GLOB op
6360: 65 72 61 74 6f 72 20 6d 75 73 74 0a 20 20 20 20  erator must.    
6370: 2a 2a 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f  ** be the name o
6380: 66 20 61 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c  f an indexed col
6390: 75 6d 6e 20 77 69 74 68 20 54 45 58 54 20 61 66  umn with TEXT af
63a0: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
63b0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61  eturn 0;.  }.  a
63c0: 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e 69 43  ssert( pLeft->iC
63d0: 6f 6c 75 6d 6e 21 3d 28 2d 31 29 20 29 3b 20 2f  olumn!=(-1) ); /
63e0: 2a 20 42 65 63 61 75 73 65 20 49 50 4b 20 6e 65  * Because IPK ne
63f0: 76 65 72 20 68 61 73 20 41 46 46 5f 54 45 58 54  ver has AFF_TEXT
6400: 20 2a 2f 0a 0a 20 20 70 52 69 67 68 74 20 3d 20   */..  pRight = 
6410: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
6420: 72 3b 0a 20 20 6f 70 20 3d 20 70 52 69 67 68 74  r;.  op = pRight
6430: 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  ->op;.  if( op==
6440: 54 4b 5f 52 45 47 49 53 54 45 52 20 29 7b 0a 20  TK_REGISTER ){. 
6450: 20 20 20 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e     op = pRight->
6460: 6f 70 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  op2;.  }.  if( o
6470: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
6480: 7b 0a 20 20 20 20 56 64 62 65 20 2a 70 52 65 70  {.    Vdbe *pRep
6490: 72 65 70 61 72 65 20 3d 20 70 50 61 72 73 65 2d  repare = pParse-
64a0: 3e 70 52 65 70 72 65 70 61 72 65 3b 0a 20 20 20  >pReprepare;.   
64b0: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 70 52 69 67   int iCol = pRig
64c0: 68 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ht->iColumn;.   
64d0: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
64e0: 64 62 65 47 65 74 56 61 6c 75 65 28 70 52 65 70  dbeGetValue(pRep
64f0: 72 65 70 61 72 65 2c 20 69 43 6f 6c 2c 20 53 51  repare, iCol, SQ
6500: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29 3b 0a  LITE_AFF_NONE);.
6510: 20 20 20 20 69 66 28 20 70 56 61 6c 20 26 26 20      if( pVal && 
6520: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79  sqlite3_value_ty
6530: 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54 45  pe(pVal)==SQLITE
6540: 5f 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 7a  _TEXT ){.      z
6550: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
6560: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 70 56  e3_value_text(pV
6570: 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  al);.    }.    s
6580: 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72  qlite3VdbeSetVar
6590: 6d 61 73 6b 28 70 50 61 72 73 65 2d 3e 70 56 64  mask(pParse->pVd
65a0: 62 65 2c 20 69 43 6f 6c 29 3b 20 2f 2a 20 49 4d  be, iCol); /* IM
65b0: 50 3a 20 52 2d 32 33 32 35 37 2d 30 32 37 37 38  P: R-23257-02778
65c0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
65d0: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 56  pRight->op==TK_V
65e0: 41 52 49 41 42 4c 45 20 7c 7c 20 70 52 69 67 68  ARIABLE || pRigh
65f0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54  t->op==TK_REGIST
6600: 45 52 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ER );.  }else if
6610: 28 20 6f 70 3d 3d 54 4b 5f 53 54 52 49 4e 47 20  ( op==TK_STRING 
6620: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 52 69 67 68  ){.    z = pRigh
6630: 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 7d  t->u.zToken;.  }
6640: 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20 20  .  if( z ){.    
6650: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  cnt = 0;.    whi
6660: 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d  le( (c=z[cnt])!=
6670: 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20 26 26  0 && c!=wc[0] &&
6680: 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d   c!=wc[1] && c!=
6690: 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20 20 20 63  wc[2] ){.      c
66a0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
66b0: 69 66 28 20 63 6e 74 21 3d 30 20 26 26 20 32 35  if( cnt!=0 && 25
66c0: 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5!=(u8)z[cnt-1] 
66d0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
66e0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70  Prefix;.      *p
66f0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 63 3d 3d  isComplete = c==
6700: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
6710: 5d 3d 3d 30 3b 0a 20 20 20 20 20 20 70 50 72 65  ]==0;.      pPre
6720: 66 69 78 20 3d 20 73 71 6c 69 74 65 33 45 78 70  fix = sqlite3Exp
6730: 72 28 64 62 2c 20 54 4b 5f 53 54 52 49 4e 47 2c  r(db, TK_STRING,
6740: 20 7a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   z);.      if( p
6750: 50 72 65 66 69 78 20 29 20 70 50 72 65 66 69 78  Prefix ) pPrefix
6760: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 63 6e 74 5d 20  ->u.zToken[cnt] 
6770: 3d 20 30 3b 0a 20 20 20 20 20 20 2a 70 70 50 72  = 0;.      *ppPr
6780: 65 66 69 78 20 3d 20 70 50 72 65 66 69 78 3b 0a  efix = pPrefix;.
6790: 20 20 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b        if( op==TK
67a0: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
67b0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70       Vdbe *v = p
67c0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
67d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
67e0: 65 53 65 74 56 61 72 6d 61 73 6b 28 76 2c 20 70  eSetVarmask(v, p
67f0: 52 69 67 68 74 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  Right->iColumn);
6800: 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35 37   /* IMP: R-23257
6810: 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 20 20  -02778 */.      
6820: 20 20 69 66 28 20 2a 70 69 73 43 6f 6d 70 6c 65    if( *pisComple
6830: 74 65 20 26 26 20 70 52 69 67 68 74 2d 3e 75 2e  te && pRight->u.
6840: 7a 54 6f 6b 65 6e 5b 31 5d 20 29 7b 0a 20 20 20  zToken[1] ){.   
6850: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
6860: 20 72 68 73 20 6f 66 20 74 68 65 20 4c 49 4b 45   rhs of the LIKE
6870: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61   expression is a
6880: 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 74   variable, and t
6890: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
68a0: 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66       ** value of
68b0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6d 65   the variable me
68c0: 61 6e 73 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ans there is no 
68d0: 6e 65 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20 74  need to invoke t
68e0: 68 65 20 4c 49 4b 45 0a 20 20 20 20 20 20 20 20  he LIKE.        
68f0: 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2c 20 74    ** function, t
6900: 68 65 6e 20 6e 6f 20 4f 50 5f 56 61 72 69 61 62  hen no OP_Variab
6910: 6c 65 20 77 69 6c 6c 20 62 65 20 61 64 64 65 64  le will be added
6920: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
6930: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68  .          ** Th
6940: 69 73 20 63 61 75 73 65 73 20 70 72 6f 62 6c 65  is causes proble
6950: 6d 73 20 66 6f 72 20 74 68 65 20 73 71 6c 69 74  ms for the sqlit
6960: 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
6970: 72 5f 6e 61 6d 65 28 29 0a 20 20 20 20 20 20 20  r_name().       
6980: 20 20 20 2a 2a 20 41 50 49 2e 20 54 6f 20 77 6f     ** API. To wo
6990: 72 6b 61 72 6f 75 6e 64 20 74 68 65 6d 2c 20 61  rkaround them, a
69a0: 64 64 20 61 20 64 75 6d 6d 79 20 4f 50 5f 56 61  dd a dummy OP_Va
69b0: 72 69 61 62 6c 65 20 68 65 72 65 2e 0a 20 20 20  riable here..   
69c0: 20 20 20 20 20 20 20 2a 2f 20 0a 20 20 20 20 20         */ .     
69d0: 20 20 20 20 20 69 6e 74 20 72 31 20 3d 20 73 71       int r1 = sq
69e0: 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
69f0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
6a00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6a10: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
6a20: 20 70 52 69 67 68 74 2c 20 72 31 29 3b 0a 20 20   pRight, r1);.  
6a30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6a40: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 73  dbeChangeP3(v, s
6a50: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
6a60: 74 41 64 64 72 28 76 29 2d 31 2c 20 30 29 3b 0a  tAddr(v)-1, 0);.
6a70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6a80: 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
6a90: 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20  pParse, r1);.   
6aa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6ab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6ac0: 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  z = 0;.    }.  }
6ad0: 0a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ..  sqlite3Value
6ae0: 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72 65  Free(pVal);.  re
6af0: 74 75 72 6e 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23  turn (z!=0);.}.#
6b00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6b10: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
6b20: 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e  ZATION */...#ifn
6b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6b40: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
6b50: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  ** Check to see 
6b60: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
6b70: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
6b80: 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20  e form.**.**    
6b90: 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43       column MATC
6ba0: 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20  H expr.**.** If 
6bb0: 69 74 20 69 73 20 74 68 65 6e 20 72 65 74 75 72  it is then retur
6bc0: 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f 74 2c  n TRUE.  If not,
6bd0: 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e 0a 2a   return FALSE..*
6be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4d  /.static int isM
6bf0: 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20  atchOfColumn(.  
6c00: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
6c10: 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20 65 78   /* Test this ex
6c20: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  pression */.){. 
6c30: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
6c40: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  ;..  if( pExpr->
6c50: 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20  op!=TK_FUNCTION 
6c60: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
6c70: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
6c80: 65 33 53 74 72 49 43 6d 70 28 70 45 78 70 72 2d  e3StrICmp(pExpr-
6c90: 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74 63 68  >u.zToken,"match
6ca0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ")!=0 ){.    ret
6cb0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69  urn 0;.  }.  pLi
6cc0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
6cd0: 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  ist;.  if( pList
6ce0: 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a 20 20  ->nExpr!=2 ){.  
6cf0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6d00: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 31    if( pList->a[1
6d10: 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d 20 54  ].pExpr->op != T
6d20: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
6d30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
6d40: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64  return 1;.}.#end
6d50: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
6d60: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
6d70: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  /../*.** If the 
6d80: 70 42 61 73 65 20 65 78 70 72 65 73 73 69 6f 6e  pBase expression
6d90: 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e 20 74   originated in t
6da0: 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47 20 63  he ON or USING c
6db0: 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f  lause of.** a jo
6dc0: 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  in, then transfe
6dd0: 72 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  r the appropriat
6de0: 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65 72 20  e markings over 
6df0: 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f 0a 73  to derived..*/.s
6e00: 74 61 74 69 63 20 76 6f 69 64 20 74 72 61 6e 73  tatic void trans
6e10: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
6e20: 45 78 70 72 20 2a 70 44 65 72 69 76 65 64 2c 20  Expr *pDerived, 
6e30: 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a 20 20  Expr *pBase){.  
6e40: 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67 73 20  pDerived->flags 
6e50: 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67 73 20  |= pBase->flags 
6e60: 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20  & EP_FromJoin;. 
6e70: 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69 67 68   pDerived->iRigh
6e80: 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70 42 61  tJoinTable = pBa
6e90: 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61  se->iRightJoinTa
6ea0: 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  ble;.}..#if !def
6eb0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
6ec0: 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
6ed0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
6ee0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
6ef0: 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  RY)./*.** Analyz
6f00: 65 20 61 20 74 65 72 6d 20 74 68 61 74 20 63 6f  e a term that co
6f10: 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20 6f 72  nsists of two or
6f20: 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65 63 74   more OR-connect
6f30: 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73 2e 20  ed.** subterms. 
6f40: 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20   So in:.**.**   
6f50: 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28 61 3d    ... WHERE  (a=
6f60: 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52 20 63  5) AND (b=7 OR c
6f70: 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e 44 20  =9 OR d=13) AND 
6f80: 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20 20 20  (d=13).**       
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fa0: 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e     ^^^^^^^^^^^^^
6fb0: 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68  ^^^^^^^.**.** Th
6fc0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79  is routine analy
6fd0: 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68 20 61  zes terms such a
6fe0: 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74 65 72  s the middle ter
6ff0: 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 65  m in the above e
7000: 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57 68 65  xample..** A Whe
7010: 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 20  reOrTerm object 
7020: 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e 64 20  is computed and 
7030: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
7040: 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20 61 6e  term under.** an
7050: 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64 6c 65  alysis, regardle
7060: 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f 6d  ss of the outcom
7070: 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79 73 69  e of the analysi
7080: 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a  s.  Hence:.**.**
7090: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 2e 77       WhereTerm.w
70a0: 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54 45 52  tFlags   |=  TER
70b0: 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20 20 20  M_ORINFO.**     
70c0: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
70d0: 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61 6d 69  nfo  =  a dynami
70e0: 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
70f0: 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65  WhereOrTerm obje
7100: 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 65 72  ct.**.** The ter
7110: 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65 64  m being analyzed
7120: 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f   must have two o
7130: 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63 6f 6e  r more of OR-con
7140: 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d 73 2e  nected subterms.
7150: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73 75 62  .** A single sub
7160: 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20 61 20  term might be a 
7170: 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65  set of AND-conne
7180: 63 74 65 64 20 73 75 62 2d 73 75 62 74 65 72 6d  cted sub-subterm
7190: 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 20 6f  s..** Examples o
71a0: 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20 61 6e  f terms under an
71b0: 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  alysis:.**.**   
71c0: 20 20 28 41 29 20 20 20 20 20 74 31 2e 78 3d 74    (A)     t1.x=t
71d0: 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32 2e 7a  2.y OR t1.x=t2.z
71e0: 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52 20 74   OR t1.y=15 OR t
71f0: 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20 20 20  1.z=t3.a+5.**   
7200: 20 20 28 42 29 20 20 20 20 20 78 3d 65 78 70 72    (B)     x=expr
7210: 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f 52 20  1 OR expr2=x OR 
7220: 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20 20 28  x=expr3.**     (
7230: 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79  C)     t1.x=t2.y
7240: 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a 20 41   OR (t1.x=t2.z A
7250: 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a 20 20  ND t1.y=15).**  
7260: 20 20 20 28 44 29 20 20 20 20 20 78 3d 65 78 70     (D)     x=exp
7270: 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e 44 20  r1 OR (y>11 AND 
7280: 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b 45 20  y<22 AND z LIKE 
7290: 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20  '*hello*').**   
72a0: 20 20 28 45 29 20 20 20 20 20 28 70 2e 61 3d 31    (E)     (p.a=1
72b0: 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44 20 72   AND q.b=2 AND r
72c0: 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d 34 20  .c=3) OR (p.x=4 
72d0: 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20 72 2e  AND q.y=5 AND r.
72e0: 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20  z=6).**.** CASE 
72f0: 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20  1:.**.** If all 
7300: 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f 66 20  subterms are of 
7310: 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65 78 70  the form T.C=exp
7320: 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c  r for some singl
7330: 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a  e column of C.**
7340: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
7350: 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e 20 65  T (as shown in e
7360: 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65 29 20  xample B above) 
7370: 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65  then create a ne
7380: 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72  w virtual.** ter
7390: 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65 71 75  m that is an equ
73a0: 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70 72 65  ivalent IN expre
73b0: 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65 72  ssion.  In other
73c0: 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 74   words, if the t
73d0: 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61 6e 61  erm.** being ana
73e0: 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  lyzed is:.**.** 
73f0: 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20 20       x = expr1  
7400: 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20 4f  OR  expr2 = x  O
7410: 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a 2a 0a  R  x = expr3.**.
7420: 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  ** then create a
7430: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
7440: 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a  m like this:.**.
7450: 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65 78  **      x IN (ex
7460: 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33 29  pr1,expr2,expr3)
7470: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a 0a 2a  .**.** CASE 2:.*
7480: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
7490: 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78 61 62  erms are indexab
74a0: 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74  le by a single t
74b0: 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73 65 74  able T, then set
74c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 72 65  .**.**     Where
74d0: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 20  Term.eOperator  
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 20 57              =  W
74f0: 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68 65 72  O_OR.**     Wher
7500: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d  eTerm.u.pOrInfo-
7510: 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d 20 20  >indexable  |=  
7520: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
7530: 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a 2a 2a  r for table T.**
7540: 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73  .** A subterm is
7550: 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69 66 20   "indexable" if 
7560: 69 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  it is of the for
7570: 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e 20 3c  m.** "T.C <op> <
7580: 65 78 70 72 3e 22 20 77 68 65 72 65 20 43 20 69  expr>" where C i
7590: 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f 66 20  s any column of 
75a0: 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a 2a 20  table T and .** 
75b0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 20 22  <op> is one of "
75c0: 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c 20 22  =", "<", "<=", "
75d0: 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20 4e 55  >", ">=", "IS NU
75e0: 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a  LL", or "IN"..**
75f0: 20 41 20 73 75 62 74 65 72 6d 20 69 73 20 61 6c   A subterm is al
7600: 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69 66 20  so indexable if 
7610: 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f 66 20  it is an AND of 
7620: 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73  two or more.** s
7630: 75 62 73 75 62 74 65 72 6d 73 20 61 74 20 6c 65  ubsubterms at le
7640: 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69 63 68  ast one of which
7650: 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e 20 20   is indexable.  
7660: 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20 0a 2a  Indexable AND .*
7670: 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76 65 20  * subterms have 
7680: 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f 72 20  their eOperator 
7690: 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20 61 6e  set to WO_AND an
76a0: 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a 20 75  d they have.** u
76b0: 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20 74 6f  .pAndInfo set to
76c0: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
76d0: 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65 41 6e  llocated WhereAn
76e0: 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a  dTerm object..**
76f0: 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68 65 72  .** From another
7700: 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77 2c 20   point of view, 
7710: 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65 61 6e  "indexable" mean
7720: 73 20 74 68 61 74 20 74 68 65 20 73 75 62 74 65  s that the subte
7730: 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65  rm could.** pote
7740: 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ntially be used 
7750: 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 69 66  with an index if
7760: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
7770: 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a 2a 2a  index exists..**
7780: 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64   This analysis d
7790: 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72  oes not consider
77a0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
77b0: 74 68 65 20 69 6e 64 65 78 20 65 78 69 73 74 73  the index exists
77c0: 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73 6f 6d  ; that.** is som
77d0: 65 74 68 69 6e 67 20 74 68 65 20 62 65 73 74 49  ething the bestI
77e0: 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65 20 77  ndex() routine w
77f0: 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e 20 20  ill determine.  
7800: 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a 2a 2a  This analysis.**
7810: 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74 20 77   only looks at w
7820: 68 65 74 68 65 72 20 73 75 62 74 65 72 6d 73 20  hether subterms 
7830: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
7840: 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74 2e 0a  indexing exist..
7850: 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d 70 6c  **.** All exampl
7860: 65 73 20 41 20 74 68 72 6f 75 67 68 20 45 20 61  es A through E a
7870: 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73 66 79  bove all satisfy
7880: 20 63 61 73 65 20 32 2e 20 20 42 75 74 20 69 66   case 2.  But if
7890: 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20   a term.** also 
78a0: 73 74 61 74 69 73 66 69 65 73 20 63 61 73 65 20  statisfies case 
78b0: 31 20 28 73 75 63 68 20 61 73 20 42 29 20 77 65  1 (such as B) we
78c0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
78d0: 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a  ptimizer will.**
78e0: 20 61 6c 77 61 79 73 20 70 72 65 66 65 72 20 63   always prefer c
78f0: 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74 68 61  ase 1, so in tha
7900: 74 20 63 61 73 65 20 77 65 20 70 72 65 74 65 6e  t case we preten
7910: 64 20 74 68 61 74 20 63 61 73 65 20 32 20 69 73  d that case 2 is
7920: 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66 69 65   not.** satisfie
7930: 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69 67 68  d..**.** It migh
7940: 74 20 62 65 20 74 68 65 20 63 61 73 65 20 74 68  t be the case th
7950: 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61 62 6c  at multiple tabl
7960: 65 73 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65  es are indexable
7970: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 0a  .  For example,.
7980: 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69 73 20  ** (E) above is 
7990: 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74 61 62  indexable on tab
79a0: 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20 52 2e  les P, Q, and R.
79b0: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74 68 61  .**.** Terms tha
79c0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 32  t satisfy case 2
79d0: 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
79e0: 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20 75 73  for lookup by us
79f0: 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  ing.** separate 
7a00: 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e 64 20  indices to find 
7a10: 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63 68 20  rowids for each 
7a20: 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f 6d 70  subterm and comp
7a30: 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75 6e 69  osing.** the uni
7a40: 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69 64 73  on of all rowids
7a50: 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65 74 20   using a RowSet 
7a60: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 69 73  object.  This is
7a70: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 22   similar.** to "
7a80: 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73 22 20  bitmap indices" 
7a90: 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  in other databas
7aa0: 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a  e engines..**.**
7ab0: 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a   OTHERWISE:.**.*
7ac0: 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63 61 73  * If neither cas
7ad0: 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32 20 61  e 1 nor case 2 a
7ae0: 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61 76 65  pply, then leave
7af0: 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72 20 73   the eOperator s
7b00: 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20  et to.** zero.  
7b10: 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74  This term is not
7b20: 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 61 72   useful for sear
7b30: 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ch..*/.static vo
7b40: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72  id exprAnalyzeOr
7b50: 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73 74 20  Term(.  SrcList 
7b60: 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20 20 20  *pSrc,          
7b70: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
7b80: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
7b90: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
7ba0: 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d 70 6c      /* the compl
7bb0: 65 74 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  ete WHERE clause
7bc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72   */.  int idxTer
7bd0: 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
7be0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20  /* Index of the 
7bf0: 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  OR-term to be an
7c00: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 50  alyzed */.){.  P
7c10: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
7c20: 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20 20 20  WC->pParse;     
7c30: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
7c40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71   context */.  sq
7c50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
7c60: 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20  se->db;         
7c70: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
7c80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
7c90: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7ca0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
7cb0: 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54 68 65  Term];    /* The
7cc0: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c   term to be anal
7cd0: 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  yzed */.  Expr *
7ce0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
7cf0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
7d00: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
7d10: 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ion of the term 
7d20: 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65  */.  WhereMaskSe
7d30: 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  t *pMaskSet = pW
7d40: 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f 2a 20  C->pMaskSet; /* 
7d50: 54 61 62 6c 65 20 75 73 65 20 6d 61 73 6b 73 20  Table use masks 
7d60: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int 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 20 20 20 20 20 20 2f 2a 20               /* 
7d90: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
7da0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
7db0: 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f 2a 20  pOrWc;       /* 
7dc0: 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65 72 6d  Breakup of pTerm
7dd0: 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a   into subterms *
7de0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
7df0: 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20 2f 2a  OrTerm;       /*
7e00: 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69 74 68   A Sub-term with
7e10: 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a 2f 0a  in the pOrWc */.
7e20: 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20 2a 70    WhereOrInfo *p
7e30: 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a 20 41  OrInfo;     /* A
7e40: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
7e50: 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ation associated
7e60: 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f 0a 20   with pTerm */. 
7e70: 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54 6f 49   Bitmask chngToI
7e80: 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  N;         /* Ta
7e90: 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  bles that might 
7ea0: 73 61 74 69 73 66 79 20 63 61 73 65 20 31 20 2a  satisfy case 1 *
7eb0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64 65  /.  Bitmask inde
7ec0: 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a  xable;        /*
7ed0: 20 54 61 62 6c 65 73 20 74 68 61 74 20 61 72 65   Tables that are
7ee0: 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61 74 69   indexable, sati
7ef0: 73 66 79 69 6e 67 20 63 61 73 65 20 32 20 2a 2f  sfying case 2 */
7f00: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72 65 61  ..  /*.  ** Brea
7f10: 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20  k the OR clause 
7f20: 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72 61 74  into its separat
7f30: 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54 68 65  e subterms.  The
7f40: 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a 20 20   subterms are.  
7f50: 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61 20 57  ** stored in a W
7f60: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
7f70: 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
7f80: 77 69 74 68 69 6e 20 74 68 65 20 57 68 65 72 65  within the Where
7f90: 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65  OrInfo.  ** obje
7fa0: 63 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63  ct that is attac
7fb0: 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69 67 69  hed to the origi
7fc0: 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20 74 65  nal OR clause te
7fd0: 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  rm..  */.  asser
7fe0: 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  t( (pTerm->wtFla
7ff0: 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e 41 4d  gs & (TERM_DYNAM
8000: 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54  IC|TERM_ORINFO|T
8010: 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d 3d 30  ERM_ANDINFO))==0
8020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
8030: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
8040: 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70 4f 72  ;.  pTerm->u.pOr
8050: 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f 20 3d  Info = pOrInfo =
8060: 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
8070: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
8080: 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20 69 66  *pOrInfo));.  if
8090: 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29 20 72  ( pOrInfo==0 ) r
80a0: 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e  eturn;.  pTerm->
80b0: 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  wtFlags |= TERM_
80c0: 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57 63 20  ORINFO;.  pOrWc 
80d0: 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  = &pOrInfo->wc;.
80e0: 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69    whereClauseIni
80f0: 74 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e 70 50  t(pOrWc, pWC->pP
8100: 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
8110: 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 4f  .  whereSplit(pO
8120: 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f  rWc, pExpr, TK_O
8130: 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a  R);.  exprAnalyz
8140: 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72 57 63  eAll(pSrc, pOrWc
8150: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
8160: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
8170: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f  rn;.  assert( pO
8180: 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b  rWc->nTerm>=2 );
8190: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70  ..  /*.  ** Comp
81a0: 75 74 65 20 74 68 65 20 73 65 74 20 6f 66 20 74  ute the set of t
81b0: 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68 74  ables that might
81c0: 20 73 61 74 69 73 66 79 20 63 61 73 65 73 20 31   satisfy cases 1
81d0: 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e   or 2..  */.  in
81e0: 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69 74 6d  dexable = ~(Bitm
81f0: 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54 6f 49  ask)0;.  chngToI
8200: 4e 20 3d 20 7e 28 70 57 43 2d 3e 76 6d 61 73 6b  N = ~(pWC->vmask
8210: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72 57 63  );.  for(i=pOrWc
8220: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65  ->nTerm-1, pOrTe
8230: 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d  rm=pOrWc->a; i>=
8240: 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65 3b 20  0 && indexable; 
8250: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8260: 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72  .    if( (pOrTer
8270: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
8280: 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a  O_SINGLE)==0 ){.
8290: 20 20 20 20 20 20 57 68 65 72 65 41 6e 64 49 6e        WhereAndIn
82a0: 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a 20 20  fo *pAndInfo;.  
82b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54      assert( pOrT
82c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
82d0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
82e0: 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77 74 46  t( (pOrTerm->wtF
82f0: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41 4e 44  lags & (TERM_AND
8300: 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  INFO|TERM_ORINFO
8310: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  ))==0 );.      c
8320: 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20 20 20  hngToIN = 0;.   
8330: 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20 73 71     pAndInfo = sq
8340: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
8350: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 41 6e  (db, sizeof(*pAn
8360: 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 69  dInfo));.      i
8370: 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b 0a 20  f( pAndInfo ){. 
8380: 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
8390: 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20 20 20  se *pAndWC;.    
83a0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
83b0: 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  AndTerm;.       
83c0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
83d0: 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b 0a 20  Bitmask b = 0;. 
83e0: 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e         pOrTerm->
83f0: 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70 41 6e  u.pAndInfo = pAn
8400: 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 70  dInfo;.        p
8410: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
8420: 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b  |= TERM_ANDINFO;
8430: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
8440: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
8450: 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 70 41  _AND;.        pA
8460: 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e 66 6f  ndWC = &pAndInfo
8470: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 77 68  ->wc;.        wh
8480: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 41  ereClauseInit(pA
8490: 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61 72 73  ndWC, pWC->pPars
84a0: 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  e, pMaskSet);.  
84b0: 20 20 20 20 20 20 77 68 65 72 65 53 70 6c 69 74        whereSplit
84c0: 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65 72 6d  (pAndWC, pOrTerm
84d0: 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e 44 29  ->pExpr, TK_AND)
84e0: 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72 41 6e  ;.        exprAn
84f0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
8500: 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20 20 20  AndWC);.        
8510: 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e 6d 61  testcase( db->ma
8520: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
8530: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
8540: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
8550: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
8560: 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e 64 57  , pAndTerm=pAndW
8570: 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e  C->a; j<pAndWC->
8580: 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64  nTerm; j++, pAnd
8590: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
85a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 6e       assert( pAn
85b0: 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  dTerm->pExpr );.
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
85d0: 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64 54 65  allowedOp(pAndTe
85e0: 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29 20 29  rm->pExpr->op) )
85f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
8600: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  b |= getMask(pMa
8610: 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72 6d 2d  skSet, pAndTerm-
8620: 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20  >leftCursor);.  
8630: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8640: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8650: 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65 78 61  }.        indexa
8660: 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  ble &= b;.      
8670: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
8680: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
8690: 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44 20 29   & TERM_COPIED )
86a0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20  {.      /* Skip 
86b0: 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20 6e 6f  this term for no
86c0: 77 2e 20 20 57 65 20 72 65 76 69 73 69 74 20 69  w.  We revisit i
86d0: 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63 65 73  t when we proces
86e0: 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  s the.      ** c
86f0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54 45 52  orresponding TER
8700: 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d 20 2a  M_VIRTUAL term *
8710: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
8720: 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a 20 20     Bitmask b;.  
8730: 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73 6b 28      b = getMask(
8740: 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54 65 72  pMaskSet, pOrTer
8750: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
8760: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
8770: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
8780: 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20 20 20  M_VIRTUAL ){.   
8790: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
87a0: 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57 63 2d  pOther = &pOrWc-
87b0: 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50 61 72  >a[pOrTerm->iPar
87c0: 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20 62 20  ent];.        b 
87d0: 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  |= getMask(pMask
87e0: 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c 65 66  Set, pOther->lef
87f0: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8800: 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c  }.      indexabl
8810: 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 69 66  e &= b;.      if
8820: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
8830: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
8840: 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20         chngToIN 
8850: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
8860: 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f  {.        chngTo
8870: 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d  IN &= b;.      }
8880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8890: 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74 68 65  .  ** Record the
88a0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74   set of tables t
88b0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
88c0: 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d 69 67   2.  The set mig
88d0: 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70 74 79  ht be.  ** empty
88e0: 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f  ..  */.  pOrInfo
88f0: 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 69 6e  ->indexable = in
8900: 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65 72 6d  dexable;.  pTerm
8910: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 69 6e  ->eOperator = in
8920: 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30 20 3a  dexable==0 ? 0 :
8930: 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20   WO_OR;..  /*.  
8940: 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f 6c 64  ** chngToIN hold
8950: 73 20 61 20 73 65 74 20 6f 66 20 74 61 62 6c 65  s a set of table
8960: 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a 20 73  s that *might* s
8970: 61 74 69 73 66 79 20 63 61 73 65 20 31 2e 20 20  atisfy case 1.  
8980: 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61 76 65  But.  ** we have
8990: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64 64 69   to do some addi
89a0: 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e 67 20  tional checking 
89b0: 74 6f 20 73 65 65 20 69 66 20 63 61 73 65 20 31  to see if case 1
89c0: 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69 73 20   really.  ** is 
89d0: 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a 2a 0a  satisfied..  **.
89e0: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 77 69    ** chngToIN wi
89f0: 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72 20 30  ll hold either 0
8a00: 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73 2e 20  , 1, or 2 bits. 
8a10: 20 54 68 65 20 30 2d 62 69 74 20 63 61 73 65 20   The 0-bit case 
8a20: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
8a30: 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 73 73  there is no poss
8a40: 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61 6e 73  ibility of trans
8a50: 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52 20 63  forming the OR c
8a60: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a 20 20  lause into an.  
8a70: 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 62  ** IN operator b
8a80: 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20 6d 6f  ecause one or mo
8a90: 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  re terms in the 
8aa0: 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  OR clause contai
8ab0: 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69 6e 67  n.  ** something
8ac0: 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d 20 6f   other than == o
8ad0: 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68  n a column in th
8ae0: 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20  e single table. 
8af0: 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a 2a 20   The 1-bit.  ** 
8b00: 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61 74 20  case means that 
8b10: 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20 74 68  every term of th
8b20: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73 20 6f  e OR clause is o
8b30: 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a 2a 20  f the form.  ** 
8b40: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78  "table.column=ex
8b50: 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  pr" for some sin
8b60: 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  gle table.  The 
8b70: 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69 73 20  one bit that is 
8b80: 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20 63 6f  set.  ** will co
8b90: 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
8ba0: 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20 20 57  common table.  W
8bb0: 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
8bc0: 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a 20 20  check to make.  
8bd0: 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61 6d 65  ** sure the same
8be0: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
8bf0: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20 20 54  on all terms.  T
8c00: 68 65 20 32 2d 62 69 74 20 63 61 73 65 20 69 73  he 2-bit case is
8c10: 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 61   when.  ** the a
8c20: 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f 66 20  ll terms are of 
8c30: 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c 65 31  the form "table1
8c40: 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32 2e 63  .column=table2.c
8c50: 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20 2a 2a  olumn".  It.  **
8c60: 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73 69 62   might be possib
8c70: 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20 49 4e  le to form an IN
8c80: 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20 65   operator with e
8c90: 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63 6f 6c  ither table1.col
8ca0: 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61 62 6c  umn.  ** or tabl
8cb0: 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65  e2.column as the
8cc0: 20 4c 48 53 20 69 66 20 65 69 74 68 65 72 20 69   LHS if either i
8cd0: 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72  s common to ever
8ce0: 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a 20 74  y term of.  ** t
8cf0: 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a 20 20  he OR clause..  
8d00: 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61  **.  ** Note tha
8d10: 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66  t terms of the f
8d20: 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d  orm "table.colum
8d30: 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32  n1=table.column2
8d40: 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65  " (the.  ** same
8d50: 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68 20 73   table on both s
8d60: 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d 29 20  izes of the ==) 
8d70: 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69 6d 69  cannot be optimi
8d80: 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  zed..  */.  if( 
8d90: 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20  chngToIN ){.    
8da0: 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  int okToChngToIN
8db0: 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75   = 0;     /* Tru
8dc0: 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65 72 73  e if the convers
8dd0: 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76 61 6c  ion to IN is val
8de0: 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  id */.    int iC
8df0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20 20 20  olumn = -1;     
8e00: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e      /* Column in
8e10: 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20 49 4e  dex on lhs of IN
8e20: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
8e30: 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d 20 2d   int iCursor = -
8e40: 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61  1;         /* Ta
8e50: 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d 6d 6f  ble cursor commo
8e60: 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73 20 2a  n to all terms *
8e70: 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20 30 3b  /.    int j = 0;
8e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e90: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
8ea0: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  */..    /* Searc
8eb0: 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20 61 6e  h for a table an
8ec0: 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70  d column that ap
8ed0: 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73 69 64  pears on one sid
8ee0: 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20  e or the.    ** 
8ef0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d 3d 20  other of the == 
8f00: 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76 65 72  operator in ever
8f10: 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68 61 74  y subterm.  That
8f20: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
8f30: 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65  n.    ** will be
8f40: 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69 43 75   recorded in iCu
8f50: 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75 6d 6e  rsor and iColumn
8f60: 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74 20 6e  .  There might n
8f70: 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20 2a 2a  ot be any.    **
8f80: 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e 64 20   such table and 
8f90: 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f 6b 54  column.  Set okT
8fa0: 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61 6e 20  oChngToIN if an 
8fb0: 61 70 70 72 6f 70 72 69 61 74 65 20 74 61 62 6c  appropriate tabl
8fc0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63 6f 6c  e.    ** and col
8fd0: 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62 75 74  umn is found but
8fe0: 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e 67 54   leave okToChngT
8ff0: 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  oIN false if not
9000: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20   found..    */. 
9010: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20     for(j=0; j<2 
9020: 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e  && !okToChngToIN
9030: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 4f  ; j++){.      pO
9040: 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d 3e 61  rTerm = pOrWc->a
9050: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 4f  ;.      for(i=pO
9060: 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e  rWc->nTerm-1; i>
9070: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d  =0; i--, pOrTerm
9080: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ++){.        ass
9090: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f  ert( pOrTerm->eO
90a0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29  perator==WO_EQ )
90b0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72  ;.        pOrTer
90c0: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20 7e 54  m->wtFlags &= ~T
90d0: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
90e0: 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e     if( pOrTerm->
90f0: 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
9100: 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  sor ){.         
9110: 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
9120: 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64 20 77  2-bit case and w
9130: 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73 65 63  e are on the sec
9140: 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 61 6e  ond iteration an
9150: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  d.          ** c
9160: 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73 20 66  urrent term is f
9170: 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 69 74  rom the first it
9180: 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73 6b 69  eration.  So ski
9190: 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a 2f 0a  p this term. */.
91a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
91b0: 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( j==1 );.      
91c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
91d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
91e0: 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20 26 20  if( (chngToIN & 
91f0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
9200: 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43  , pOrTerm->leftC
9210: 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a 20 20  ursor))==0 ){.  
9220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
9230: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f 66 20  term must be of 
9240: 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d 3d 74  the form t1.a==t
9250: 32 2e 62 20 77 68 65 72 65 20 74 32 20 69 73 20  2.b where t2 is 
9260: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  in the.         
9270: 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73 65 74   ** chngToIN set
9280: 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74 2e 20   but t1 is not. 
9290: 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c 6c 20   This term will 
92a0: 62 65 20 65 69 74 68 65 72 20 70 72 65 63 65 65  be either precee
92b0: 64 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ded.          **
92c0: 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79 20 61   or follwed by a
92d0: 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70 79 20  n inverted copy 
92e0: 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20 20 53  (t2.b==t1.a).  S
92f0: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20 0a 20  kip this term . 
9300: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
9310: 75 73 65 20 69 74 73 20 69 6e 76 65 72 73 69 6f  use its inversio
9320: 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  n. */.          
9330: 74 65 73 74 63 61 73 65 28 20 70 4f 72 54 65 72  testcase( pOrTer
9340: 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
9350: 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20 20 20  M_COPIED );.    
9360: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9370: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
9380: 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20   & TERM_VIRTUAL 
9390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
93a0: 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74  ert( pOrTerm->wt
93b0: 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 43 4f  Flags & (TERM_CO
93c0: 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54 55 41  PIED|TERM_VIRTUA
93d0: 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  L) );.          
93e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
93f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43 6f 6c    }.        iCol
9400: 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 75  umn = pOrTerm->u
9410: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20  .leftColumn;.   
9420: 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d 20 70       iCursor = p
9430: 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73  OrTerm->leftCurs
9440: 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  or;.        brea
9450: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
9460: 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20   if( i<0 ){.    
9470: 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64 69 64      /* No candid
9480: 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e  ate table+column
9490: 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54 68 69   was found.  Thi
94a0: 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63 75 72  s can only occur
94b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  .        ** on t
94c0: 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
94d0: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ion */.        a
94e0: 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20  ssert( j==1 );. 
94f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
9500: 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e 67 54 6f  chngToIN&(chngTo
9510: 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20  IN-1))==0 );.   
9520: 20 20 20 20 20 61 73 73 65 72 74 28 20 63 68 6e       assert( chn
9530: 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b 28 70  gToIN==getMask(p
9540: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73 6f 72  MaskSet, iCursor
9550: 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ) );.        bre
9560: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
9570: 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d 3d 31    testcase( j==1
9580: 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65   );..      /* We
9590: 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20 63 61   have found a ca
95a0: 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20 61 6e  ndidate table an
95b0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65 63 6b  d column.  Check
95c0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 61 74 0a   to see if that.
95d0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
95e0: 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d  nd column is com
95f0: 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65 72  mon to every ter
9600: 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c 61 75  m in the OR clau
9610: 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b 54 6f  se */.      okTo
9620: 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a 20 20  ChngToIN = 1;.  
9630: 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30 20 26      for(; i>=0 &
9640: 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20  & okToChngToIN; 
9650: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
9660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
9670: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
9680: 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  tor==WO_EQ );.  
9690: 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72        if( pOrTer
96a0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21 3d 69  m->leftCursor!=i
96b0: 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20  Cursor ){.      
96c0: 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46      pOrTerm->wtF
96d0: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
96e0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
96f0: 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e  se if( pOrTerm->
9700: 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d 69 43  u.leftColumn!=iC
9710: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
9720: 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20     okToChngToIN 
9730: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
9740: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
9750: 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66 52 69  t affLeft, affRi
9760: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20 20 2f  ght;.          /
9770: 2a 20 49 66 20 74 68 65 20 72 69 67 68 74 2d 68  * If the right-h
9780: 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c 73 6f  and side is also
9790: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
97a0: 74 68 65 20 61 66 66 69 6e 69 74 69 65 73 0a 20  the affinities. 
97b0: 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 62           ** of b
97c0: 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20 6c 65  oth right and le
97d0: 66 74 20 73 69 64 65 73 20 6d 75 73 74 20 62 65  ft sides must be
97e0: 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20 74 79   such that no ty
97f0: 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  pe.          ** 
9800: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72 65 20  conversions are 
9810: 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  required on the 
9820: 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65 74 20  right.  (Ticket 
9830: 23 32 32 34 39 29 0a 20 20 20 20 20 20 20 20 20  #2249).         
9840: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 66   */.          af
9850: 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  fRight = sqlite3
9860: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f 72  ExprAffinity(pOr
9870: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69  Term->pExpr->pRi
9880: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
9890: 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69 74 65  affLeft = sqlite
98a0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 4f  3ExprAffinity(pO
98b0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c  rTerm->pExpr->pL
98c0: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eft);.          
98d0: 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 30 20  if( affRight!=0 
98e0: 26 26 20 61 66 66 52 69 67 68 74 21 3d 61 66 66  && affRight!=aff
98f0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
9900: 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e      okToChngToIN
9910: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
9920: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
9930: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c     pOrTerm->wtFl
9940: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f  ags |= TERM_OR_O
9950: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  K;.          }. 
9960: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
9980: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 6b  t this point, ok
9990: 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20 74 72  ToChngToIN is tr
99a0: 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c 20 70  ue if original p
99b0: 54 65 72 6d 20 73 61 74 69 73 66 69 65 73 0a 20  Term satisfies. 
99c0: 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20 20 49     ** case 1.  I
99d0: 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63 6f 6e  n that case, con
99e0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 76 69 72  struct a new vir
99f0: 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74 20 69  tual term that i
9a00: 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72 6d 20  s .    ** pTerm 
9a10: 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 61  converted into a
9a20: 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n IN operator.. 
9a30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 56 3a     **.    ** EV:
9a40: 20 52 2d 30 30 32 31 31 2d 31 35 31 30 30 0a 20   R-00211-15100. 
9a50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 6b     */.    if( ok
9a60: 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ToChngToIN ){.  
9a70: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 20      Expr *pDup; 
9a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
9a90: 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c 69 63  transient duplic
9aa0: 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  ate expression *
9ab0: 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  /.      ExprList
9ac0: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20 20 2f   *pList = 0;   /
9ad0: 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74 68 65  * The RHS of the
9ae0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
9af0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
9b00: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  t = 0;       /* 
9b10: 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  The LHS of the I
9b20: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
9b30: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 20      Expr *pNew; 
9b40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
9b50: 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20 6f 70  e complete IN op
9b60: 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20 20 20  erator */..     
9b70: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
9b80: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
9b90: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69  OrWc->a; i>=0; i
9ba0: 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a  --, pOrTerm++){.
9bb0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4f 72          if( (pOr
9bc0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
9bd0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
9be0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9bf0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65     assert( pOrTe
9c00: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
9c10: 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  O_EQ );.        
9c20: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
9c30: 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
9c40: 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20 20 20  rsor );.        
9c50: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
9c60: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69  >u.leftColumn==i
9c70: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20 20  Column );.      
9c80: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
9c90: 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f 72 54  ExprDup(db, pOrT
9ca0: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67  erm->pExpr->pRig
9cb0: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
9cc0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
9cd0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
9ce0: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  C->pParse, pList
9cf0: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
9d00: 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65 72 6d   pLeft = pOrTerm
9d10: 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  ->pExpr->pLeft;.
9d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
9d30: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
9d40: 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73  ;.      pDup = s
9d50: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
9d60: 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  , pLeft, 0);.   
9d70: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
9d80: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
9d90: 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c 20 30  K_IN, pDup, 0, 0
9da0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
9db0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  w ){.        int
9dc0: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 20   idxNew;.       
9dd0: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
9de0: 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45 78 70  kings(pNew, pExp
9df0: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
9e00: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
9e10: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 78 49  erty(pNew, EP_xI
9e20: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
9e30: 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c 69 73      pNew->x.pLis
9e40: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
9e50: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
9e60: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
9e70: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
9e80: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
9e90: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  IC);.        tes
9ea0: 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30  tcase( idxNew==0
9eb0: 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72   );.        expr
9ec0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
9ed0: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
9ee0: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
9ef0: 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20  ->a[idxTerm];.  
9f00: 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78        pWC->a[idx
9f10: 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  New].iParent = i
9f20: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20  dxTerm;.        
9f30: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
9f40: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
9f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9f60: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62  xprListDelete(db
9f70: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  , pList);.      
9f80: 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  }.      pTerm->e
9f90: 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 4e 4f  Operator = WO_NO
9fa0: 4f 50 3b 20 20 2f 2a 20 63 61 73 65 20 31 20 74  OP;  /* case 1 t
9fb0: 72 75 6d 70 73 20 63 61 73 65 20 32 20 2a 2f 0a  rumps case 2 */.
9fc0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64      }.  }.}.#end
9fd0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d  if /* !SQLITE_OM
9fe0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
9ff0: 4f 4e 20 26 26 20 21 53 51 4c 49 54 45 5f 4f 4d  ON && !SQLITE_OM
a000: 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
a010: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
a020: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
a030: 20 69 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d   is an WhereTerm
a040: 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68 20   structure with 
a050: 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78  only the.** "pEx
a060: 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64  pr" field filled
a070: 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66   in.  The job of
a080: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a090: 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a   to analyze the.
a0a0: 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  ** subexpression
a0b0: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c   and populate al
a0c0: 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c  l the other fiel
a0d0: 64 73 20 6f 66 20 74 68 65 20 57 68 65 72 65 54  ds of the WhereT
a0e0: 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  erm.** structure
a0f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
a100: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
a110: 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e  the form "<expr>
a120: 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73   <op> X" it gets
a130: 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20   commuted.** to 
a140: 74 68 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72  the standard for
a150: 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78  m of "X <op> <ex
a160: 70 72 3e 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  pr>"..**.** If t
a170: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a180: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
a190: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
a1a0: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 0a 2a  th X and Y are.*
a1b0: 2a 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  * columns, then 
a1c0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
a1d0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
a1e0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
a1f0: 69 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f  irtual.** term o
a200: 66 20 74 68 65 20 66 6f 72 6d 20 22 59 20 3c 6f  f the form "Y <o
a210: 70 3e 20 58 22 20 69 73 20 61 64 64 65 64 20 74  p> X" is added t
a220: 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  o the WHERE clau
a230: 73 65 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a  se and.** analyz
a240: 65 64 20 73 65 70 61 72 61 74 65 6c 79 2e 20 20  ed separately.  
a250: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72  The original ter
a260: 6d 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  m is marked with
a270: 20 54 45 52 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20   TERM_COPIED.** 
a280: 61 6e 64 20 74 68 65 20 6e 65 77 20 74 65 72 6d  and the new term
a290: 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
a2a0: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 28 62 65  TERM_DYNAMIC (be
a2b0: 63 61 75 73 65 20 69 74 27 73 20 70 45 78 70 72  cause it's pExpr
a2c0: 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
a2d0: 66 72 65 65 64 20 77 69 74 68 20 74 68 65 20 57  freed with the W
a2e0: 68 65 72 65 43 6c 61 75 73 65 29 20 61 6e 64 20  hereClause) and 
a2f0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 28 62 65  TERM_VIRTUAL (be
a300: 63 61 75 73 65 20 69 74 0a 2a 2a 20 69 73 20 61  cause it.** is a
a310: 20 63 6f 6d 6d 75 74 65 64 20 63 6f 70 79 20 6f   commuted copy o
a320: 66 20 61 20 70 72 69 6f 72 20 74 65 72 6d 2e 29  f a prior term.)
a330: 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 74    The original t
a340: 65 72 6d 20 68 61 73 20 6e 43 68 69 6c 64 3d 31  erm has nChild=1
a350: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 70 79  .** and the copy
a360: 20 68 61 73 20 69 64 78 50 61 72 65 6e 74 20 73   has idxParent s
a370: 65 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20  et to the index 
a380: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
a390: 74 65 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  term..*/.static 
a3a0: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
a3b0: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
a3c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
a3d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
a3e0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
a3f0: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
a400: 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  /* the WHERE cla
a410: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  use */.  int idx
a420: 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20  Term            
a430: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74     /* Index of t
a440: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
a450: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 57  alyzed */.){.  W
a460: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
a470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a480: 2f 2a 20 54 68 65 20 74 65 72 6d 20 74 6f 20 62  /* The term to b
a490: 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20  e analyzed */.  
a4a0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
a4b0: 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20 20 20  askSet;         
a4c0: 20 2f 2a 20 53 65 74 20 6f 66 20 74 61 62 6c 65   /* Set of table
a4d0: 20 69 6e 64 65 78 20 6d 61 73 6b 73 20 2a 2f 0a   index masks */.
a4e0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
a4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a500: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
a510: 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79  sion to be analy
a520: 7a 65 64 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  zed */.  Bitmask
a530: 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20 20   prereqLeft;    
a540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
a550: 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 74 68  requesites of th
a560: 65 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 2a  e pExpr->pLeft *
a570: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
a580: 65 71 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  eqAll;          
a590: 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75 65       /* Prereque
a5a0: 73 69 74 65 73 20 6f 66 20 70 45 78 70 72 20 2a  sites of pExpr *
a5b0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 65 78 74 72  /.  Bitmask extr
a5c0: 61 52 69 67 68 74 20 3d 20 30 3b 20 20 20 20 20  aRight = 0;     
a5d0: 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 64 65       /* Extra de
a5e0: 70 65 6e 64 65 6e 63 69 65 73 20 6f 6e 20 4c 45  pendencies on LE
a5f0: 46 54 20 4a 4f 49 4e 20 2a 2f 0a 20 20 45 78 70  FT JOIN */.  Exp
a600: 72 20 2a 70 53 74 72 31 20 3d 20 30 3b 20 20 20  r *pStr1 = 0;   
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a620: 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f 47 4c 4f   RHS of LIKE/GLO
a630: 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  B operator */.  
a640: 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d  int isComplete =
a650: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
a660: 20 2f 2a 20 52 48 53 20 6f 66 20 4c 49 4b 45 2f   /* RHS of LIKE/
a670: 47 4c 4f 42 20 65 6e 64 73 20 77 69 74 68 20 77  GLOB ends with w
a680: 69 6c 64 63 61 72 64 20 2a 2f 0a 20 20 69 6e 74  ildcard */.  int
a690: 20 6e 6f 43 61 73 65 20 3d 20 30 3b 20 20 20 20   noCase = 0;    
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a6b0: 20 4c 49 4b 45 2f 47 4c 4f 42 20 64 69 73 74 69   LIKE/GLOB disti
a6c0: 6e 67 75 69 73 68 65 73 20 63 61 73 65 20 2a 2f  nguishes case */
a6d0: 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20  .  int op;      
a6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6f0: 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65 6c      /* Top-level
a700: 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78 70   operator.  pExp
a710: 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73 65  r->op */.  Parse
a720: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
a730: 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20 50  pParse;     /* P
a740: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a750: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
a760: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20  = pParse->db;   
a770: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
a780: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a   connection */..
a790: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a7a0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
a7b0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
a7c0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a7d0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
a7e0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
a7f0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
a800: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72  m->pExpr;.  prer
a810: 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62  eqLeft = exprTab
a820: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
a830: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a840: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
a850: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
a860: 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  IN ){.    assert
a870: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
a880: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  =0 );.    if( Ex
a890: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a8a0: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
a8b0: 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  t) ){.      pTer
a8c0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
a8d0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
a8e0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a8f0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
a900: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a910: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
a920: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
a930: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
a940: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
a950: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
a960: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a970: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54  ISNULL ){.    pT
a980: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a990: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a9a0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
a9b0: 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c  Right = exprTabl
a9c0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a9d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
a9e0: 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c  .  }.  prereqAll
a9f0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
aa00: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
aa10: 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  r);.  if( ExprHa
aa20: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
aa30: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
aa40: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d  .    Bitmask x =
aa50: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
aa60: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
aa70: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20  JoinTable);.    
aa80: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a  prereqAll |= x;.
aa90: 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d      extraRight =
aaa0: 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61   x-1;  /* ON cla
aab0: 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f  use terms may no
aac0: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
aad0: 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  n index.        
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
aaf0: 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20  * on left table 
ab00: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
ab10: 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f   Ticket #3015 */
ab20: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72  .  }.  pTerm->pr
ab30: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
ab40: 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65  All;.  pTerm->le
ab50: 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  ftCursor = -1;. 
ab60: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
ab70: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  = -1;.  pTerm->e
ab80: 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20  Operator = 0;.  
ab90: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  if( allowedOp(op
aba0: 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65  ) && (pTerm->pre
abb0: 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65  reqRight & prere
abc0: 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20  qLeft)==0 ){.   
abd0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
abe0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
abf0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
ac00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
ac10: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
ac20: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
ac30: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
ac40: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
ac50: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  iTable;.      pT
ac60: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
ac70: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
ac80: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
ac90: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
aca0: 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20  ratorMask(op);. 
acb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
acc0: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
acd0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
ace0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
acf0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
ad00: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  r *pDup;.      i
ad10: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
ad20: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
ad30: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
ad40: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
ad50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
ad60: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
ad70: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
ad80: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
ad90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ada0: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70  rDelete(db, pDup
adb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
adc0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
add0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
ade0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
adf0: 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52  t(pWC, pDup, TER
ae00: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
ae10: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
ae20: 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29   if( idxNew==0 )
ae30: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
ae40: 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b   pNew = &pWC->a[
ae50: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20  idxNew];.       
ae60: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d   pNew->iParent =
ae70: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
ae80: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
ae90: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
aea0: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
aeb0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
aec0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
aed0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
aee0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aef0: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
af00: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
af10: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
af20: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
af30: 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a  (pParse, pDup);.
af40: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44        pLeft = pD
af50: 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  up->pLeft;.     
af60: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
af70: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
af80: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
af90: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
afa0: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
afb0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 70      testcase( (p
afc0: 72 65 72 65 71 4c 65 66 74 20 7c 20 65 78 74 72  rereqLeft | extr
afd0: 61 52 69 67 68 74 29 20 21 3d 20 70 72 65 72 65  aRight) != prere
afe0: 71 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 70  qLeft );.      p
aff0: 4e 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74  New->prereqRight
b000: 20 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20   = prereqLeft | 
b010: 65 78 74 72 61 52 69 67 68 74 3b 0a 20 20 20 20  extraRight;.    
b020: 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c    pNew->prereqAl
b030: 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20  l = prereqAll;. 
b040: 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72       pNew->eOper
b050: 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d  ator = operatorM
b060: 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20  ask(pDup->op);. 
b070: 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65     }.  }..#ifnde
b080: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  f SQLITE_OMIT_BE
b090: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
b0a0: 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72  ON.  /* If a ter
b0b0: 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e  m is the BETWEEN
b0c0: 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74   operator, creat
b0d0: 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61  e two new virtua
b0e0: 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61  l terms.  ** tha
b0f0: 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e  t define the ran
b100: 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57  ge that the BETW
b110: 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20  EEN implements. 
b120: 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20   For example:.  
b130: 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42  **.  **      a B
b140: 45 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20  ETWEEN b AND c. 
b150: 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76   **.  ** is conv
b160: 65 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a  erted into:.  **
b170: 0a 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45  .  **      (a BE
b180: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41  TWEEN b AND c) A
b190: 4e 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61  ND (a>=b) AND (a
b1a0: 3c 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  <=c).  **.  ** T
b1b0: 68 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73  he two new terms
b1c0: 20 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20   are added onto 
b1d0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57  the end of the W
b1e0: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
b1f0: 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20  t..  ** The new 
b200: 74 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d  terms are "dynam
b210: 69 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c  ic" and are chil
b220: 64 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67  dren of the orig
b230: 69 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a  inal BETWEEN.  *
b240: 2a 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65  * term.  That me
b250: 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20  ans that if the 
b260: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
b270: 63 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64  coded, the child
b280: 72 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69  ren are.  ** ski
b290: 70 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68  pped.  Or, if th
b2a0: 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73  e children are s
b2b0: 61 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69  atisfied by an i
b2c0: 6e 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e  ndex, the origin
b2d0: 61 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20  al.  ** BETWEEN 
b2e0: 74 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e  term is skipped.
b2f0: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
b300: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
b310: 45 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f  ETWEEN && pWC->o
b320: 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20  p==TK_AND ){.   
b330: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
b340: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
b350: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
b360: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
b370: 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45  8 ops[] = {TK_GE
b380: 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73  , TK_LE};.    as
b390: 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29  sert( pList!=0 )
b3a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
b3b0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b  ist->nExpr==2 );
b3c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
b3d0: 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45  2; i++){.      E
b3e0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20  xpr *pNewExpr;. 
b3f0: 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b       int idxNew;
b400: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
b410: 3d 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70  = sqlite3PExpr(p
b420: 50 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a  Parse, 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 20 20 20 20 20 20 73 71 6c               sql
b450: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
b460: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29  pExpr->pLeft, 0)
b470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
b490: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
b4a0: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
b4b0: 78 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20  xpr, 0), 0);.   
b4c0: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
b4d0: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
b4e0: 43 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52  C, pNewExpr, TER
b4f0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
b500: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74  YNAMIC);.      t
b510: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
b520: 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
b530: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b540: 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20  C, idxNew);.    
b550: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
b560: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
b570: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
b580: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
b590: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54  rm;.    }.    pT
b5a0: 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b  erm->nChild = 2;
b5b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
b5c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45  QLITE_OMIT_BETWE
b5d0: 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  EN_OPTIMIZATION 
b5e0: 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  */..#if !defined
b5f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
b600: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
b610: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
b620: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
b630: 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74    /* Analyze a t
b640: 65 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70  erm that is comp
b650: 6f 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d  osed of two or m
b660: 6f 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e  ore subterms con
b670: 6e 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61  nected by.  ** a
b680: 6e 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20  n OR operator.. 
b690: 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70   */.  else if( p
b6a0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20  Expr->op==TK_OR 
b6b0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b6c0: 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29  WC->op==TK_AND )
b6d0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
b6e0: 65 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57  eOrTerm(pSrc, pW
b6f0: 43 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20  C, idxTerm);.   
b700: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b710: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23  [idxTerm];.  }.#
b720: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b730: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
b740: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
b750: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
b760: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  E_OPTIMIZATION. 
b770: 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69   /* Add constrai
b780: 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68  nts to reduce th
b790: 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f  e search space o
b7a0: 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  n a LIKE or GLOB
b7b0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a  .  ** operator..
b7c0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65    **.  ** A like
b7d0: 20 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20   pattern of the 
b7e0: 66 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62  form "x LIKE 'ab
b7f0: 63 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20  c%'" is changed 
b800: 69 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73  into constraints
b810: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
b820: 20 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44      x>='abc' AND
b830: 20 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c   x<'abd' AND x L
b840: 49 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a  IKE 'abc%'.  **.
b850: 20 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68    ** The last ch
b860: 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70  aracter of the p
b870: 72 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69  refix "abc" is i
b880: 6e 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f  ncremented to fo
b890: 72 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d  rm the.  ** term
b8a0: 69 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f  ination conditio
b8b0: 6e 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20  n "abd"..  */.  
b8c0: 69 66 28 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f  if( pWC->op==TK_
b8d0: 41 4e 44 20 0a 20 20 20 26 26 20 69 73 4c 69 6b  AND .   && isLik
b8e0: 65 4f 72 47 6c 6f 62 28 70 50 61 72 73 65 2c 20  eOrGlob(pParse, 
b8f0: 70 45 78 70 72 2c 20 26 70 53 74 72 31 2c 20 26  pExpr, &pStr1, &
b900: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
b910: 61 73 65 29 0a 20 20 29 7b 0a 20 20 20 20 45 78  ase).  ){.    Ex
b920: 70 72 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  pr *pLeft;      
b930: 20 2f 2a 20 4c 48 53 20 6f 66 20 4c 49 4b 45 2f   /* LHS of LIKE/
b940: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 2a 2f  GLOB operator */
b950: 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 32  .    Expr *pStr2
b960: 3b 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20  ;       /* Copy 
b970: 6f 66 20 70 53 74 72 31 20 2d 20 52 48 53 20 6f  of pStr1 - RHS o
b980: 66 20 4c 49 4b 45 2f 47 4c 4f 42 20 6f 70 65 72  f LIKE/GLOB oper
b990: 61 74 6f 72 20 2a 2f 0a 20 20 20 20 45 78 70 72  ator */.    Expr
b9a0: 20 2a 70 4e 65 77 45 78 70 72 31 3b 0a 20 20 20   *pNewExpr1;.   
b9b0: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 32   Expr *pNewExpr2
b9c0: 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  ;.    int idxNew
b9d0: 31 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  1;.    int idxNe
b9e0: 77 32 3b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  w2;.    CollSeq 
b9f0: 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 43 6f  *pColl;    /* Co
ba00: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
ba10: 20 74 6f 20 75 73 65 20 2a 2f 0a 0a 20 20 20 20   to use */..    
ba20: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 78  pLeft = pExpr->x
ba30: 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  .pList->a[1].pEx
ba40: 70 72 3b 0a 20 20 20 20 70 53 74 72 32 20 3d 20  pr;.    pStr2 = 
ba50: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64  sqlite3ExprDup(d
ba60: 62 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a 20 20  b, pStr1, 0);.  
ba70: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
ba80: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
ba90: 20 75 38 20 63 2c 20 2a 70 43 3b 20 20 20 20 20   u8 c, *pC;     
baa0: 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 72 61 63    /* Last charac
bab0: 74 65 72 20 62 65 66 6f 72 65 20 74 68 65 20 66  ter before the f
bac0: 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 2a 2f  irst wildcard */
bad0: 0a 20 20 20 20 20 20 70 43 20 3d 20 28 75 38 2a  .      pC = (u8*
bae0: 29 26 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  )&pStr2->u.zToke
baf0: 6e 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  n[sqlite3Strlen3
bb00: 30 28 70 53 74 72 32 2d 3e 75 2e 7a 54 6f 6b 65  0(pStr2->u.zToke
bb10: 6e 29 2d 31 5d 3b 0a 20 20 20 20 20 20 63 20 3d  n)-1];.      c =
bb20: 20 2a 70 43 3b 0a 20 20 20 20 20 20 69 66 28 20   *pC;.      if( 
bb30: 6e 6f 43 61 73 65 20 29 7b 0a 20 20 20 20 20 20  noCase ){.      
bb40: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 20 69    /* The point i
bb50: 73 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  s to increment t
bb60: 68 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65  he last characte
bb70: 72 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  r before the fir
bb80: 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  st.        ** wi
bb90: 6c 64 63 61 72 64 2e 20 20 42 75 74 20 69 66 20  ldcard.  But if 
bba0: 77 65 20 69 6e 63 72 65 6d 65 6e 74 20 27 40 27  we increment '@'
bbb0: 2c 20 74 68 61 74 20 77 69 6c 6c 20 70 75 73 68  , that will push
bbc0: 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20 20   it into the.   
bbd0: 20 20 20 20 20 2a 2a 20 61 6c 70 68 61 62 65 74       ** alphabet
bbe0: 69 63 20 72 61 6e 67 65 20 77 68 65 72 65 20 63  ic range where c
bbf0: 61 73 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20  ase conversions 
bc00: 77 69 6c 6c 20 6d 65 73 73 20 75 70 20 74 68 65  will mess up the
bc10: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 65   .        ** ine
bc20: 71 75 61 6c 69 74 79 2e 20 20 54 6f 20 61 76 6f  quality.  To avo
bc30: 69 64 20 74 68 69 73 2c 20 6d 61 6b 65 20 73 75  id this, make su
bc40: 72 65 20 74 6f 20 61 6c 73 6f 20 72 75 6e 20 74  re to also run t
bc50: 68 65 20 66 75 6c 6c 0a 20 20 20 20 20 20 20 20  he full.        
bc60: 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61 6c 6c 20 63  ** LIKE on all c
bc70: 61 6e 64 69 64 61 74 65 20 65 78 70 72 65 73 73  andidate express
bc80: 69 6f 6e 73 20 62 79 20 63 6c 65 61 72 69 6e 67  ions by clearing
bc90: 20 74 68 65 20 69 73 43 6f 6d 70 6c 65 74 65 20   the isComplete 
bca0: 66 6c 61 67 0a 20 20 20 20 20 20 20 20 2a 2f 0a  flag.        */.
bcb0: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
bcc0: 41 27 2d 31 20 29 20 69 73 43 6f 6d 70 6c 65 74  A'-1 ) isComplet
bcd0: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 45 56 3a 20  e = 0;   /* EV: 
bce0: 52 2d 36 34 33 33 39 2d 30 38 32 30 37 20 2a 2f  R-64339-08207 */
bcf0: 0a 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 73  ...        c = s
bd00: 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f 77  qlite3UpperToLow
bd10: 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  er[c];.      }. 
bd20: 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20 31       *pC = c + 1
bd30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
bd40: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
bd50: 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
bd60: 45 5f 55 54 46 38 2c 20 6e 6f 43 61 73 65 20 3f  E_UTF8, noCase ?
bd70: 20 22 4e 4f 43 41 53 45 22 20 3a 20 22 42 49 4e   "NOCASE" : "BIN
bd80: 41 52 59 22 2c 30 29 3b 0a 20 20 20 20 70 4e 65  ARY",0);.    pNe
bd90: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
bda0: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
bdb0: 5f 47 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  _GE, .          
bdc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
bdd0: 65 33 45 78 70 72 53 65 74 43 6f 6c 6c 28 73 71  e3ExprSetColl(sq
bde0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
bdf0: 70 4c 65 66 74 2c 30 29 2c 20 70 43 6f 6c 6c 29  pLeft,0), pColl)
be00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
be10: 20 20 20 20 20 20 20 70 53 74 72 31 2c 20 30 29         pStr1, 0)
be20: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
be30: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
be40: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
be50: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
be60: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
be70: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
be80: 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
be90: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
bea0: 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
beb0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
bec0: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
bed0: 73 65 2c 20 54 4b 5f 4c 54 2c 0a 20 20 20 20 20  se, TK_LT,.     
bee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bef0: 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 43 6f  sqlite3ExprSetCo
bf00: 6c 6c 28 73 71 6c 69 74 65 33 45 78 70 72 44 75  ll(sqlite3ExprDu
bf10: 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 20 70  p(db,pLeft,0), p
bf20: 43 6f 6c 6c 29 2c 0a 20 20 20 20 20 20 20 20 20  Coll),.         
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 70 53 74 72              pStr
bf40: 32 2c 20 30 29 3b 0a 20 20 20 20 69 64 78 4e 65  2, 0);.    idxNe
bf50: 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  w2 = whereClause
bf60: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77  Insert(pWC, pNew
bf70: 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52 54  Expr2, TERM_VIRT
bf80: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
bf90: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
bfa0: 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a 20   idxNew2==0 );. 
bfb0: 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70     exprAnalyze(p
bfc0: 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77  Src, pWC, idxNew
bfd0: 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  2);.    pTerm = 
bfe0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
bff0: 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d 70  ;.    if( isComp
c000: 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70 57  lete ){.      pW
c010: 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69 50  C->a[idxNew1].iP
c020: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
c030: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
c040: 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew2].iParent =
c050: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
c060: 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20  pTerm->nChild = 
c070: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  2;.    }.  }.#en
c080: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c090: 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41  IT_LIKE_OPTIMIZA
c0a0: 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TION */..#ifndef
c0b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
c0c0: 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 41  TUALTABLE.  /* A
c0d0: 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61 75  dd a WO_MATCH au
c0e0: 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f 20  xiliary term to 
c0f0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 73  the constraint s
c100: 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 63  et if the.  ** c
c110: 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69 6f  urrent expressio
c120: 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  n is of the form
c130: 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20  :  column MATCH 
c140: 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73 20  expr..  ** This 
c150: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
c160: 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  sed by the xBest
c170: 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f 66  Index methods of
c180: 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61  .  ** virtual ta
c190: 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69 76  bles.  The nativ
c1a0: 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a 65  e query optimize
c1b0: 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65 6d  r does not attem
c1c0: 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61 6e  pt.  ** to do an
c1d0: 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54 43  ything with MATC
c1e0: 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a  H functions..  *
c1f0: 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68 4f  /.  if( isMatchO
c200: 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20 29  fColumn(pExpr) )
c210: 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77  {.    int idxNew
c220: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69 67  ;.    Expr *pRig
c230: 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20 20  ht, *pLeft;.    
c240: 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77 54  WhereTerm *pNewT
c250: 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73 6b  erm;.    Bitmask
c260: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20 70   prereqColumn, p
c270: 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20 20  rereqExpr;..    
c280: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
c290: 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
c2a0: 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d  xpr;.    pLeft =
c2b0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
c2c0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
c2d0: 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65 78   prereqExpr = ex
c2e0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
c2f0: 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b 0a  skSet, pRight);.
c300: 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e      prereqColumn
c310: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
c320: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66  e(pMaskSet, pLef
c330: 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72 65  t);.    if( (pre
c340: 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65 71  reqExpr & prereq
c350: 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20  Column)==0 ){.  
c360: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
c370: 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78  pr;.      pNewEx
c380: 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78 70  pr = sqlite3PExp
c390: 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41 54  r(pParse, TK_MAT
c3a0: 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  CH, .           
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78 70     0, sqlite3Exp
c3d0: 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74 2c  rDup(db, pRight,
c3e0: 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69   0), 0);.      i
c3f0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
c400: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
c410: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
c420: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
c430: 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  IC);.      testc
c440: 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29  ase( idxNew==0 )
c450: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
c460: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
c470: 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  w];.      pNewTe
c480: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
c490: 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20 20  = prereqExpr;.  
c4a0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65      pNewTerm->le
c4b0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
c4c0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
c4d0: 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66 74  pNewTerm->u.left
c4e0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
c4f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
c500: 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
c510: 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
c520: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
c530: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
c540: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
c550: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
c560: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
c570: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
c580: 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
c590: 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a  |= TERM_COPIED;.
c5a0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
c5b0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72  prereqAll = pTer
c5c0: 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20  m->prereqAll;.  
c5d0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
c5e0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
c5f0: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
c600: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c610: 42 4c 45 5f 53 54 41 54 32 0a 20 20 2f 2a 20 57  BLE_STAT2.  /* W
c620: 68 65 6e 20 73 71 6c 69 74 65 5f 73 74 61 74 32  hen sqlite_stat2
c630: 20 68 69 73 74 6f 67 72 61 6d 20 64 61 74 61 20   histogram data 
c640: 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61 6e 20  is available an 
c650: 6f 70 65 72 61 74 6f 72 20 6f 66 20 74 68 65 0a  operator of the.
c660: 20 20 2a 2a 20 66 6f 72 6d 20 22 78 20 49 53 20    ** form "x IS 
c670: 4e 4f 54 20 4e 55 4c 4c 22 20 63 61 6e 20 73 6f  NOT NULL" can so
c680: 6d 65 74 69 6d 65 73 20 62 65 20 65 76 61 6c 75  metimes be evalu
c690: 61 74 65 64 20 6d 6f 72 65 20 65 66 66 69 63 69  ated more effici
c6a0: 65 6e 74 6c 79 0a 20 20 2a 2a 20 61 73 20 22 78  ently.  ** as "x
c6b0: 3e 4e 55 4c 4c 22 20 69 66 20 78 20 69 73 20 6e  >NULL" if x is n
c6c0: 6f 74 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52  ot an INTEGER PR
c6d0: 49 4d 41 52 59 20 4b 45 59 2e 20 20 53 6f 20 63  IMARY KEY.  So c
c6e0: 6f 6e 73 74 72 75 63 74 20 61 0a 20 20 2a 2a 20  onstruct a.  ** 
c6f0: 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6f 66 20  virtual term of 
c700: 74 68 61 74 20 66 6f 72 6d 2e 0a 20 20 2a 2a 0a  that form..  **.
c710: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74    ** Note that t
c720: 68 65 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20  he virtual term 
c730: 6d 75 73 74 20 62 65 20 74 61 67 67 65 64 20 77  must be tagged w
c740: 69 74 68 20 54 45 52 4d 5f 56 4e 55 4c 4c 2e 20  ith TERM_VNULL. 
c750: 20 54 68 69 73 0a 20 20 2a 2a 20 54 45 52 4d 5f   This.  ** TERM_
c760: 56 4e 55 4c 4c 20 74 61 67 20 77 69 6c 6c 20 73  VNULL tag will s
c770: 75 70 70 72 65 73 73 20 74 68 65 20 6e 6f 74 2d  uppress the not-
c780: 6e 75 6c 6c 20 63 68 65 63 6b 20 61 74 20 74 68  null check at th
c790: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
c7a0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 57   of the loop.  W
c7b0: 69 74 68 6f 75 74 20 74 68 65 20 54 45 52 4d 5f  ithout the TERM_
c7c0: 56 4e 55 4c 4c 20 66 6c 61 67 2c 20 74 68 65 20  VNULL flag, the 
c7d0: 6e 6f 74 2d 6e 75 6c 6c 20 63 68 65 63 6b 20 61  not-null check a
c7e0: 74 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 72 74  t.  ** the start
c7f0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 69 6c   of the loop wil
c800: 6c 20 70 72 65 76 65 6e 74 20 61 6e 79 20 72 65  l prevent any re
c810: 73 75 6c 74 73 20 66 72 6f 6d 20 62 65 69 6e 67  sults from being
c820: 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 2a 2f 0a   returned..  */.
c830: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
c840: 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26  =TK_NOTNULL.   &
c850: 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  & pExpr->pLeft->
c860: 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20  op==TK_COLUMN.  
c870: 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 65 66 74   && pExpr->pLeft
c880: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 0a 20 20 29  ->iColumn>=0.  )
c890: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
c8a0: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
c8b0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
c8c0: 4c 65 66 74 3b 0a 20 20 20 20 69 6e 74 20 69 64  Left;.    int id
c8d0: 78 4e 65 77 3b 0a 20 20 20 20 57 68 65 72 65 54  xNew;.    WhereT
c8e0: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 0a  erm *pNewTerm;..
c8f0: 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73      pNewExpr = s
c900: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
c910: 73 65 2c 20 54 4b 5f 47 54 2c 0a 20 20 20 20 20  se, TK_GT,.     
c920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c930: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c940: 70 72 44 75 70 28 64 62 2c 20 70 4c 65 66 74 2c  prDup(db, pLeft,
c950: 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20   0),.           
c960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c970: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
c980: 61 72 73 65 2c 20 54 4b 5f 4e 55 4c 4c 2c 20 30  arse, TK_NULL, 0
c990: 2c 20 30 2c 20 30 29 2c 20 30 29 3b 0a 0a 20 20  , 0, 0), 0);..  
c9a0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
c9b0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
c9c0: 2c 20 70 4e 65 77 45 78 70 72 2c 0a 20 20 20 20  , pNewExpr,.    
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9e0: 20 20 20 20 20 20 20 20 20 20 54 45 52 4d 5f 56            TERM_V
c9f0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
ca00: 4d 49 43 7c 54 45 52 4d 5f 56 4e 55 4c 4c 29 3b  MIC|TERM_VNULL);
ca10: 0a 20 20 20 20 69 66 28 20 69 64 78 4e 65 77 20  .    if( idxNew 
ca20: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  ){.      pNewTer
ca30: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
ca40: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
ca50: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ca60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4e 65 77   = 0;.      pNew
ca70: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
ca80: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
ca90: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
caa0: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  ->u.leftColumn =
cab0: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
cac0: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
cad0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f  >eOperator = WO_
cae0: 47 54 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  GT;.      pNewTe
caf0: 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64  rm->iParent = id
cb00: 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 54 65  xTerm;.      pTe
cb10: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
cb20: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 70 54 65  Term];.      pTe
cb30: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a  rm->nChild = 1;.
cb40: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
cb50: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
cb60: 49 45 44 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  IED;.      pNewT
cb70: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
cb80: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c   pTerm->prereqAl
cb90: 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  l;.    }.  }.#en
cba0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
cbb0: 41 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 20  ABLE_STAT2 */.. 
cbc0: 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20 63   /* Prevent ON c
cbd0: 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20 61  lause terms of a
cbe0: 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d 20   LEFT JOIN from 
cbf0: 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64 72  being used to dr
cc00: 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64 65  ive.  ** an inde
cc10: 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f 20  x for tables to 
cc20: 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
cc30: 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54 65  join..  */.  pTe
cc40: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
cc50: 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a 7d  |= extraRight;.}
cc60: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
cc70: 52 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74 68  RUE if any of th
cc80: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
cc90: 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74   pList->a[iFirst
cca0: 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ...] contain.** 
ccb0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
ccc0: 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20 74  ny table other t
ccd0: 68 61 6e 20 74 68 65 20 69 42 61 73 65 20 74 61  han the iBase ta
cce0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
ccf0: 6e 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74 68  nt referencesOth
cd00: 65 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70 72  erTables(.  Expr
cd10: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 20  List *pList,    
cd20: 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20        /* Search 
cd30: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
cd40: 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20 57 68 65  hs list */.  Whe
cd50: 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  reMaskSet *pMask
cd60: 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70 70 69 6e  Set,   /* Mappin
cd70: 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f  g from tables to
cd80: 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e   bitmaps */.  in
cd90: 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20 20  t iFirst,       
cda0: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73 65          /* Be se
cdb0: 61 72 63 68 69 6e 67 20 77 69 74 68 20 74 68 65  arching with the
cdc0: 20 69 46 69 72 73 74 2d 74 68 20 65 78 70 72 65   iFirst-th expre
cdd0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  ssion */.  int i
cde0: 42 61 73 65 20 20 20 20 20 20 20 20 20 20 20 20  Base            
cdf0: 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72       /* Ignore r
ce00: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
ce10: 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  s table */.){.  
ce20: 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20  Bitmask allowed 
ce30: 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  = ~getMask(pMask
ce40: 53 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20 77  Set, iBase);.  w
ce50: 68 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c 69  hile( iFirst<pLi
ce60: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
ce70: 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65 55   if( (exprTableU
ce80: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
ce90: 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b  List->a[iFirst++
cea0: 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65 64  ].pExpr)&allowed
ceb0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )!=0 ){.      re
cec0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
ced0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
cee0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
cef0: 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
cf00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
cf10: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
cf20: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
cf30: 2a 2a 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73  ** for an expres
cf40: 73 69 6f 6e 20 6f 66 20 74 79 70 65 20 54 4b 5f  sion of type TK_
cf50: 43 4f 4c 55 4d 4e 20 74 68 61 74 20 72 65 66 65  COLUMN that refe
cf60: 72 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 63  rs to the same c
cf70: 6f 6c 75 6d 6e 20 61 6e 64 0a 2a 2a 20 75 73 65  olumn and.** use
cf80: 73 20 74 68 65 20 73 61 6d 65 20 63 6f 6c 6c 61  s the same colla
cf90: 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 73  tion sequence as
cfa0: 20 74 68 65 20 69 43 6f 6c 27 74 68 20 63 6f 6c   the iCol'th col
cfb0: 75 6d 6e 20 6f 66 20 69 6e 64 65 78 20 70 49 64  umn of index pId
cfc0: 78 2e 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69  x..** Argument i
cfd0: 42 61 73 65 20 69 73 20 74 68 65 20 63 75 72 73  Base is the curs
cfe0: 6f 72 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  or number used f
cff0: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 68 61  or the table tha
d000: 74 20 70 49 64 78 20 72 65 66 65 72 73 0a 2a 2a  t pIdx refers.**
d010: 20 74 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75   to..**.** If su
d020: 63 68 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ch an expression
d030: 20 69 73 20 66 6f 75 6e 64 2c 20 69 74 73 20 69   is found, its i
d040: 6e 64 65 78 20 69 6e 20 70 4c 69 73 74 2d 3e 61  ndex in pList->a
d050: 5b 5d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  [] is returned. 
d060: 49 66 0a 2a 2a 20 6e 6f 20 65 78 70 72 65 73 73  If.** no express
d070: 69 6f 6e 20 69 73 20 66 6f 75 6e 64 2c 20 2d 31  ion is found, -1
d080: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
d090: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
d0a0: 49 6e 64 65 78 43 6f 6c 28 0a 20 20 50 61 72 73  IndexCol(.  Pars
d0b0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
d0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d0d0: 61 72 73 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  arse context */.
d0e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
d0f0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
d100: 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
d110: 6c 69 73 74 20 74 6f 20 73 65 61 72 63 68 20 2a  list to search *
d120: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 2c 20 20  /.  int iBase,  
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d140: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 66 6f      /* Cursor fo
d150: 72 20 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74  r table associat
d160: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
d170: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
d180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d190: 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 6d 61    /* Index to ma
d1a0: 74 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 2a 2f  tch column of */
d1b0: 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20  .  int iCol     
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d1d0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6f 66 20     /* Column of 
d1e0: 69 6e 64 65 78 20 74 6f 20 6d 61 74 63 68 20 2a  index to match *
d1f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
d200: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
d210: 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  l = pIdx->azColl
d220: 5b 69 43 6f 6c 5d 3b 0a 0a 20 20 66 6f 72 28 69  [iCol];..  for(i
d230: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
d240: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  pr; i++){.    Ex
d250: 70 72 20 2a 70 20 3d 20 70 4c 69 73 74 2d 3e 61  pr *p = pList->a
d260: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69  [i].pExpr;.    i
d270: 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  f( p->op==TK_COL
d280: 55 4d 4e 0a 20 20 20 20 20 26 26 20 70 2d 3e 69  UMN.     && p->i
d290: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
d2a0: 43 6f 6c 75 6d 6e 5b 69 43 6f 6c 5d 0a 20 20 20  Column[iCol].   
d2b0: 20 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d    && p->iTable==
d2c0: 69 42 61 73 65 0a 20 20 20 20 29 7b 0a 20 20 20  iBase.    ){.   
d2d0: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
d2e0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
d2f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
d300: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  );.      if( ALW
d310: 41 59 53 28 70 43 6f 6c 6c 29 20 26 26 20 30 3d  AYS(pColl) && 0=
d320: 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28  =sqlite3StrICmp(
d330: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  pColl->zName, zC
d340: 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oll) ){.        
d350: 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20 20 20  return i;.      
d360: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
d370: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a  eturn -1;.}../*.
d380: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d390: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 70 49  determines if pI
d3a0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
d3b0: 6f 20 61 73 73 69 73 74 20 69 6e 20 70 72 6f 63  o assist in proc
d3c0: 65 73 73 69 6e 67 20 61 0a 2a 2a 20 44 49 53 54  essing a.** DIST
d3d0: 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 2e 20  INCT qualifier. 
d3e0: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
d3f0: 69 74 20 74 65 73 74 73 20 77 68 65 74 68 65 72  it tests whether
d400: 20 6f 72 20 6e 6f 74 20 75 73 69 6e 67 20 74 68   or not using th
d410: 69 73 0a 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20  is.** index for 
d420: 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 67  the outer loop g
d430: 75 61 72 61 6e 74 65 65 73 20 74 68 61 74 20 72  uarantees that r
d440: 6f 77 73 20 77 69 74 68 20 65 71 75 61 6c 20 76  ows with equal v
d450: 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 61 6c 6c  alues for.** all
d460: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
d470: 74 68 65 20 70 44 69 73 74 69 6e 63 74 20 6c 69  the pDistinct li
d480: 73 74 20 61 72 65 20 64 65 6c 69 76 65 72 65 64  st are delivered
d490: 20 67 72 6f 75 70 65 64 20 74 6f 67 65 74 68 65   grouped togethe
d4a0: 72 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61  r..**.** For exa
d4b0: 6d 70 6c 65 2c 20 74 68 65 20 71 75 65 72 79 20  mple, the query 
d4c0: 0a 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20  .**.**   SELECT 
d4d0: 44 49 53 54 49 4e 43 54 20 61 2c 20 62 2c 20 63  DISTINCT a, b, c
d4e0: 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20   FROM tbl WHERE 
d4f0: 61 20 3d 20 3f 0a 2a 2a 0a 2a 2a 20 63 61 6e 20  a = ?.**.** can 
d500: 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 61 6e 79  benefit from any
d510: 20 69 6e 64 65 78 20 6f 6e 20 63 6f 6c 75 6d 6e   index on column
d520: 73 20 22 62 22 20 61 6e 64 20 22 63 22 2e 0a 2a  s "b" and "c"..*
d530: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 44  /.static int isD
d540: 69 73 74 69 6e 63 74 49 6e 64 65 78 28 0a 20 20  istinctIndex(.  
d550: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d570: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
d580: 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  xt */.  WhereCla
d590: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20  use *pWC,       
d5a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
d5b0: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
d5c0: 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
d5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d5e0: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65   /* The index be
d5f0: 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20 2a  ing considered *
d600: 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  /.  int base,   
d610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d620: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
d630: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
d640: 6c 65 20 70 49 64 78 20 69 73 20 6f 6e 20 2a 2f  le pIdx is on */
d650: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 44 69  .  ExprList *pDi
d660: 73 74 69 6e 63 74 2c 20 20 20 20 20 20 20 20 20  stinct,         
d670: 20 20 20 2f 2a 20 54 68 65 20 44 49 53 54 49 4e     /* The DISTIN
d680: 43 54 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a  CT expressions *
d690: 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 20 20  /.  int nEqCol  
d6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d6c0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77   index columns w
d6d0: 69 74 68 20 3d 3d 20 2a 2f 0a 29 7b 0a 20 20 42  ith == */.){.  B
d6e0: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d700: 2a 20 4d 61 73 6b 20 6f 66 20 75 6e 61 63 63 6f  * Mask of unacco
d710: 75 6e 74 65 64 20 66 6f 72 20 70 44 69 73 74 69  unted for pDisti
d720: 6e 63 74 20 65 78 70 72 73 20 2a 2f 0a 20 20 69  nct exprs */.  i
d730: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d750: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
d760: 62 6c 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 49  ble */..  if( pI
d770: 64 78 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 7c 7c 20  dx->zName==0 || 
d780: 70 44 69 73 74 69 6e 63 74 3d 3d 30 20 7c 7c 20  pDistinct==0 || 
d790: 70 44 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72  pDistinct->nExpr
d7a0: 3e 3d 42 4d 53 20 29 20 72 65 74 75 72 6e 20 30  >=BMS ) return 0
d7b0: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 44  ;.  testcase( pD
d7c0: 69 73 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3d 3d  istinct->nExpr==
d7d0: 42 4d 53 2d 31 20 29 3b 0a 0a 20 20 2f 2a 20 4c  BMS-1 );..  /* L
d7e0: 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
d7f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
d800: 69 6e 20 74 68 65 20 64 69 73 74 69 6e 63 74 20  in the distinct 
d810: 6c 69 73 74 2e 20 49 66 20 61 6e 79 20 6f 66 20  list. If any of 
d820: 74 68 65 6d 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  them.  ** are no
d830: 74 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e 20  t simple column 
d840: 72 65 66 65 72 65 6e 63 65 73 2c 20 72 65 74 75  references, retu
d850: 72 6e 20 65 61 72 6c 79 2e 20 4f 74 68 65 72 77  rn early. Otherw
d860: 69 73 65 2c 20 74 65 73 74 20 69 66 20 74 68 65  ise, test if the
d870: 0a 20 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75  .  ** WHERE clau
d880: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 22 63  se contains a "c
d890: 6f 6c 3d 58 22 20 63 6c 61 75 73 65 2e 20 49 66  ol=X" clause. If
d8a0: 20 69 74 20 64 6f 65 73 2c 20 74 68 65 20 65 78   it does, the ex
d8b0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 63 61  pression.  ** ca
d8c0: 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 49 66  n be ignored. If
d8d0: 20 69 74 20 64 6f 65 73 20 6e 6f 74 2c 20 61 6e   it does not, an
d8e0: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 64 6f 65  d the column doe
d8f0: 73 20 6e 6f 74 20 62 65 6c 6f 6e 67 20 74 6f 20  s not belong to 
d900: 74 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61  the.  ** same ta
d910: 62 6c 65 20 61 73 20 69 6e 64 65 78 20 70 49 64  ble as index pId
d920: 78 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  x, return early.
d930: 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 74 68 65   Finally, if the
d940: 72 65 20 69 73 20 6e 6f 0a 20 20 2a 2a 20 6d 61  re is no.  ** ma
d950: 74 63 68 69 6e 67 20 22 63 6f 6c 3d 58 22 20 65  tching "col=X" e
d960: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 74 68  xpression and th
d970: 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6f 6e 20 74  e column is on t
d980: 68 65 20 73 61 6d 65 20 74 61 62 6c 65 20 61 73  he same table as
d990: 20 70 49 64 78 2c 0a 20 20 2a 2a 20 73 65 74 20   pIdx,.  ** set 
d9a0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d9b0: 67 20 62 69 74 20 69 6e 20 76 61 72 69 61 62 6c  g bit in variabl
d9c0: 65 20 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 66  e mask..  */.  f
d9d0: 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73 74 69  or(i=0; i<pDisti
d9e0: 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  nct->nExpr; i++)
d9f0: 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  {.    WhereTerm 
da00: 2a 70 54 65 72 6d 3b 0a 20 20 20 20 45 78 70 72  *pTerm;.    Expr
da10: 20 2a 70 20 3d 20 70 44 69 73 74 69 6e 63 74 2d   *p = pDistinct-
da20: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
da30: 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 43   if( p->op!=TK_C
da40: 4f 4c 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30  OLUMN ) return 0
da50: 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69  ;.    pTerm = fi
da60: 6e 64 54 65 72 6d 28 70 57 43 2c 20 70 2d 3e 69  ndTerm(pWC, p->i
da70: 54 61 62 6c 65 2c 20 70 2d 3e 69 43 6f 6c 75 6d  Table, p->iColum
da80: 6e 2c 20 7e 28 42 69 74 6d 61 73 6b 29 30 2c 20  n, ~(Bitmask)0, 
da90: 57 4f 5f 45 51 2c 20 30 29 3b 0a 20 20 20 20 69  WO_EQ, 0);.    i
daa0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
dab0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
dac0: 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  rm->pExpr;.     
dad0: 20 43 6f 6c 6c 53 65 71 20 2a 70 31 20 3d 20 73   CollSeq *p1 = s
dae0: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
daf0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
db00: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
db10: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
db20: 20 43 6f 6c 6c 53 65 71 20 2a 70 32 20 3d 20 73   CollSeq *p2 = s
db30: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
db40: 71 28 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20  q(pParse, p);.  
db50: 20 20 20 20 69 66 28 20 70 31 3d 3d 70 32 20 29      if( p1==p2 )
db60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
db70: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 54 61 62  .    if( p->iTab
db80: 6c 65 21 3d 62 61 73 65 20 29 20 72 65 74 75 72  le!=base ) retur
db90: 6e 20 30 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  n 0;.    mask |=
dba0: 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c   (((Bitmask)1) <
dbb0: 3c 20 69 29 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72  < i);.  }..  for
dbc0: 28 69 3d 6e 45 71 43 6f 6c 3b 20 6d 61 73 6b 20  (i=nEqCol; mask 
dbd0: 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && i<pIdx->nColu
dbe0: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  mn; i++){.    in
dbf0: 74 20 69 45 78 70 72 20 3d 20 66 69 6e 64 49 6e  t iExpr = findIn
dc00: 64 65 78 43 6f 6c 28 70 50 61 72 73 65 2c 20 70  dexCol(pParse, p
dc10: 44 69 73 74 69 6e 63 74 2c 20 62 61 73 65 2c 20  Distinct, base, 
dc20: 70 49 64 78 2c 20 69 29 3b 0a 20 20 20 20 69 66  pIdx, i);.    if
dc30: 28 20 69 45 78 70 72 3c 30 20 29 20 62 72 65 61  ( iExpr<0 ) brea
dc40: 6b 3b 0a 20 20 20 20 6d 61 73 6b 20 26 3d 20 7e  k;.    mask &= ~
dc50: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 20 3c 3c  (((Bitmask)1) <<
dc60: 20 69 45 78 70 72 29 3b 0a 20 20 7d 0a 0a 20 20   iExpr);.  }..  
dc70: 72 65 74 75 72 6e 20 28 6d 61 73 6b 3d 3d 30 29  return (mask==0)
dc80: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
dc90: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 44  rn true if the D
dca0: 49 53 54 49 4e 43 54 20 65 78 70 72 65 73 73 69  ISTINCT expressi
dcb0: 6f 6e 2d 6c 69 73 74 20 70 61 73 73 65 64 20 61  on-list passed a
dcc0: 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  s the third argu
dcd0: 6d 65 6e 74 0a 2a 2a 20 69 73 20 72 65 64 75 6e  ment.** is redun
dce0: 64 61 6e 74 2e 20 41 20 44 49 53 54 49 4e 43 54  dant. A DISTINCT
dcf0: 20 6c 69 73 74 20 69 73 20 72 65 64 75 6e 64 61   list is redunda
dd00: 6e 74 20 69 66 20 74 68 65 20 64 61 74 61 62 61  nt if the databa
dd10: 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a  se contains a.**
dd20: 20 55 4e 49 51 55 45 20 69 6e 64 65 78 20 74 68   UNIQUE index th
dd30: 61 74 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  at guarantees th
dd40: 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  at the result of
dd50: 20 74 68 65 20 71 75 65 72 79 20 77 69 6c 6c 20   the query will 
dd60: 62 65 20 64 69 73 74 69 6e 63 74 0a 2a 2a 20 61  be distinct.** a
dd70: 6e 79 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nyway..*/.static
dd80: 20 69 6e 74 20 69 73 44 69 73 74 69 6e 63 74 52   int isDistinctR
dd90: 65 64 75 6e 64 61 6e 74 28 0a 20 20 50 61 72 73  edundant(.  Pars
dda0: 65 20 2a 70 50 61 72 73 65 2c 0a 20 20 53 72 63  e *pParse,.  Src
ddb0: 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 0a  List *pTabList,.
ddc0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
ddd0: 57 43 2c 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  WC,.  ExprList *
dde0: 70 44 69 73 74 69 6e 63 74 0a 29 7b 0a 20 20 54  pDistinct.){.  T
ddf0: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 49 6e  able *pTab;.  In
de00: 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 69 6e 74  dex *pIdx;.  int
de10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
de20: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
de30: 69 6e 74 20 69 42 61 73 65 3b 0a 0a 20 20 2f 2a  int iBase;..  /*
de40: 20 49 66 20 74 68 65 72 65 20 69 73 20 6d 6f 72   If there is mor
de50: 65 20 74 68 61 6e 20 6f 6e 65 20 74 61 62 6c 65  e than one table
de60: 20 6f 72 20 73 75 62 2d 73 65 6c 65 63 74 20 69   or sub-select i
de70: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
de80: 65 20 6f 66 0a 20 20 2a 2a 20 74 68 69 73 20 71  e of.  ** this q
de90: 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 77 69  uery, then it wi
dea0: 6c 6c 20 6e 6f 74 20 62 65 20 70 6f 73 73 69 62  ll not be possib
deb0: 6c 65 20 74 6f 20 73 68 6f 77 20 74 68 61 74 20  le to show that 
dec0: 74 68 65 20 44 49 53 54 49 4e 43 54 20 0a 20 20  the DISTINCT .  
ded0: 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 72 65 64  ** clause is red
dee0: 75 6e 64 61 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  undant. */.  if(
def0: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 21   pTabList->nSrc!
df00: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =1 ) return 0;. 
df10: 20 69 42 61 73 65 20 3d 20 70 54 61 62 4c 69 73   iBase = pTabLis
df20: 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b  t->a[0].iCursor;
df30: 0a 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69  .  pTab = pTabLi
df40: 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 0a  st->a[0].pTab;..
df50: 20 20 2f 2a 20 49 66 20 61 6e 79 20 6f 66 20 74    /* If any of t
df60: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
df70: 73 20 61 6e 20 49 50 4b 20 63 6f 6c 75 6d 6e 20  s an IPK column 
df80: 6f 6e 20 74 61 62 6c 65 20 69 42 61 73 65 2c 20  on table iBase, 
df90: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 20 20 2a  then return .  *
dfa0: 2a 20 74 72 75 65 2e 20 4e 6f 74 65 3a 20 54 68  * true. Note: Th
dfb0: 65 20 28 70 2d 3e 69 54 61 62 6c 65 3d 3d 69 42  e (p->iTable==iB
dfc0: 61 73 65 29 20 70 61 72 74 20 6f 66 20 74 68 69  ase) part of thi
dfd0: 73 20 74 65 73 74 20 6d 61 79 20 62 65 20 66 61  s test may be fa
dfe0: 6c 73 65 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  lse if the.  ** 
dff0: 63 75 72 72 65 6e 74 20 53 45 4c 45 43 54 20 69  current SELECT i
e000: 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64 20 73  s a correlated s
e010: 75 62 2d 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20  ub-query..  */. 
e020: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 44 69 73   for(i=0; i<pDis
e030: 74 69 6e 63 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  tinct->nExpr; i+
e040: 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 20  +){.    Expr *p 
e050: 3d 20 70 44 69 73 74 69 6e 63 74 2d 3e 61 5b 69  = pDistinct->a[i
e060: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28  ].pExpr;.    if(
e070: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
e080: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
e090: 69 42 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c  iBase && p->iCol
e0a0: 75 6d 6e 3c 30 20 29 20 72 65 74 75 72 6e 20 31  umn<0 ) return 1
e0b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  ;.  }..  /* Loop
e0c0: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 69 6e 64   through all ind
e0d0: 69 63 65 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  ices on the tabl
e0e0: 65 2c 20 63 68 65 63 6b 69 6e 67 20 65 61 63 68  e, checking each
e0f0: 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 6d 61   to see if it ma
e100: 6b 65 73 0a 20 20 2a 2a 20 74 68 65 20 44 49 53  kes.  ** the DIS
e110: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
e120: 72 65 64 75 6e 64 61 6e 74 2e 20 49 74 20 64 6f  redundant. It do
e130: 65 73 20 73 6f 20 69 66 3a 0a 20 20 2a 2a 0a 20  es so if:.  **. 
e140: 20 2a 2a 20 20 20 31 2e 20 54 68 65 20 69 6e 64   **   1. The ind
e150: 65 78 20 69 73 20 69 74 73 65 6c 66 20 55 4e 49  ex is itself UNI
e160: 51 55 45 2c 20 61 6e 64 0a 20 20 2a 2a 0a 20 20  QUE, and.  **.  
e170: 2a 2a 20 20 20 32 2e 20 41 6c 6c 20 6f 66 20 74  **   2. All of t
e180: 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  he columns in th
e190: 65 20 69 6e 64 65 78 20 61 72 65 20 65 69 74 68  e index are eith
e1a0: 65 72 20 70 61 72 74 20 6f 66 20 74 68 65 20 70  er part of the p
e1b0: 44 69 73 74 69 6e 63 74 0a 20 20 2a 2a 20 20 20  Distinct.  **   
e1c0: 20 20 20 6c 69 73 74 2c 20 6f 72 20 65 6c 73 65     list, or else
e1d0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
e1e0: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 74 65 72  e contains a ter
e1f0: 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 63  m of the form "c
e200: 6f 6c 3d 58 22 2c 0a 20 20 2a 2a 20 20 20 20 20  ol=X",.  **     
e210: 20 77 68 65 72 65 20 58 20 69 73 20 61 20 63 6f   where X is a co
e220: 6e 73 74 61 6e 74 20 76 61 6c 75 65 2e 20 54 68  nstant value. Th
e230: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
e240: 65 6e 63 65 73 20 6f 66 20 74 68 65 0a 20 20 2a  ences of the.  *
e250: 2a 20 20 20 20 20 20 63 6f 6d 70 61 72 69 73 6f  *      compariso
e260: 6e 20 61 6e 64 20 73 65 6c 65 63 74 2d 6c 69 73  n and select-lis
e270: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6d 75  t expressions mu
e280: 73 74 20 6d 61 74 63 68 20 74 68 6f 73 65 20 6f  st match those o
e290: 66 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a  f the index..  *
e2a0: 2f 0a 20 20 66 6f 72 28 70 49 64 78 3d 70 54 61  /.  for(pIdx=pTa
e2b0: 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78 3b  b->pIndex; pIdx;
e2c0: 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78   pIdx=pIdx->pNex
e2d0: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 64 78  t){.    if( pIdx
e2e0: 2d 3e 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 4e 6f  ->onError==OE_No
e2f0: 6e 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ne ) continue;. 
e300: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
e310: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b  dx->nColumn; i++
e320: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
e330: 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  l = pIdx->aiColu
e340: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
e350: 20 30 3d 3d 66 69 6e 64 54 65 72 6d 28 70 57 43   0==findTerm(pWC
e360: 2c 20 69 42 61 73 65 2c 20 69 43 6f 6c 2c 20 7e  , iBase, iCol, ~
e370: 28 42 69 74 6d 61 73 6b 29 30 2c 20 57 4f 5f 45  (Bitmask)0, WO_E
e380: 51 2c 20 70 49 64 78 29 20 0a 20 20 20 20 20 20  Q, pIdx) .      
e390: 20 26 26 20 30 3e 66 69 6e 64 49 6e 64 65 78 43   && 0>findIndexC
e3a0: 6f 6c 28 70 50 61 72 73 65 2c 20 70 44 69 73 74  ol(pParse, pDist
e3b0: 69 6e 63 74 2c 20 69 42 61 73 65 2c 20 70 49 64  inct, iBase, pId
e3c0: 78 2c 20 69 29 0a 20 20 20 20 20 20 29 7b 0a 20  x, i).      ){. 
e3d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e3e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e3f0: 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f  if( i==pIdx->nCo
e400: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lumn ){.      /*
e410: 20 54 68 69 73 20 69 6e 64 65 78 20 69 6d 70 6c   This index impl
e420: 69 65 73 20 74 68 61 74 20 74 68 65 20 44 49 53  ies that the DIS
e430: 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72 20  TINCT qualifier 
e440: 69 73 20 72 65 64 75 6e 64 61 6e 74 2e 20 2a 2f  is redundant. */
e450: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
e460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
e470: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e480: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
e490: 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61  cides if pIdx ca
e4a0: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74  n be used to sat
e4b0: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
e4c0: 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66  Y.** clause.  If
e4d0: 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75   it can, it retu
e4e0: 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20  rns 1.  If pIdx 
e4f0: 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74  cannot satisfy t
e500: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
e510: 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74  lause, this rout
e520: 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  ine returns 0..*
e530: 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
e540: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
e550: 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  use from a SELEC
e560: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54  T statement.  pT
e570: 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66  ab is the.** lef
e580: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20  t-most table in 
e590: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
e5a0: 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c  of that same SEL
e5b0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
e5c0: 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68  d.** the table h
e5d0: 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  as a cursor numb
e5e0: 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70  er of "base".  p
e5f0: 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20  Idx is an index 
e600: 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e  on pTab..**.** n
e610: 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d  EqCol is the num
e620: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
e630: 66 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20  f pIdx that are 
e640: 75 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79  used as equality
e650: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  .** constraints.
e660: 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63    Any of these c
e670: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69  olumns may be mi
e680: 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  ssing from the O
e690: 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73  RDER BY.** claus
e6a0: 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20  e and the match 
e6b0: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73  can still be a s
e6c0: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  uccess..**.** Al
e6d0: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
e6e0: 52 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74  RDER BY that mat
e6f0: 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  ch against the i
e700: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74  ndex must be eit
e710: 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45  her.** ASC or DE
e720: 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74  SC.  (Terms of t
e730: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
e740: 73 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  se past the end 
e750: 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69  of a UNIQUE.** i
e760: 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64  ndex do not need
e770: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73   to satisfy this
e780: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54   constraint.)  T
e790: 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20  he *pbRev value 
e7a0: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69  is.** set to 1 i
e7b0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
e7c0: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53  lause is all DES
e7d0: 43 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20  C and it is set 
e7e0: 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f  to 0 if.** the O
e7f0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
e800: 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74  s all ASC..*/.st
e810: 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69  atic int isSorti
e820: 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ngIndex(.  Parse
e830: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
e840: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
e850: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
e860: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
e870: 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72  t, /* Mapping fr
e880: 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  om table cursor 
e890: 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61  numbers to bitma
e8a0: 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ps */.  Index *p
e8b0: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
e8c0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
e8d0: 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
e8e0: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
e8f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
e900: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
e910: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f  e table to be so
e920: 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rted */.  ExprLi
e930: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
e940: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
e950: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
e960: 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20  t nEqCol,       
e970: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
e980: 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  of index columns
e990: 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61   with == constra
e9a0: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 77 73  ints */.  int ws
e9b0: 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
e9c0: 20 20 2f 2a 20 49 6e 64 65 78 20 75 73 61 67 65    /* Index usage
e9d0: 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74  s flags */.  int
e9e0: 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20   *pbRev         
e9f0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
ea00: 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20   if ORDER BY is 
ea10: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  DESC */.){.  int
ea20: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
ea30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ea40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
ea50: 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72 64 65 72  .  int sortOrder
ea60: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
ea70: 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64     /* XOR of ind
ea80: 65 78 20 61 6e 64 20 4f 52 44 45 52 20 42 59 20  ex and ORDER BY 
ea90: 73 6f 72 74 20 64 69 72 65 63 74 69 6f 6e 20 2a  sort direction *
eaa0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
eab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
ead0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
eae0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  */.  struct Expr
eaf0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d  List_item *pTerm
eb00: 3b 20 20 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f  ;    /* A term o
eb10: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
eb20: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  lause */.  sqlit
eb30: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
eb40: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 21 70 4f 72  >db;..  if( !pOr
eb50: 64 65 72 42 79 20 29 20 72 65 74 75 72 6e 20 30  derBy ) return 0
eb60: 3b 0a 20 20 69 66 28 20 77 73 46 6c 61 67 73 20  ;.  if( wsFlags 
eb70: 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
eb80: 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  N ) return 0;.  
eb90: 69 66 28 20 70 49 64 78 2d 3e 62 55 6e 6f 72 64  if( pIdx->bUnord
eba0: 65 72 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b  ered ) return 0;
ebb0: 0a 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ..  nTerm = pOrd
ebc0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
ebd0: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
ebe0: 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74  ;..  /* Argument
ebf0: 20 70 49 64 78 20 6d 75 73 74 20 65 69 74 68 65   pIdx must eithe
ec00: 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27 72 65  r point to a 're
ec10: 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65 78 20  al' named index 
ec20: 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20 2a 2a  structure, .  **
ec30: 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73 74 72   or an index str
ec40: 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74 65 64  ucture allocated
ec50: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 62 79   on the stack by
ec60: 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
ec70: 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72 65 73  ) to.  ** repres
ec80: 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20 69 6e  ent the rowid in
ec90: 64 65 78 20 74 68 61 74 20 69 73 20 70 61 72 74  dex that is part
eca0: 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c 65 2e   of every table.
ecb0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
ecc0: 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20 28 70  Idx->zName || (p
ecd0: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d 31 20  Idx->nColumn==1 
ece0: 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  && pIdx->aiColum
ecf0: 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a 20 20  n[0]==-1) );..  
ed00: 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73 20 6f  /* Match terms o
ed10: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
ed20: 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20 63 6f  lause against co
ed30: 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20 74 68  lumns of.  ** th
ed40: 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a 20 20  e index..  **.  
ed50: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 6e 64  ** Note that ind
ed60: 69 63 65 73 20 68 61 76 65 20 70 49 64 78 2d 3e  ices have pIdx->
ed70: 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61 72 20  nColumn regular 
ed80: 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20 20 2a  columns plus.  *
ed90: 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e 61 6c  * one additional
eda0: 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 69   column containi
edb0: 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20 20 54  ng the rowid.  T
edc0: 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a  he rowid column.
edd0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e 64 65    ** of the inde
ede0: 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f 77 65  x is also allowe
edf0: 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61 69 6e  d to match again
ee00: 73 74 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  st the ORDER BY.
ee10: 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a    ** clause..  *
ee20: 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70  /.  for(i=j=0, p
ee30: 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61  Term=pOrderBy->a
ee40: 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c 3d  ; j<nTerm && i<=
ee50: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
ee60: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
ee70: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
ee80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
ee90: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
eea0: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
eeb0: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
eec0: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
eed0: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
eee0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d   */.    int term
eef0: 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f  SortOrder; /* So
ef00: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
ef10: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 69 6e  s term */.    in
ef20: 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20 20 20  t iColumn;      
ef30: 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 6f 6c   /* The i-th col
ef40: 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
ef50: 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69 64 20  .  -1 for rowid 
ef60: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f 72 74  */.    int iSort
ef70: 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31 20 66  Order;    /* 1 f
ef80: 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72 20 41  or DESC, 0 for A
ef90: 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 69  SC on the i-th i
efa0: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ndex term */.   
efb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
efc0: 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ll; /* Name of t
efd0: 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71  he collating seq
efe0: 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68 20 69  uence for i-th i
eff0: 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a 20 20  ndex term */..  
f000: 20 20 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d    pExpr = pTerm-
f010: 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20  >pExpr;.    if( 
f020: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f  pExpr->op!=TK_CO
f030: 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69  LUMN || pExpr->i
f040: 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20  Table!=base ){. 
f050: 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20       /* Can not 
f060: 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72  use an index sor
f070: 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68  t on anything th
f080: 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75  at is not a colu
f090: 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20  mn in the.      
f0a0: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62  ** left-most tab
f0b0: 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63  le of the FROM c
f0c0: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 62  lause */.      b
f0d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f0e0: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
f0f0: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
f100: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
f110: 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  f( !pColl ){.   
f120: 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70     pColl = db->p
f130: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a  DfltColl;.    }.
f140: 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 7a 4e      if( pIdx->zN
f150: 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e  ame && i<pIdx->n
f160: 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
f170: 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e  iColumn = pIdx->
f180: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
f190: 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d     if( iColumn==
f1a0: 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50  pIdx->pTable->iP
f1b0: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Key ){.        i
f1c0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
f1d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f 72 74     }.      iSort
f1e0: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
f1f0: 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20  ortOrder[i];.   
f200: 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d     zColl = pIdx-
f210: 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20  >azColl[i];.    
f220: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 43 6f  }else{.      iCo
f230: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
f240: 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b   iSortOrder = 0;
f250: 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70  .      zColl = p
f260: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Coll->zName;.   
f270: 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78 70 72   }.    if( pExpr
f280: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75  ->iColumn!=iColu
f290: 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  mn || sqlite3Str
f2a0: 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d  ICmp(pColl->zNam
f2b0: 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20  e, zColl) ){.   
f2c0: 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20     /* Term j of 
f2d0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
f2e0: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  use does not mat
f2f0: 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74  ch column i of t
f300: 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  he index */.    
f310: 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29    if( i<nEqCol )
f320: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
f330: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
f340: 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69  that is constrai
f350: 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20  ned by == fails 
f360: 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20  to match an.    
f370: 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20      ** ORDER BY 
f380: 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b  term, that is OK
f390: 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74  .  Just ignore t
f3a0: 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  hat column of th
f3b0: 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  e index.        
f3c0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  */.        conti
f3d0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
f3e0: 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e 6e 43   if( i==pIdx->nC
f3f0: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
f400: 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e   /* Index column
f410: 20 69 20 69 73 20 74 68 65 20 72 6f 77 69 64 2e   i is the rowid.
f420: 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65 72 6d    All other term
f430: 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20 20 20  s match. */.    
f440: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
f460: 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  /* If an index c
f470: 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d  olumn fails to m
f480: 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20  atch and is not 
f490: 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d  constrained by =
f4a0: 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  =.        ** the
f4b0: 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e  n the index cann
f4c0: 6f 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f  ot satisfy the O
f4d0: 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69  RDER BY constrai
f4e0: 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  nt..        */. 
f4f0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
f500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f510: 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 2d     assert( pIdx-
f520: 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 7c  >aSortOrder!=0 |
f530: 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 3b  | iColumn==-1 );
f540: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
f550: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30  rm->sortOrder==0
f560: 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f   || pTerm->sortO
f570: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61  rder==1 );.    a
f580: 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72 64 65  ssert( iSortOrde
f590: 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f 72 64  r==0 || iSortOrd
f5a0: 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72  er==1 );.    ter
f5b0: 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69 53 6f  mSortOrder = iSo
f5c0: 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72 6d 2d  rtOrder ^ pTerm-
f5d0: 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20  >sortOrder;.    
f5e0: 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a  if( i>nEqCol ){.
f5f0: 20 20 20 20 20 20 69 66 28 20 74 65 72 6d 53 6f        if( termSo
f600: 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64  rtOrder!=sortOrd
f610: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  er ){.        /*
f620: 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c   Indices can onl
f630: 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c  y be used if all
f640: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
f650: 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20 20  past the.       
f660: 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e   ** equality con
f670: 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c  straints are all
f680: 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72 20   either DESC or 
f690: 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ASC. */.        
f6a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
f6b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f6c0: 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 74     sortOrder = t
f6d0: 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20  ermSortOrder;.  
f6e0: 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 20    }.    j++;.   
f6f0: 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 69 66   pTerm++;.    if
f700: 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21  ( iColumn<0 && !
f710: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
f720: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
f730: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
f740: 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  e) ){.      /* I
f750: 66 20 74 68 65 20 69 6e 64 65 78 65 64 20 63 6f  f the indexed co
f760: 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72 69 6d  lumn is the prim
f770: 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76 65 72  ary key and ever
f780: 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73 0a 20  ything matches. 
f790: 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72 20 61       ** so far a
f7a0: 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 4f  nd none of the O
f7b0: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 6f  RDER BY terms to
f7c0: 20 74 68 65 20 72 69 67 68 74 20 72 65 66 65 72   the right refer
f7d0: 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20 20 20  ence other.     
f7e0: 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68   ** tables in th
f7f0: 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77 65 20  e join, then we 
f800: 61 72 65 20 61 73 73 75 72 65 64 20 74 68 61 74  are assured that
f810: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 20 62   the index can b
f820: 65 20 75 73 65 64 20 0a 20 20 20 20 20 20 2a 2a  e used .      **
f830: 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75 73 65   to sort because
f840: 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
f850: 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64 20 73   is unique and s
f860: 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 6f 74  o none of the ot
f870: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  her.      ** col
f880: 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65 20 61  umns will make a
f890: 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a 20 20  ny difference.  
f8a0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a 20 3d      */.      j =
f8b0: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   nTerm;.    }.  
f8c0: 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20 73 6f  }..  *pbRev = so
f8d0: 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20 69 66  rtOrder!=0;.  if
f8e0: 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20  ( j>=nTerm ){.  
f8f0: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
f900: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
f910: 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65 72 65  lause are covere
f920: 64 20 62 79 20 74 68 69 73 20 69 6e 64 65 78 20  d by this index 
f930: 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  so.    ** this i
f940: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
f950: 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20 2a 2f   for sorting. */
f960: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
f970: 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d 3e 6f   }.  if( pIdx->o
f980: 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20  nError!=OE_None 
f990: 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c  && i==pIdx->nCol
f9a0: 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 28 77 73  umn.      && (ws
f9b0: 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  Flags & WHERE_CO
f9c0: 4c 55 4d 4e 5f 4e 55 4c 4c 29 3d 3d 30 0a 20 20  LUMN_NULL)==0.  
f9d0: 20 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63      && !referenc
f9e0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
f9f0: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
fa00: 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , j, base) ){.  
fa10: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
fa20: 66 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74  f this index mat
fa30: 63 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f  ch some prefix o
fa40: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
fa50: 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  lause.    ** and
fa60: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e   the index is UN
fa70: 49 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d  IQUE and no term
fa80: 73 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66  s on the tail of
fa90: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
faa0: 20 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65    ** clause refe
fab0: 72 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c  rence other tabl
fac0: 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49  es in a join.  I
fad0: 66 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72  f this is all tr
fae0: 75 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  ue then.    ** t
faf0: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
fb00: 73 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  se is superfluou
fb10: 73 2e 20 20 4e 6f 74 20 74 68 61 74 20 69 66 20  s.  Not that if 
fb20: 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20 20  the matching.   
fb30: 20 2a 2a 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73   ** condition is
fb40: 20 49 53 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68   IS NULL then th
fb50: 65 20 72 65 73 75 6c 74 20 69 73 20 6e 6f 74 20  e result is not 
fb60: 6e 65 63 65 73 73 61 72 69 6c 79 20 75 6e 69 71  necessarily uniq
fb70: 75 65 0a 20 20 20 20 2a 2a 20 65 76 65 6e 20 6f  ue.    ** even o
fb80: 6e 20 61 20 55 4e 49 51 55 45 20 69 6e 64 65 78  n a UNIQUE index
fb90: 2c 20 73 6f 20 64 69 73 61 6c 6c 6f 77 20 74 68  , so disallow th
fba0: 6f 73 65 20 63 61 73 65 73 2e 20 2a 2f 0a 20 20  ose cases. */.  
fbb0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
fbc0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fbd0: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
fbe0: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
fbf0: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
fc00: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
fc10: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
fc20: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
fc30: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
fc40: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
fc50: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
fc60: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
fc70: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  orming operation
fc80: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
fc90: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
fca0: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
fcb0: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
fcc0: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
fcd0: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
fce0: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
fcf0: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
fd00: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
fd10: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
fd20: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20  uble logN = 1;. 
fd30: 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a   double x = 10;.
fd40: 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
fd50: 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20      logN += 1;. 
fd60: 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a     x *= 10;.  }.
fd70: 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d    return logN;.}
fd80: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
fd90: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
fda0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
fdb0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
fdc0: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
fdd0: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
fde0: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
fdf0: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
fe00: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
fe10: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
fe20: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
fe30: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
fe40: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
fe50: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
fe60: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
fe70: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
fe80: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
fe90: 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
fea0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
feb0: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
fec0: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
fed0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
fee0: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
fef0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
ff00: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
ff10: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
ff20: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
ff30: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
ff40: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
ff50: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
ff60: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
ff70: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
ff80: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
ff90: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
ffa0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
ffb0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
ffc0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
ffd0: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
ffe0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
fff0: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
10000 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
10010 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
10020 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
10030 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
10040 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
10050 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
10060 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
10070 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
10080 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
10090 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
100a0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
100b0 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
100c0 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
100d0 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
100e0 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
100f0 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
10100 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
10110 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
10120 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
10130 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
10140 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
10150 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
10160 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
10170 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
10180 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
10190 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
101a0 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
101b0 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
101c0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
101d0 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
101e0 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
101f0 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
10200 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
10210 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
10220 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
10230 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
10240 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
10250 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
10260 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
10270 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
10280 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
10290 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
102a0 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23  imatedCost);.}.#
102b0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
102c0 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
102d0 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
102e0 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
102f0 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71  ndif../* .** Req
10300 75 69 72 65 64 20 62 65 63 61 75 73 65 20 62 65  uired because be
10310 73 74 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c  stIndex() is cal
10320 6c 65 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61  led by bestOrCla
10330 75 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73  useIndex() .*/.s
10340 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
10350 6e 64 65 78 28 0a 20 20 20 20 50 61 72 73 65 2a  ndex(.    Parse*
10360 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
10370 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
10380 74 65 6d 2a 2c 0a 20 20 20 20 42 69 74 6d 61 73  tem*,.    Bitmas
10390 6b 2c 20 42 69 74 6d 61 73 6b 2c 20 45 78 70 72  k, Bitmask, Expr
103a0 4c 69 73 74 2a 2c 20 57 68 65 72 65 43 6f 73 74  List*, WhereCost
103b0 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  *);../*.** This 
103c0 72 6f 75 74 69 6e 65 20 61 74 74 65 6d 70 74 73  routine attempts
103d0 20 74 6f 20 66 69 6e 64 20 61 6e 20 73 63 61 6e   to find an scan
103e0 6e 69 6e 67 20 73 74 72 61 74 65 67 79 20 74 68  ning strategy th
103f0 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  at can be used .
10400 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61  ** to optimize a
10410 6e 20 27 4f 52 27 20 65 78 70 72 65 73 73 69 6f  n 'OR' expressio
10420 6e 20 74 68 61 74 20 69 73 20 70 61 72 74 20 6f  n that is part o
10430 66 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  f a WHERE clause
10440 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 61 62  . .**.** The tab
10450 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
10460 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
10470 65 72 6d 20 70 53 72 63 20 6d 61 79 20 62 65 20  erm pSrc may be 
10480 65 69 74 68 65 72 20 61 0a 2a 2a 20 72 65 67 75  either a.** regu
10490 6c 61 72 20 42 2d 54 72 65 65 20 74 61 62 6c 65  lar B-Tree table
104a0 20 6f 72 20 61 20 76 69 72 74 75 61 6c 20 74 61   or a virtual ta
104b0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ble..*/.static v
104c0 6f 69 64 20 62 65 73 74 4f 72 43 6c 61 75 73 65  oid bestOrClause
104d0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
104e0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
104f0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
10500 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
10510 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
10520 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
10530 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
10540 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
10550 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
10560 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
10570 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
10580 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
10590 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
105a0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
105b0 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
105c0 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69  lable for indexi
105d0 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
105e0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
105f0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
10600 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
10610 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
10620 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
10630 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
10640 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
10650 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
10660 6f 73 74 20 2a 70 43 6f 73 74 20 20 20 20 20 20  ost *pCost      
10670 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20        /* Lowest 
10680 63 6f 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  cost query plan 
10690 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  */.){.#ifndef SQ
106a0 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54  LITE_OMIT_OR_OPT
106b0 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73  IMIZATION.  cons
106c0 74 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72  t int iCur = pSr
106d0 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a  c->iCursor;   /*
106e0 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
106f0 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61  he table to be a
10700 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ccessed */.  con
10710 73 74 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53  st Bitmask maskS
10720 72 63 20 3d 20 67 65 74 4d 61 73 6b 28 70 57 43  rc = getMask(pWC
10730 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72  ->pMaskSet, iCur
10740 29 3b 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66  );  /* Bitmask f
10750 6f 72 20 70 53 72 63 20 2a 2f 0a 20 20 57 68 65  or pSrc */.  Whe
10760 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70  reTerm * const p
10770 57 43 45 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b  WCEnd = &pWC->a[
10780 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20  pWC->nTerm];    
10790 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57      /* End of pW
107a0 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72  C->a[] */.  Wher
107b0 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
107d0 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   A single term o
107e0 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
107f0 73 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 6f 20 4f  se */..  /* No O
10800 52 2d 63 6c 61 75 73 65 20 6f 70 74 69 6d 69 7a  R-clause optimiz
10810 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 69 66  ation allowed if
10820 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
10830 6f 72 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63  or NOT INDEXED c
10840 6c 61 75 73 65 73 0a 20 20 2a 2a 20 61 72 65 20  lauses.  ** are 
10850 75 73 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 53  used */.  if( pS
10860 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 20 7c  rc->notIndexed |
10870 7c 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 21 3d  | pSrc->pIndex!=
10880 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
10890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 61 72 63  .  }..  /* Searc
108a0 68 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  h the WHERE clau
108b0 73 65 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75  se terms for a u
108c0 73 61 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d  sable WO_OR term
108d0 2e 20 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d  . */.  for(pTerm
108e0 3d 70 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70  =pWC->a; pTerm<p
108f0 57 43 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b  WCEnd; pTerm++){
10900 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
10910 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
10920 20 0a 20 20 20 20 20 26 26 20 28 28 70 54 65 72   .     && ((pTer
10930 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e  m->prereqAll & ~
10940 6d 61 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65  maskSrc) & notRe
10950 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  ady)==0.     && 
10960 28 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66  (pTerm->u.pOrInf
10970 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d  o->indexable & m
10980 61 73 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20  askSrc)!=0 .    
10990 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c  ){.      WhereCl
109a0 61 75 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72  ause * const pOr
109b0 57 43 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70  WC = &pTerm->u.p
109c0 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20  OrInfo->wc;.    
109d0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
109e0 6e 73 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26  nst pOrWCEnd = &
109f0 70 4f 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e  pOrWC->a[pOrWC->
10a00 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68  nTerm];.      Wh
10a10 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d  ereTerm *pOrTerm
10a20 3b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67  ;.      int flag
10a30 73 20 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f  s = WHERE_MULTI_
10a40 4f 52 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  OR;.      double
10a50 20 72 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20   rTotal = 0;.   
10a60 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d     double nRow =
10a70 20 30 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73   0;.      Bitmas
10a80 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20  k used = 0;..   
10a90 20 20 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70     for(pOrTerm=p
10aa0 4f 72 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d  OrWC->a; pOrTerm
10ab0 3c 70 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65  <pOrWCEnd; pOrTe
10ac0 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57  rm++){.        W
10ad0 68 65 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f  hereCost sTermCo
10ae0 73 74 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52  st;.        WHER
10af0 45 54 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c  ETRACE(("... Mul
10b00 74 69 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74  ti-index OR test
10b10 69 6e 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20  ing for term %d 
10b20 6f 66 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20  of %d....\n", . 
10b30 20 20 20 20 20 20 20 20 20 28 70 4f 72 54 65 72           (pOrTer
10b40 6d 20 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28  m - pOrWC->a), (
10b50 70 54 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a  pTerm - pWC->a).
10b60 20 20 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20          ));.    
10b70 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d      if( pOrTerm-
10b80 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41  >eOperator==WO_A
10b90 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ND ){.          
10ba0 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e  WhereClause *pAn
10bb0 64 57 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e  dWC = &pOrTerm->
10bc0 75 2e 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a  u.pAndInfo->wc;.
10bd0 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49 6e            bestIn
10be0 64 65 78 28 70 50 61 72 73 65 2c 20 70 41 6e 64  dex(pParse, pAnd
10bf0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
10c00 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c 20 30 2c  dy, notValid, 0,
10c10 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20   &sTermCost);.  
10c20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10c30 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  pOrTerm->leftCur
10c40 73 6f 72 3d 3d 69 43 75 72 20 29 7b 0a 20 20 20  sor==iCur ){.   
10c50 20 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75         WhereClau
10c60 73 65 20 74 65 6d 70 57 43 3b 0a 20 20 20 20 20  se tempWC;.     
10c70 20 20 20 20 20 74 65 6d 70 57 43 2e 70 50 61 72       tempWC.pPar
10c80 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72 73 65  se = pWC->pParse
10c90 3b 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70  ;.          temp
10ca0 57 43 2e 70 4d 61 73 6b 53 65 74 20 3d 20 70 57  WC.pMaskSet = pW
10cb0 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 0a 20 20 20  C->pMaskSet;.   
10cc0 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6f 70         tempWC.op
10cd0 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20 20 20 20 20   = TK_AND;.     
10ce0 20 20 20 20 20 74 65 6d 70 57 43 2e 61 20 3d 20       tempWC.a = 
10cf0 70 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 20  pOrTerm;.       
10d00 20 20 20 74 65 6d 70 57 43 2e 6e 54 65 72 6d 20     tempWC.nTerm 
10d10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
10d20 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c  estIndex(pParse,
10d30 20 26 74 65 6d 70 57 43 2c 20 70 53 72 63 2c 20   &tempWC, pSrc, 
10d40 6e 6f 74 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c  notReady, notVal
10d50 69 64 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73  id, 0, &sTermCos
10d60 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  t);.        }els
10d70 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  e{.          con
10d80 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
10d90 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61 6c 20  .        rTotal 
10da0 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72 43 6f  += sTermCost.rCo
10db0 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77  st;.        nRow
10dc0 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 70 6c   += sTermCost.pl
10dd0 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20  an.nRow;.       
10de0 20 75 73 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f   used |= sTermCo
10df0 73 74 2e 75 73 65 64 3b 0a 20 20 20 20 20 20 20  st.used;.       
10e00 20 69 66 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f   if( rTotal>=pCo
10e10 73 74 2d 3e 72 43 6f 73 74 20 29 20 62 72 65 61  st->rCost ) brea
10e20 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
10e30 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
10e40 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
10e50 75 73 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68  use, increase th
10e60 65 20 73 63 61 6e 20 63 6f 73 74 20 74 6f 20 61  e scan cost to a
10e70 63 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a  ccount .      **
10e80 20 66 6f 72 20 74 68 65 20 63 6f 73 74 20 6f 66   for the cost of
10e90 20 74 68 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20   the sort. */.  
10ea0 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79      if( pOrderBy
10eb0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 57  !=0 ){.        W
10ec0 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
10ed0 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61 73 65  sorting increase
10ee0 73 20 4f 52 20 63 6f 73 74 20 25 2e 39 67 20 74  s OR cost %.9g t
10ef0 6f 20 25 2e 39 67 5c 6e 22 2c 0a 20 20 20 20 20  o %.9g\n",.     
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
10f10 54 6f 74 61 6c 2c 20 72 54 6f 74 61 6c 2b 6e 52  Total, rTotal+nR
10f20 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 29  ow*estLog(nRow))
10f30 29 3b 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61  );.        rTota
10f40 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f 67  l += nRow*estLog
10f50 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a  (nRow);.      }.
10f60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
10f70 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e 69 6e   cost of scannin
10f80 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f 52 20  g using this OR 
10f90 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d 69 7a  term for optimiz
10fa0 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a  ation is.      *
10fb0 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  * less than the 
10fc0 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73 74 6f  current cost sto
10fd0 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20 72 65  red in pCost, re
10fe0 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
10ff0 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 70  ts.      ** of p
11000 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 57  Cost. */.      W
11010 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 20  HERETRACE(("... 
11020 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52 20 63  multi-index OR c
11030 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d 25 2e  ost=%.9g nrow=%.
11040 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c 20 6e  9g\n", rTotal, n
11050 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69 66 28  Row));.      if(
11060 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d 3e 72   rTotal<pCost->r
11070 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Cost ){.        
11080 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 72  pCost->rCost = r
11090 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 70  Total;.        p
110a0 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65  Cost->used = use
110b0 64 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74  d;.        pCost
110c0 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e 52  ->plan.nRow = nR
110d0 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 73  ow;.        pCos
110e0 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
110f0 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
11100 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
11110 54 65 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20  Term = pTerm;.  
11120 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
11130 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11140 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
11150 41 54 49 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e  ATION */.}..#ifn
11160 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11170 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
11180 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
11190 45 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  E if the WHERE c
111a0 6c 61 75 73 65 20 74 65 72 6d 20 70 54 65 72 6d  lause term pTerm
111b0 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 77 68   is of a form wh
111c0 65 72 65 20 69 74 0a 2a 2a 20 63 6f 75 6c 64 20  ere it.** could 
111d0 62 65 20 75 73 65 64 20 77 69 74 68 20 61 6e 20  be used with an 
111e0 69 6e 64 65 78 20 74 6f 20 61 63 63 65 73 73 20  index to access 
111f0 70 53 72 63 2c 20 61 73 73 75 6d 69 6e 67 20 61  pSrc, assuming a
11200 6e 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  n appropriate.**
11210 20 69 6e 64 65 78 20 65 78 69 73 74 65 64 2e 0a   index existed..
11220 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
11230 72 6d 43 61 6e 44 72 69 76 65 49 6e 64 65 78 28  rmCanDriveIndex(
11240 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
11250 65 72 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  erm,            
11260 20 20 2f 2a 20 57 48 45 52 45 20 63 6c 61 75 73    /* WHERE claus
11270 65 20 74 65 72 6d 20 74 6f 20 63 68 65 63 6b 20  e term to check 
11280 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
11290 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20  ist_item *pSrc, 
112a0 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 77 65 20      /* Table we 
112b0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 61 63  are trying to ac
112c0 63 65 73 73 20 2a 2f 0a 20 20 42 69 74 6d 61 73  cess */.  Bitmas
112d0 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20 20  k notReady      
112e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c           /* Tabl
112f0 65 73 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f 70  es in outer loop
11300 73 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f  s of the join */
11310 0a 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a  .){.  char aff;.
11320 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
11330 74 43 75 72 73 6f 72 21 3d 70 53 72 63 2d 3e 69  tCursor!=pSrc->i
11340 43 75 72 73 6f 72 20 29 20 72 65 74 75 72 6e 20  Cursor ) return 
11350 30 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  0;.  if( pTerm->
11360 65 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51  eOperator!=WO_EQ
11370 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
11380 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
11390 71 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64  qRight & notRead
113a0 79 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30  y)!=0 ) return 0
113b0 3b 0a 20 20 61 66 66 20 3d 20 70 53 72 63 2d 3e  ;.  aff = pSrc->
113c0 70 54 61 62 2d 3e 61 43 6f 6c 5b 70 54 65 72 6d  pTab->aCol[pTerm
113d0 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 5d 2e  ->u.leftColumn].
113e0 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28 20  affinity;.  if( 
113f0 21 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66  !sqlite3IndexAff
11400 69 6e 69 74 79 4f 6b 28 70 54 65 72 6d 2d 3e 70  inityOk(pTerm->p
11410 45 78 70 72 2c 20 61 66 66 29 20 29 20 72 65 74  Expr, aff) ) ret
11420 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
11430 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  1;.}.#endif..#if
11440 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11450 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
11460 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 71 75  ./*.** If the qu
11470 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 70 53 72  ery plan for pSr
11480 63 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 70  c specified in p
11490 43 6f 73 74 20 69 73 20 61 20 66 75 6c 6c 20 74  Cost is a full t
114a0 61 62 6c 65 20 73 63 61 6e 0a 2a 2a 20 61 6e 64  able scan.** and
114b0 20 69 6e 64 65 78 69 6e 67 20 69 73 20 61 6c 6c   indexing is all
114c0 6f 77 73 20 28 69 66 20 74 68 65 72 65 20 69 73  ows (if there is
114d0 20 6e 6f 20 4e 4f 54 20 49 4e 44 45 58 45 44 20   no NOT INDEXED 
114e0 63 6c 61 75 73 65 29 20 61 6e 64 20 69 74 0a 2a  clause) and it.*
114f0 2a 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 63 6f  * possible to co
11500 6e 73 74 72 75 63 74 20 61 20 74 72 61 6e 73 69  nstruct a transi
11510 65 6e 74 20 69 6e 64 65 78 20 74 68 61 74 20 77  ent index that w
11520 6f 75 6c 64 20 70 65 72 66 6f 72 6d 20 62 65 74  ould perform bet
11530 74 65 72 0a 2a 2a 20 74 68 61 6e 20 61 20 66 75  ter.** than a fu
11540 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 65 76  ll table scan ev
11550 65 6e 20 77 68 65 6e 20 74 68 65 20 63 6f 73 74  en when the cost
11560 20 6f 66 20 63 6f 6e 73 74 72 75 63 74 69 6e 67   of constructing
11570 20 74 68 65 20 69 6e 64 65 78 0a 2a 2a 20 69 73   the index.** is
11580 20 74 61 6b 65 6e 20 69 6e 74 6f 20 61 63 63 6f   taken into acco
11590 75 6e 74 2c 20 74 68 65 6e 20 61 6c 74 65 72 20  unt, then alter 
115a0 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 74  the query plan t
115b0 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 74 72 61  o use the.** tra
115c0 6e 73 69 65 6e 74 20 69 6e 64 65 78 2e 0a 2a 2f  nsient index..*/
115d0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
115e0 74 41 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28  tAutomaticIndex(
115f0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11600 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11610 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11620 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11630 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11650 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11660 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
11670 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
11680 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
11690 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
116a0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
116b0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
116c0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
116d0 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
116e0 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 57 68  vailable */.  Wh
116f0 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
11700 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
11710 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
11720 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 64 6f 75 62  lan */.){.  doub
11730 6c 65 20 6e 54 61 62 6c 65 52 6f 77 3b 20 20 20  le nTableRow;   
11740 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 73 20          /* Rows 
11750 69 6e 20 74 68 65 20 69 6e 70 75 74 20 74 61 62  in the input tab
11760 6c 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6c  le */.  double l
11770 6f 67 4e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ogN;            
11780 20 20 20 20 2f 2a 20 6c 6f 67 28 6e 54 61 62 6c      /* log(nTabl
11790 65 52 6f 77 29 20 2a 2f 0a 20 20 64 6f 75 62 6c  eRow) */.  doubl
117a0 65 20 63 6f 73 74 54 65 6d 70 49 64 78 3b 20 20  e costTempIdx;  
117b0 20 20 20 20 20 20 20 2f 2a 20 70 65 72 2d 71 75         /* per-qu
117c0 65 72 79 20 63 6f 73 74 20 6f 66 20 74 68 65 20  ery cost of the 
117d0 74 72 61 6e 73 69 65 6e 74 20 69 6e 64 65 78 20  transient index 
117e0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
117f0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
11800 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
11810 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
11820 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
11830 54 65 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20  Term *pWCEnd;   
11840 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66         /* End of
11850 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 54   pWC->a[] */.  T
11860 61 62 6c 65 20 2a 70 54 61 62 6c 65 3b 20 20 20  able *pTable;   
11870 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
11880 62 6c 65 20 74 68 74 20 6d 69 67 68 74 20 62 65  ble tht might be
11890 20 69 6e 64 65 78 65 64 20 2a 2f 0a 0a 20 20 69   indexed */..  i
118a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  f( pParse->nQuer
118b0 79 4c 6f 6f 70 3c 3d 28 64 6f 75 62 6c 65 29 31  yLoop<=(double)1
118c0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65   ){.    /* There
118d0 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20   is no point in 
118e0 62 75 69 6c 64 69 6e 67 20 61 6e 20 61 75 74 6f  building an auto
118f0 6d 61 74 69 63 20 69 6e 64 65 78 20 66 6f 72 20  matic index for 
11900 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 2a 2f  a single scan */
11910 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
11920 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
11930 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
11940 54 45 5f 41 75 74 6f 49 6e 64 65 78 29 3d 3d 30  TE_AutoIndex)==0
11950 20 29 7b 0a 20 20 20 20 2f 2a 20 41 75 74 6f 6d   ){.    /* Autom
11960 61 74 69 63 20 69 6e 64 69 63 65 73 20 61 72 65  atic indices are
11970 20 64 69 73 61 62 6c 65 64 20 61 74 20 72 75 6e   disabled at run
11980 2d 74 69 6d 65 20 2a 2f 0a 20 20 20 20 72 65 74  -time */.    ret
11990 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28  urn;.  }.  if( (
119a0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
119b0 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
119c0 46 55 4c 4c 53 43 41 4e 29 21 3d 30 20 29 7b 0a  FULLSCAN)!=0 ){.
119d0 20 20 20 20 2f 2a 20 57 65 20 61 6c 72 65 61 64      /* We alread
119e0 79 20 68 61 76 65 20 73 6f 6d 65 20 6b 69 6e 64  y have some kind
119f0 20 6f 66 20 69 6e 64 65 78 20 69 6e 20 75 73 65   of index in use
11a00 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 2e   for this query.
11a10 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
11a20 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e    }.  if( pSrc->
11a30 6e 6f 74 49 6e 64 65 78 65 64 20 29 7b 0a 20 20  notIndexed ){.  
11a40 20 20 2f 2a 20 54 68 65 20 4e 4f 54 20 49 4e 44    /* The NOT IND
11a50 45 58 45 44 20 63 6c 61 75 73 65 20 61 70 70 65  EXED clause appe
11a60 61 72 73 20 69 6e 20 74 68 65 20 53 51 4c 2e 20  ars in the SQL. 
11a70 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
11a80 20 7d 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 69   }.  if( pSrc->i
11a90 73 43 6f 72 72 65 6c 61 74 65 64 20 29 7b 0a 20  sCorrelated ){. 
11aa0 20 20 20 2f 2a 20 54 68 65 20 73 6f 75 72 63 65     /* The source
11ab0 20 69 73 20 61 20 63 6f 72 72 65 6c 61 74 65 64   is a correlated
11ac0 20 73 75 62 2d 71 75 65 72 79 2e 20 4e 6f 20 70   sub-query. No p
11ad0 6f 69 6e 74 20 69 6e 20 69 6e 64 65 78 69 6e 67  oint in indexing
11ae0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75   it. */.    retu
11af0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  rn;.  }..  asser
11b00 74 28 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72  t( pParse->nQuer
11b10 79 4c 6f 6f 70 20 3e 3d 20 28 64 6f 75 62 6c 65  yLoop >= (double
11b20 29 31 20 29 3b 0a 20 20 70 54 61 62 6c 65 20 3d  )1 );.  pTable =
11b30 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 6e   pSrc->pTab;.  n
11b40 54 61 62 6c 65 52 6f 77 20 3d 20 70 54 61 62 6c  TableRow = pTabl
11b50 65 2d 3e 6e 52 6f 77 45 73 74 3b 0a 20 20 6c 6f  e->nRowEst;.  lo
11b60 67 4e 20 3d 20 65 73 74 4c 6f 67 28 6e 54 61 62  gN = estLog(nTab
11b70 6c 65 52 6f 77 29 3b 0a 20 20 63 6f 73 74 54 65  leRow);.  costTe
11b80 6d 70 49 64 78 20 3d 20 32 2a 6c 6f 67 4e 2a 28  mpIdx = 2*logN*(
11b90 6e 54 61 62 6c 65 52 6f 77 2f 70 50 61 72 73 65  nTableRow/pParse
11ba0 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 20 2b 20 31  ->nQueryLoop + 1
11bb0 29 3b 0a 20 20 69 66 28 20 63 6f 73 74 54 65 6d  );.  if( costTem
11bc0 70 49 64 78 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f  pIdx>=pCost->rCo
11bd0 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  st ){.    /* The
11be0 20 63 6f 73 74 20 6f 66 20 63 72 65 61 74 69 6e   cost of creatin
11bf0 67 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20  g the transient 
11c00 74 61 62 6c 65 20 77 6f 75 6c 64 20 62 65 20 67  table would be g
11c10 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20  reater than.    
11c20 2a 2a 20 64 6f 69 6e 67 20 74 68 65 20 66 75 6c  ** doing the ful
11c30 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 2a 2f 0a  l table scan */.
11c40 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11c50 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
11c60 20 61 6e 79 20 65 71 75 61 6c 69 74 79 20 63 6f   any equality co
11c70 6d 70 61 72 69 73 6f 6e 20 74 65 72 6d 20 2a 2f  mparison term */
11c80 0a 20 20 70 57 43 45 6e 64 20 3d 20 26 70 57 43  .  pWCEnd = &pWC
11c90 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d 3b  ->a[pWC->nTerm];
11ca0 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57 43  .  for(pTerm=pWC
11cb0 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45 6e  ->a; pTerm<pWCEn
11cc0 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  d; pTerm++){.   
11cd0 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69 76   if( termCanDriv
11ce0 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70 53  eIndex(pTerm, pS
11cf0 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29 7b  rc, notReady) ){
11d00 0a 20 20 20 20 20 20 57 48 45 52 45 54 52 41 43  .      WHERETRAC
11d10 45 28 28 22 61 75 74 6f 2d 69 6e 64 65 78 20 72  E(("auto-index r
11d20 65 64 75 63 65 73 20 63 6f 73 74 20 66 72 6f 6d  educes cost from
11d30 20 25 2e 31 66 20 74 6f 20 25 2e 31 66 5c 6e 22   %.1f to %.1f\n"
11d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11d50 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f        pCost->rCo
11d60 73 74 2c 20 63 6f 73 74 54 65 6d 70 49 64 78 29  st, costTempIdx)
11d70 29 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  );.      pCost->
11d80 72 43 6f 73 74 20 3d 20 63 6f 73 74 54 65 6d 70  rCost = costTemp
11d90 49 64 78 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Idx;.      pCost
11da0 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6c 6f  ->plan.nRow = lo
11db0 67 4e 20 2b 20 31 3b 0a 20 20 20 20 20 20 70 43  gN + 1;.      pC
11dc0 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
11dd0 73 20 3d 20 57 48 45 52 45 5f 54 45 4d 50 5f 49  s = WHERE_TEMP_I
11de0 4e 44 45 58 3b 0a 20 20 20 20 20 20 70 43 6f 73  NDEX;.      pCos
11df0 74 2d 3e 75 73 65 64 20 3d 20 70 54 65 72 6d 2d  t->used = pTerm-
11e00 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
11e10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
11e20 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
11e30 65 66 69 6e 65 20 62 65 73 74 41 75 74 6f 6d 61  efine bestAutoma
11e40 74 69 63 49 6e 64 65 78 28 41 2c 42 2c 43 2c 44  ticIndex(A,B,C,D
11e50 2c 45 29 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ,E)  /* no-op */
11e60 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11e70 45 5f 4f 4d 49 54 5f 41 55 54 4f 4d 41 54 49 43  E_OMIT_AUTOMATIC
11e80 5f 49 4e 44 45 58 20 2a 2f 0a 0a 0a 23 69 66 6e  _INDEX */...#ifn
11e90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11ea0 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
11eb0 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
11ec0 6f 64 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  ode to construct
11ed0 20 74 68 65 20 49 6e 64 65 78 20 6f 62 6a 65 63   the Index objec
11ee0 74 20 66 6f 72 20 61 6e 20 61 75 74 6f 6d 61 74  t for an automat
11ef0 69 63 20 69 6e 64 65 78 0a 2a 2a 20 61 6e 64 20  ic index.** and 
11f00 74 6f 20 73 65 74 20 75 70 20 74 68 65 20 57 68  to set up the Wh
11f10 65 72 65 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20  ereLevel object 
11f20 70 4c 65 76 65 6c 20 73 6f 20 74 68 61 74 20 74  pLevel so that t
11f30 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
11f40 72 0a 2a 2a 20 6d 61 6b 65 73 20 75 73 65 20 6f  r.** makes use o
11f50 66 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  f the automatic 
11f60 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
11f70 20 76 6f 69 64 20 63 6f 6e 73 74 72 75 63 74 41   void constructA
11f80 75 74 6f 6d 61 74 69 63 49 6e 64 65 78 28 0a 20  utomaticIndex(. 
11f90 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11fb0 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
11fc0 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
11fd0 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
11fe0 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
11ff0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
12000 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
12010 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
12020 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
12030 6d 20 74 6f 20 67 65 74 20 74 68 65 20 6e 65 78  m to get the nex
12040 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  t index */.  Bit
12050 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
12060 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
12070 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74   of cursors that
12080 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62   are not availab
12090 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  le */.  WhereLev
120a0 65 6c 20 2a 70 4c 65 76 65 6c 20 20 20 20 20 20  el *pLevel      
120b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
120c0 20 69 6e 64 65 78 20 68 65 72 65 20 2a 2f 0a 29   index here */.)
120d0 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 3b  {.  int nColumn;
120e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  /* Number of col
12100 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6e 73  umns in the cons
12110 74 72 75 63 74 65 64 20 69 6e 64 65 78 20 2a 2f  tructed index */
12120 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
12130 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 2f  erm;           /
12140 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d 20  * A single term 
12150 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
12160 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  use */.  WhereTe
12170 72 6d 20 2a 70 57 43 45 6e 64 3b 20 20 20 20 20  rm *pWCEnd;     
12180 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 70       /* End of p
12190 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74  WC->a[] */.  int
121a0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
121b0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
121c0 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
121d0 64 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20  d for pIdx */.  
121e0 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
121f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
12200 62 6a 65 63 74 20 64 65 73 63 72 69 62 69 6e 67  bject describing
12210 20 74 68 65 20 74 72 61 6e 73 69 65 6e 74 20 69   the transient i
12220 6e 64 65 78 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ndex */.  Vdbe *
12230 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
12240 20 20 20 20 20 20 2f 2a 20 50 72 65 70 61 72 65        /* Prepare
12250 64 20 73 74 61 74 65 6d 65 6e 74 20 75 6e 64 65  d statement unde
12260 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
12270 2f 0a 20 20 69 6e 74 20 72 65 67 49 73 49 6e 69  /.  int regIsIni
12280 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
12290 2f 2a 20 52 65 67 69 73 74 65 72 20 73 65 74 20  /* Register set 
122a0 62 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  by initializatio
122b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 49  n */.  int addrI
122c0 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
122d0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
122e0 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
122f0 69 6f 6e 20 62 79 70 61 73 73 20 6a 75 6d 70 20  ion bypass jump 
12300 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  */.  Table *pTab
12310 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
12320 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65   /* The table be
12330 69 6e 67 20 69 6e 64 65 78 65 64 20 2a 2f 0a 20  ing indexed */. 
12340 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 69 6e   KeyInfo *pKeyin
12350 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
12360 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Key information 
12370 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
12380 20 20 20 0a 20 20 69 6e 74 20 61 64 64 72 54 6f     .  int addrTo
12390 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
123a0 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74 68 65 20    /* Top of the 
123b0 69 6e 64 65 78 20 66 69 6c 6c 20 6c 6f 6f 70 20  index fill loop 
123c0 2a 2f 0a 20 20 69 6e 74 20 72 65 67 52 65 63 6f  */.  int regReco
123d0 72 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rd;             
123e0 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
123f0 64 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 72 65  ding an index re
12400 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  cord */.  int n;
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
12430 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
12440 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
12450 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
12460 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
12470 74 20 6d 78 42 69 74 43 6f 6c 3b 20 20 20 20 20  t mxBitCol;     
12480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
12490 69 6d 75 6d 20 63 6f 6c 75 6d 6e 20 69 6e 20 70  imum column in p
124a0 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 2a 2f 0a  Src->colUsed */.
124b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
124c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
124d0 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   Collating seque
124e0 6e 63 65 20 74 6f 20 6f 6e 20 61 20 63 6f 6c 75  nce to on a colu
124f0 6d 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  mn */.  Bitmask 
12500 69 64 78 43 6f 6c 73 3b 20 20 20 20 20 20 20 20  idxCols;        
12510 20 20 20 20 2f 2a 20 42 69 74 6d 61 70 20 6f 66      /* Bitmap of
12520 20 63 6f 6c 75 6d 6e 73 20 75 73 65 64 20 66 6f   columns used fo
12530 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
12540 42 69 74 6d 61 73 6b 20 65 78 74 72 61 43 6f 6c  Bitmask extraCol
12550 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  s;          /* B
12560 69 74 6d 61 70 20 6f 66 20 61 64 64 69 74 69 6f  itmap of additio
12570 6e 61 6c 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 0a  nal columns */..
12580 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
12590 64 65 20 74 6f 20 73 6b 69 70 20 6f 76 65 72 20  de to skip over 
125a0 74 68 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64  the creation and
125b0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
125c0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  of the.  ** tran
125d0 73 69 65 6e 74 20 69 6e 64 65 78 20 6f 6e 20 32  sient index on 2
125e0 6e 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e  nd and subsequen
125f0 74 20 69 74 65 72 61 74 69 6f 6e 73 20 6f 66 20  t iterations of 
12600 74 68 65 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 76  the loop. */.  v
12610 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
12620 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d 30  ;.  assert( v!=0
12630 20 29 3b 0a 20 20 72 65 67 49 73 49 6e 69 74 20   );.  regIsInit 
12640 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
12650 3b 0a 20 20 61 64 64 72 49 6e 69 74 20 3d 20 73  ;.  addrInit = s
12660 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
12670 28 76 2c 20 4f 50 5f 4f 6e 63 65 2c 20 72 65 67  (v, OP_Once, reg
12680 49 73 49 6e 69 74 29 3b 0a 0a 20 20 2f 2a 20 43  IsInit);..  /* C
12690 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
126a0 6f 66 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  of columns that 
126b0 77 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f  will be added to
126c0 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20   the index.  ** 
126d0 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 74 63  and used to matc
126e0 68 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63  h WHERE clause c
126f0 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
12700 6e 43 6f 6c 75 6d 6e 20 3d 20 30 3b 0a 20 20 70  nColumn = 0;.  p
12710 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
12720 61 62 3b 0a 20 20 70 57 43 45 6e 64 20 3d 20 26  ab;.  pWCEnd = &
12730 70 57 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72  pWC->a[pWC->nTer
12740 6d 5d 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20  m];.  idxCols = 
12750 30 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  0;.  for(pTerm=p
12760 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
12770 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
12780 20 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72     if( termCanDr
12790 69 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20  iveIndex(pTerm, 
127a0 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20  pSrc, notReady) 
127b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
127c0 6c 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66  l = pTerm->u.lef
127d0 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42  tColumn;.      B
127e0 69 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69  itmask cMask = i
127f0 43 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74  Col>=BMS ? ((Bit
12800 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29  mask)1)<<(BMS-1)
12810 20 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   : ((Bitmask)1)<
12820 3c 69 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73  <iCol;.      tes
12830 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
12840 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
12850 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20  se( iCol==BMS-1 
12860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 64  );.      if( (id
12870 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b 29 3d 3d  xCols & cMask)==
12880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 43 6f  0 ){.        nCo
12890 6c 75 6d 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20  lumn++;.        
128a0 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73 6b  idxCols |= cMask
128b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
128c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 43    }.  assert( nC
128d0 6f 6c 75 6d 6e 3e 30 20 29 3b 0a 20 20 70 4c 65  olumn>0 );.  pLe
128e0 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20  vel->plan.nEq = 
128f0 6e 43 6f 6c 75 6d 6e 3b 0a 0a 20 20 2f 2a 20 43  nColumn;..  /* C
12900 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
12910 6f 66 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f  of additional co
12920 6c 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20  lumns needed to 
12930 63 72 65 61 74 65 20 61 0a 20 20 2a 2a 20 63 6f  create a.  ** co
12940 76 65 72 69 6e 67 20 69 6e 64 65 78 2e 20 20 41  vering index.  A
12950 20 22 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78   "covering index
12960 22 20 69 73 20 61 6e 20 69 6e 64 65 78 20 74 68  " is an index th
12970 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 0a  at contains all.
12980 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 74 68 61    ** columns tha
12990 74 20 61 72 65 20 6e 65 65 64 65 64 20 62 79 20  t are needed by 
129a0 74 68 65 20 71 75 65 72 79 2e 20 20 57 69 74 68  the query.  With
129b0 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
129c0 78 2c 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  x, the.  ** orig
129d0 69 6e 61 6c 20 74 61 62 6c 65 20 6e 65 76 65 72  inal table never
129e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 61 63 63   needs to be acc
129f0 65 73 73 65 64 2e 20 20 41 75 74 6f 6d 61 74 69  essed.  Automati
12a00 63 20 69 6e 64 69 63 65 73 20 6d 75 73 74 0a 20  c indices must. 
12a10 20 2a 2a 20 62 65 20 61 20 63 6f 76 65 72 69 6e   ** be a coverin
12a20 67 20 69 6e 64 65 78 20 62 65 63 61 75 73 65 20  g index because 
12a30 74 68 65 20 69 6e 64 65 78 20 77 69 6c 6c 20 6e  the index will n
12a40 6f 74 20 62 65 20 75 70 64 61 74 65 64 20 69 66  ot be updated if
12a50 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
12a60 61 6c 20 74 61 62 6c 65 20 63 68 61 6e 67 65 73  al table changes
12a70 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 61   and the index a
12a80 6e 64 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20  nd table cannot 
12a90 62 6f 74 68 20 62 65 20 75 73 65 64 0a 20 20 2a  both be used.  *
12aa0 2a 20 69 66 20 74 68 65 79 20 67 6f 20 6f 75 74  * if they go out
12ab0 20 6f 66 20 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20   of sync..  */. 
12ac0 20 65 78 74 72 61 43 6f 6c 73 20 3d 20 70 53 72   extraCols = pSr
12ad0 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20 28 7e 69  c->colUsed & (~i
12ae0 64 78 43 6f 6c 73 20 7c 20 28 28 28 42 69 74 6d  dxCols | (((Bitm
12af0 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29  ask)1)<<(BMS-1))
12b00 29 3b 0a 20 20 6d 78 42 69 74 43 6f 6c 20 3d 20  );.  mxBitCol = 
12b10 28 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 20 3e 3d  (pTable->nCol >=
12b20 20 42 4d 53 2d 31 29 20 3f 20 42 4d 53 2d 31 20   BMS-1) ? BMS-1 
12b30 3a 20 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3b 0a  : pTable->nCol;.
12b40 20 20 74 65 73 74 63 61 73 65 28 20 70 54 61 62    testcase( pTab
12b50 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53 2d 31 20  le->nCol==BMS-1 
12b60 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  );.  testcase( p
12b70 54 61 62 6c 65 2d 3e 6e 43 6f 6c 3d 3d 42 4d 53  Table->nCol==BMS
12b80 2d 32 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  -2 );.  for(i=0;
12b90 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
12ba0 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
12bb0 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
12bc0 6b 29 31 29 3c 3c 69 29 20 29 20 6e 43 6f 6c 75  k)1)<<i) ) nColu
12bd0 6d 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  mn++;.  }.  if( 
12be0 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 20 26 20  pSrc->colUsed & 
12bf0 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
12c00 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 6e  BMS-1)) ){.    n
12c10 43 6f 6c 75 6d 6e 20 2b 3d 20 70 54 61 62 6c 65  Column += pTable
12c20 2d 3e 6e 43 6f 6c 20 2d 20 42 4d 53 20 2b 20 31  ->nCol - BMS + 1
12c30 3b 0a 20 20 7d 0a 20 20 70 4c 65 76 65 6c 2d 3e  ;.  }.  pLevel->
12c40 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20  plan.wsFlags |= 
12c50 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20  WHERE_COLUMN_EQ 
12c60 7c 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  | WHERE_IDX_ONLY
12c70 20 7c 20 57 4f 5f 45 51 3b 0a 0a 20 20 2f 2a 20   | WO_EQ;..  /* 
12c80 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 49 6e  Construct the In
12c90 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 20 64 65  dex object to de
12ca0 73 63 72 69 62 65 20 74 68 69 73 20 69 6e 64 65  scribe this inde
12cb0 78 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 73  x */.  nByte = s
12cc0 69 7a 65 6f 66 28 49 6e 64 65 78 29 3b 0a 20 20  izeof(Index);.  
12cd0 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12ce0 2a 73 69 7a 65 6f 66 28 69 6e 74 29 3b 20 20 20  *sizeof(int);   
12cf0 20 20 2f 2a 20 49 6e 64 65 78 2e 61 69 43 6f 6c    /* Index.aiCol
12d00 75 6d 6e 20 2a 2f 0a 20 20 6e 42 79 74 65 20 2b  umn */.  nByte +
12d10 3d 20 6e 43 6f 6c 75 6d 6e 2a 73 69 7a 65 6f 66  = nColumn*sizeof
12d20 28 63 68 61 72 2a 29 3b 20 20 20 2f 2a 20 49 6e  (char*);   /* In
12d30 64 65 78 2e 61 7a 43 6f 6c 6c 20 2a 2f 0a 20 20  dex.azColl */.  
12d40 6e 42 79 74 65 20 2b 3d 20 6e 43 6f 6c 75 6d 6e  nByte += nColumn
12d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12d60 20 20 2f 2a 20 49 6e 64 65 78 2e 61 53 6f 72 74    /* Index.aSort
12d70 4f 72 64 65 72 20 2a 2f 0a 20 20 70 49 64 78 20  Order */.  pIdx 
12d80 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
12d90 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64 62  cZero(pParse->db
12da0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  , nByte);.  if( 
12db0 70 49 64 78 3d 3d 30 20 29 20 72 65 74 75 72 6e  pIdx==0 ) return
12dc0 3b 0a 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  ;.  pLevel->plan
12dd0 2e 75 2e 70 49 64 78 20 3d 20 70 49 64 78 3b 0a  .u.pIdx = pIdx;.
12de0 20 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 20 3d    pIdx->azColl =
12df0 20 28 63 68 61 72 2a 2a 29 26 70 49 64 78 5b 31   (char**)&pIdx[1
12e00 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ];.  pIdx->aiCol
12e10 75 6d 6e 20 3d 20 28 69 6e 74 2a 29 26 70 49 64  umn = (int*)&pId
12e20 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 43 6f 6c 75 6d  x->azColl[nColum
12e30 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e 61 53 6f 72  n];.  pIdx->aSor
12e40 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 70  tOrder = (u8*)&p
12e50 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 43  Idx->aiColumn[nC
12e60 6f 6c 75 6d 6e 5d 3b 0a 20 20 70 49 64 78 2d 3e  olumn];.  pIdx->
12e70 7a 4e 61 6d 65 20 3d 20 22 61 75 74 6f 2d 69 6e  zName = "auto-in
12e80 64 65 78 22 3b 0a 20 20 70 49 64 78 2d 3e 6e 43  dex";.  pIdx->nC
12e90 6f 6c 75 6d 6e 20 3d 20 6e 43 6f 6c 75 6d 6e 3b  olumn = nColumn;
12ea0 0a 20 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 20  .  pIdx->pTable 
12eb0 3d 20 70 54 61 62 6c 65 3b 0a 20 20 6e 20 3d 20  = pTable;.  n = 
12ec0 30 3b 0a 20 20 69 64 78 43 6f 6c 73 20 3d 20 30  0;.  idxCols = 0
12ed0 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
12ee0 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43 45  C->a; pTerm<pWCE
12ef0 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  nd; pTerm++){.  
12f00 20 20 69 66 28 20 74 65 72 6d 43 61 6e 44 72 69    if( termCanDri
12f10 76 65 49 6e 64 65 78 28 70 54 65 72 6d 2c 20 70  veIndex(pTerm, p
12f20 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 29 20 29  Src, notReady) )
12f30 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c  {.      int iCol
12f40 20 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74   = pTerm->u.left
12f50 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 42 69  Column;.      Bi
12f60 74 6d 61 73 6b 20 63 4d 61 73 6b 20 3d 20 69 43  tmask cMask = iC
12f70 6f 6c 3e 3d 42 4d 53 20 3f 20 28 28 42 69 74 6d  ol>=BMS ? ((Bitm
12f80 61 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 20  ask)1)<<(BMS-1) 
12f90 3a 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  : ((Bitmask)1)<<
12fa0 69 43 6f 6c 3b 0a 20 20 20 20 20 20 69 66 28 20  iCol;.      if( 
12fb0 28 69 64 78 43 6f 6c 73 20 26 20 63 4d 61 73 6b  (idxCols & cMask
12fc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12fd0 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
12fe0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12ff0 20 69 64 78 43 6f 6c 73 20 7c 3d 20 63 4d 61 73   idxCols |= cMas
13000 6b 3b 0a 20 20 20 20 20 20 20 20 70 49 64 78 2d  k;.        pIdx-
13010 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20 3d 20 70  >aiColumn[n] = p
13020 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  Term->u.leftColu
13030 6d 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  mn;.        pCol
13040 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
13050 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
13060 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
13070 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
13080 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e 61 7a          pIdx->az
13090 43 6f 6c 6c 5b 6e 5d 20 3d 20 41 4c 57 41 59 53  Coll[n] = ALWAYS
130a0 28 70 43 6f 6c 6c 29 20 3f 20 70 43 6f 6c 6c 2d  (pColl) ? pColl-
130b0 3e 7a 4e 61 6d 65 20 3a 20 22 42 49 4e 41 52 59  >zName : "BINARY
130c0 22 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ";.        n++;.
130d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
130e0 7d 0a 20 20 61 73 73 65 72 74 28 20 28 75 33 32  }.  assert( (u32
130f0 29 6e 3d 3d 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  )n==pLevel->plan
13100 2e 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 41 64  .nEq );..  /* Ad
13110 64 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  d additional col
13120 75 6d 6e 73 20 6e 65 65 64 65 64 20 74 6f 20 6d  umns needed to m
13130 61 6b 65 20 74 68 65 20 61 75 74 6f 6d 61 74 69  ake the automati
13140 63 20 69 6e 64 65 78 20 69 6e 74 6f 0a 20 20 2a  c index into.  *
13150 2a 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  * a covering ind
13160 65 78 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ex */.  for(i=0;
13170 20 69 3c 6d 78 42 69 74 43 6f 6c 3b 20 69 2b 2b   i<mxBitCol; i++
13180 29 7b 0a 20 20 20 20 69 66 28 20 65 78 74 72 61  ){.    if( extra
13190 43 6f 6c 73 20 26 20 28 28 28 42 69 74 6d 61 73  Cols & (((Bitmas
131a0 6b 29 31 29 3c 3c 69 29 20 29 7b 0a 20 20 20 20  k)1)<<i) ){.    
131b0 20 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e    pIdx->aiColumn
131c0 5b 6e 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 70  [n] = i;.      p
131d0 49 64 78 2d 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d  Idx->azColl[n] =
131e0 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 20 20 20   "BINARY";.     
131f0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
13200 20 20 69 66 28 20 70 53 72 63 2d 3e 63 6f 6c 55    if( pSrc->colU
13210 73 65 64 20 26 20 28 28 28 42 69 74 6d 61 73 6b  sed & (((Bitmask
13220 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
13230 0a 20 20 20 20 66 6f 72 28 69 3d 42 4d 53 2d 31  .    for(i=BMS-1
13240 3b 20 69 3c 70 54 61 62 6c 65 2d 3e 6e 43 6f 6c  ; i<pTable->nCol
13250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 49  ; i++){.      pI
13260 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 5d 20  dx->aiColumn[n] 
13270 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 2d  = i;.      pIdx-
13280 3e 61 7a 43 6f 6c 6c 5b 6e 5d 20 3d 20 22 42 49  >azColl[n] = "BI
13290 4e 41 52 59 22 3b 0a 20 20 20 20 20 20 6e 2b 2b  NARY";.      n++
132a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
132b0 73 65 72 74 28 20 6e 3d 3d 6e 43 6f 6c 75 6d 6e  sert( n==nColumn
132c0 20 29 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65   );..  /* Create
132d0 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 69   the automatic i
132e0 6e 64 65 78 20 2a 2f 0a 20 20 70 4b 65 79 69 6e  ndex */.  pKeyin
132f0 66 6f 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  fo = sqlite3Inde
13300 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
13310 20 70 49 64 78 29 3b 0a 20 20 61 73 73 65 72 74   pIdx);.  assert
13320 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  ( pLevel->iIdxCu
13330 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  r>=0 );.  sqlite
13340 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
13350 50 5f 4f 70 65 6e 41 75 74 6f 69 6e 64 65 78 2c  P_OpenAutoindex,
13360 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13370 2c 20 6e 43 6f 6c 75 6d 6e 2b 31 2c 20 30 2c 0a  , nColumn+1, 0,.
13380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13390 20 20 20 20 28 63 68 61 72 2a 29 70 4b 65 79 69      (char*)pKeyi
133a0 6e 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  nfo, P4_KEYINFO_
133b0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 56 64 62 65  HANDOFF);.  Vdbe
133c0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 66 6f 72  Comment((v, "for
133d0 20 25 73 22 2c 20 70 54 61 62 6c 65 2d 3e 7a 4e   %s", pTable->zN
133e0 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ame));..  /* Fil
133f0 6c 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  l the automatic 
13400 69 6e 64 65 78 20 77 69 74 68 20 63 6f 6e 74 65  index with conte
13410 6e 74 20 2a 2f 0a 20 20 61 64 64 72 54 6f 70 20  nt */.  addrTop 
13420 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
13430 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op1(v, OP_Rewind
13440 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75  , pLevel->iTabCu
13450 72 29 3b 0a 20 20 72 65 67 52 65 63 6f 72 64 20  r);.  regRecord 
13460 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
13470 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 73  Reg(pParse);.  s
13480 71 6c 69 74 65 33 47 65 6e 65 72 61 74 65 49 6e  qlite3GenerateIn
13490 64 65 78 4b 65 79 28 70 50 61 72 73 65 2c 20 70  dexKey(pParse, p
134a0 49 64 78 2c 20 70 4c 65 76 65 6c 2d 3e 69 54 61  Idx, pLevel->iTa
134b0 62 43 75 72 2c 20 72 65 67 52 65 63 6f 72 64 2c  bCur, regRecord,
134c0 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   1);.  sqlite3Vd
134d0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
134e0 64 78 49 6e 73 65 72 74 2c 20 70 4c 65 76 65 6c  dxInsert, pLevel
134f0 2d 3e 69 49 64 78 43 75 72 2c 20 72 65 67 52 65  ->iIdxCur, regRe
13500 63 6f 72 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  cord);.  sqlite3
13510 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20  VdbeChangeP5(v, 
13520 4f 50 46 4c 41 47 5f 55 53 45 53 45 45 4b 52 45  OPFLAG_USESEEKRE
13530 53 55 4c 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  SULT);.  sqlite3
13540 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
13550 5f 4e 65 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69  _Next, pLevel->i
13560 54 61 62 43 75 72 2c 20 61 64 64 72 54 6f 70 2b  TabCur, addrTop+
13570 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  1);.  sqlite3Vdb
13580 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53 51 4c  eChangeP5(v, SQL
13590 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41  ITE_STMTSTATUS_A
135a0 55 54 4f 49 4e 44 45 58 29 3b 0a 20 20 73 71 6c  UTOINDEX);.  sql
135b0 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
135c0 28 76 2c 20 61 64 64 72 54 6f 70 29 3b 0a 20 20  (v, addrTop);.  
135d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
135e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65  mpReg(pParse, re
135f0 67 52 65 63 6f 72 64 29 3b 0a 20 20 0a 20 20 2f  gRecord);.  .  /
13600 2a 20 4a 75 6d 70 20 68 65 72 65 20 77 68 65 6e  * Jump here when
13610 20 73 6b 69 70 70 69 6e 67 20 74 68 65 20 69 6e   skipping the in
13620 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 2a 2f 0a  itialization */.
13630 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
13640 70 48 65 72 65 28 76 2c 20 61 64 64 72 49 6e 69  pHere(v, addrIni
13650 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  t);.}.#endif /* 
13660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13670 4d 41 54 49 43 5f 49 4e 44 45 58 20 2a 2f 0a 0a  MATIC_INDEX */..
13680 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
13690 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
136a0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
136b0 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e 20  and populate an 
136c0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
136d0 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49 74  fo structure. It
136e0 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
136f0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
13700 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
13710 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20 74  tually release t
13720 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  he structure.** 
13730 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20 70  by passing the p
13740 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
13750 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
13760 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
13770 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ()..*/.static sq
13780 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13790 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49   *allocateIndexI
137a0 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70 50  nfo(.  Parse *pP
137b0 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43 6c  arse, .  WhereCl
137c0 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74 72  ause *pWC,.  str
137d0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
137e0 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c 69   *pSrc,.  ExprLi
137f0 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b 0a  st *pOrderBy.){.
13800 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
13810 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75 63  t nTerm;.  struc
13820 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
13830 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64 78  constraint *pIdx
13840 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20 73  Cons;.  struct s
13850 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
13860 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72 42  erby *pIdxOrderB
13870 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69  y;.  struct sqli
13880 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
13890 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61  aint_usage *pUsa
138a0 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  ge;.  WhereTerm 
138b0 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e 4f  *pTerm;.  int nO
138c0 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74 65  rderBy;.  sqlite
138d0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
138e0 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52 45  dxInfo;..  WHERE
138f0 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75 74  TRACE(("Recomput
13900 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20 66  ing index info f
13910 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53 72  or %s...\n", pSr
13920 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  c->pTab->zName))
13930 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  ;..  /* Count th
13940 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73 73  e number of poss
13950 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75 73  ible WHERE claus
13960 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72 65  e constraints re
13970 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f 20  ferring.  ** to 
13980 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61 62  this virtual tab
13990 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 54  le */.  for(i=nT
139a0 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
139b0 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
139c0 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
139d0 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  {.    if( pTerm-
139e0 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
139f0 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
13a00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
13a10 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70  ert( (pTerm->eOp
13a20 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65  erator&(pTerm->e
13a30 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20  Operator-1))==0 
13a40 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
13a50 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13a60 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20  r==WO_IN );.    
13a70 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
13a80 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
13a90 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28  SNULL );.    if(
13aa0 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
13ab0 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53  r & (WO_IN|WO_IS
13ac0 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65  NULL) ) continue
13ad0 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
13ae0 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
13af0 56 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65  VNULL ) continue
13b00 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20  ;.    nTerm++;. 
13b10 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
13b20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13b30 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f  contains only co
13b40 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75 72  lumns in the cur
13b50 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74 75  rent .  ** virtu
13b60 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c  al table then al
13b70 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
13b80 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61   the aOrderBy pa
13b90 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 73  rt of.  ** the s
13ba0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13bb0 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 2a  o structure..  *
13bc0 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 30  /.  nOrderBy = 0
13bd0 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
13be0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
13bf0 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
13c00 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
13c10 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f  Expr *pExpr = pO
13c20 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78  rderBy->a[i].pEx
13c30 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  pr;.      if( pE
13c40 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
13c50 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
13c60 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72 73  ble!=pSrc->iCurs
13c70 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  or ) break;.    
13c80 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72  }.    if( i==pOr
13c90 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a  derBy->nExpr ){.
13ca0 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
13cb0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
13cc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
13cd0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73  * Allocate the s
13ce0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
13cf0 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2f  o structure.  */
13d00 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73 71  .  pIdxInfo = sq
13d10 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
13d20 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73 69  o(pParse->db, si
13d30 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29 0a  zeof(*pIdxInfo).
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73 69             + (si
13d60 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29 20  zeof(*pIdxCons) 
13d70 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67 65  + sizeof(*pUsage
13d80 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20 20  ))*nTerm.       
13d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13da0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49      + sizeof(*pI
13db0 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65  dxOrderBy)*nOrde
13dc0 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49 64  rBy );.  if( pId
13dd0 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
13de0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
13df0 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
13e00 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f 2a  memory");.    /*
13e10 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63 61   (double)0 In ca
13e20 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
13e30 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
13e40 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ... */.    retur
13e50 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  n 0;.  }..  /* I
13e60 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74  nitialize the st
13e70 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71  ructure.  The sq
13e80 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
13e90 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
13ea0 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66 69  ins.  ** many fi
13eb0 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64 65  elds that are de
13ec0 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20 74  clared "const" t
13ed0 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74 49  o prevent xBestI
13ee0 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ndex from.  ** c
13ef0 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20 57  hanging them.  W
13f00 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d  e have to do som
13f10 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67 20  e funky casting 
13f20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a 2a  in order to.  **
13f30 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73   initialize thos
13f40 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a 20  e fields..  */. 
13f50 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
13f60 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13f70 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
13f80 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70 49  IdxInfo[1];.  pI
13f90 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72  dxOrderBy = (str
13fa0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
13fb0 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78  x_orderby*)&pIdx
13fc0 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 70  Cons[nTerm];.  p
13fd0 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74 20  Usage = (struct 
13fe0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
13ff0 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 29  nstraint_usage*)
14000 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72  &pIdxOrderBy[nOr
14010 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74 2a  derBy];.  *(int*
14020 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  )&pIdxInfo->nCon
14030 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b  straint = nTerm;
14040 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
14050 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
14060 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  nOrderBy;.  *(st
14070 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14080 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29  ex_constraint**)
14090 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
140a0 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e  traint = pIdxCon
140b0 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  s;.  *(struct sq
140c0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65  lite3_index_orde
140d0 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  rby**)&pIdxInfo-
140e0 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78  >aOrderBy = pIdx
140f0 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74 72  OrderBy;.  *(str
14100 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
14110 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
14120 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  ge**)&pIdxInfo->
14130 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
14140 20 3d 0a 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 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
14190 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72   for(i=j=0, pTer
141a0 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d  m=pWC->a; i<pWC-
141b0 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65  >nTerm; i++, pTe
141c0 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
141d0 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
141e0 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f   != pSrc->iCurso
141f0 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  r ) continue;.  
14200 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
14210 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54 65  ->eOperator&(pTe
14220 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31 29  rm->eOperator-1)
14230 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73 74  )==0 );.    test
14240 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70  case( pTerm->eOp
14250 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b  erator==WO_IN );
14260 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
14270 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
14280 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20  =WO_ISNULL );.  
14290 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
142a0 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e 7c  erator & (WO_IN|
142b0 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f 6e  WO_ISNULL) ) con
142c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
142d0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
142e0 54 45 52 4d 5f 56 4e 55 4c 4c 20 29 20 63 6f 6e  TERM_VNULL ) con
142f0 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78 43  tinue;.    pIdxC
14300 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  ons[j].iColumn =
14310 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f   pTerm->u.leftCo
14320 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43 6f  lumn;.    pIdxCo
14330 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65  ns[j].iTermOffse
14340 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78 43  t = i;.    pIdxC
14350 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38 29  ons[j].op = (u8)
14360 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
14370 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72  ;.    /* The dir
14380 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69  ect assignment i
14390 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c  n the previous l
143a0 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ine is possible 
143b0 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20  only because.   
143c0 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
143d0 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
143e0 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
143f0 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
14400 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  he.    ** follow
14410 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69  ing asserts veri
14420 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  fy this fact. */
14430 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f  .    assert( WO_
14440 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
14450 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
14460 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  ;.    assert( WO
14470 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _LT==SQLITE_INDE
14480 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20  X_CONSTRAINT_LT 
14490 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
144a0 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LE==SQLITE_IND
144b0 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45  EX_CONSTRAINT_LE
144c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
144d0 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
144e0 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
144f0 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  T );.    assert(
14500 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f 49   WO_GE==SQLITE_I
14510 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
14520 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GE );.    assert
14530 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49  ( WO_MATCH==SQLI
14540 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
14550 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20  INT_MATCH );.   
14560 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
14570 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
14580 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
14590 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
145a0 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b 3b  TCH) );.    j++;
145b0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
145c0 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  i<nOrderBy; i++)
145d0 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
145e0 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  r = pOrderBy->a[
145f0 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 49  i].pExpr;.    pI
14600 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
14610 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
14620 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 4f  olumn;.    pIdxO
14630 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20 3d  rderBy[i].desc =
14640 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
14650 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a 0a  sortOrder;.  }..
14660 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e 66    return pIdxInf
14670 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  o;.}../*.** The 
14680 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65 66  table object ref
14690 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61 73  erence passed as
146a0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
146b0 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
146c0 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72 65  ction.** must re
146d0 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75 61  present a virtua
146e0 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75  l table. This fu
146f0 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20 74  nction invokes t
14700 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29 0a  he xBestIndex().
14710 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
14720 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 77   virtual table w
14730 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ith the sqlite3_
14740 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e 74  index_info point
14750 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  er passed.** as 
14760 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  the argument..**
14770 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
14780 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20 69  occurs, pParse i
14790 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  s populated with
147a0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
147b0 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d 7a  e and a.** non-z
147c0 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65 74  ero value is ret
147d0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
147e0 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 0 is returned 
147f0 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  and the output.*
14800 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 71  * part of the sq
14810 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
14820 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c 65   structure is le
14830 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a 2a  ft populated..**
14840 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e  .** Whether or n
14850 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  ot an error is r
14860 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20 74  eturned, it is t
14870 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
14880 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c  y of the.** call
14890 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
148a0 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72 20   free p->idxStr 
148b0 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65  if p->needToFree
148c0 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65 73  IdxStr indicates
148d0 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69 73  .** that this is
148e0 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74   required..*/.st
148f0 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65 73  atic int vtabBes
14900 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70 50  tIndex(Parse *pP
14910 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54 61  arse, Table *pTa
14920 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  b, sqlite3_index
14930 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71 6c  _info *p){.  sql
14940 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62  ite3_vtab *pVtab
14950 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54 61   = sqlite3GetVTa
14960 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ble(pParse->db, 
14970 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20 20  pTab)->pVtab;.  
14980 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
14990 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
149a0 22 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20  "xBestIndex for 
149b0 25 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61  %s\n", pTab->zNa
149c0 6d 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44  me));.  TRACE_ID
149d0 58 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72  X_INPUTS(p);.  r
149e0 63 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75  c = pVtab->pModu
149f0 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70  le->xBestIndex(p
14a00 56 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43  Vtab, p);.  TRAC
14a10 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29  E_IDX_OUTPUTS(p)
14a20 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  ;..  if( rc!=SQL
14a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
14a40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
14a50 45 4d 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72  EM ){.      pPar
14a60 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
14a70 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
14a80 6c 73 65 20 69 66 28 20 21 70 56 74 61 62 2d 3e  lse if( !pVtab->
14a90 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
14aa0 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
14ab0 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 73  (pParse, "%s", s
14ac0 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
14ad0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
14ae0 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14af0 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
14b00 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  , pVtab->zErrMsg
14b10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
14b20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
14b30 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
14b40 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
14b50 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
14b60 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b  <p->nConstraint;
14b70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
14b80 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
14b90 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e 61  ].usable && p->a
14ba0 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
14bb0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
14bc0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
14bd0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
14be0 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c  .          "tabl
14bf0 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65 78  e %s: xBestIndex
14c00 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e 76   returned an inv
14c10 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61 62  alid plan", pTab
14c20 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ->zName);.    }.
14c30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 50    }..  return pP
14c40 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a 0a  arse->nErr;.}...
14c50 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68  /*.** Compute th
14c60 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f 72  e best index for
14c70 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
14c80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73 74  ..**.** The best
14c90 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75 74   index is comput
14ca0 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74 49  ed by the xBestI
14cb0 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20 74  ndex method of t
14cc0 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61  he virtual.** ta
14cd0 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68 69  ble module.  Thi
14ce0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 61  s routine is rea
14cf0 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70 70  lly just a wrapp
14d00 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70 0a  er that sets up.
14d10 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ** the sqlite3_i
14d20 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
14d30 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65 64  ure that is used
14d40 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65 20   to communicate 
14d50 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e 64  with.** xBestInd
14d60 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20 6a  ex..**.** In a j
14d70 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  oin, this routin
14d80 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c 65  e might be calle
14d90 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
14da0 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d 65   for the.** same
14db0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
14dc0 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
14dd0 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
14de0 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20  e is created.** 
14df0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
14e00 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e 76  on the first inv
14e10 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75 73  ocation and reus
14e20 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65 71  ed on all subseq
14e30 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74 69  uent.** invocati
14e40 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ons.  The sqlite
14e50 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
14e60 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20 75  ucture is also u
14e70 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64 65  sed when.** code
14e80 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74 6f   is generated to
14e90 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72 74   access the virt
14ea0 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20  ual table.  The 
14eb0 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65 28  whereInfoDelete(
14ec0 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 61  ) .** routine ta
14ed0 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65 65  kes care of free
14ee0 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
14ef0 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
14f00 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65 76  ture after.** ev
14f10 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e 69  erybody has fini
14f20 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a 2f  shed with it..*/
14f30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
14f40 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a 20  tVirtualIndex(. 
14f50 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
14f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f70 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
14f80 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65  context */.  Whe
14f90 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20  reClause *pWC,  
14fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14fb0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
14fc0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
14fd0 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
14fe0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f        /* The FRO
14ff0 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f  M clause term to
15000 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74   search */.  Bit
15010 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
15020 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15030 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
15040 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
15050 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 42 69 74  r index */.  Bit
15060 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64 2c 20 20  mask notValid,  
15070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15080 43 75 72 73 6f 72 73 20 6e 6f 74 20 76 61 6c 69  Cursors not vali
15090 64 20 66 6f 72 20 61 6e 79 20 70 75 72 70 6f 73  d for any purpos
150a0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
150b0 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
150c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72         /* The or
150d0 64 65 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f  der by clause */
150e0 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
150f0 6f 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ost,            
15100 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
15110 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
15120 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
15130 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
15140 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72    /* Index infor
15150 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f  mation passed to
15160 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29   xBestIndex */.)
15170 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
15180 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
15190 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
151a0 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
151b0 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
151c0 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
151d0 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
151e0 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
151f0 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
15200 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68  ge *pUsage;.  Wh
15210 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
15220 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e    int i, j;.  in
15230 74 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 64 6f  t nOrderBy;.  do
15240 75 62 6c 65 20 72 43 6f 73 74 3b 0a 0a 20 20 2f  uble rCost;..  /
15250 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c  * Make sure wsFl
15260 61 67 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ags is initializ
15270 65 64 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20  ed to some sane 
15280 76 61 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65  value. Otherwise
15290 2c 20 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d  , if the .  ** m
152a0 61 6c 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74  alloc in allocat
152b0 65 49 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69  eIndexInfo() fai
152c0 6c 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ls and this func
152d0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61  tion returns lea
152e0 76 69 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67  ving.  ** wsFlag
152f0 73 20 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61  s in an uninitia
15300 6c 69 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65  lized state, the
15310 20 63 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61   caller may beha
15320 76 65 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79  ve unpredictably
15330 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  ..  */.  memset(
15340 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pCost, 0, sizeof
15350 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f  (*pCost));.  pCo
15360 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
15370 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
15380 54 41 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20  TABLE;..  /* If 
15390 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  the sqlite3_inde
153a0 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
153b0 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72   has not been pr
153c0 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c  eviously.  ** al
153d0 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74  located and init
153e0 69 61 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c  ialized, then al
153f0 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
15400 61 6c 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20  alize it now..  
15410 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20  */.  pIdxInfo = 
15420 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66  *ppIdxInfo;.  if
15430 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b  ( pIdxInfo==0 ){
15440 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20  .    *ppIdxInfo 
15450 3d 20 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c  = pIdxInfo = all
15460 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70  ocateIndexInfo(p
15470 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
15480 2c 20 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d  , pOrderBy);.  }
15490 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d  .  if( pIdxInfo=
154a0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
154b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74  ;.  }..  /* At t
154c0 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73  his point, the s
154d0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
154e0 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
154f0 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73   pIdxInfo points
15500 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61  .  ** to will ha
15510 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69  ve been initiali
15520 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72 69  zed, either duri
15530 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ng the current i
15540 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a  nvocation or.  *
15550 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72  * during some pr
15560 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  ior invocation. 
15570 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76   Now we just hav
15580 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74  e to customize t
15590 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20  he.  ** details 
155a0 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20  of pIdxInfo for 
155b0 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f  the current invo
155c0 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20  cation and pass 
155d0 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74  it to.  ** xBest
155e0 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  Index..  */..  /
155f0 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d  * The module nam
15600 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65  e must be define
15610 64 2e 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73  d. Also, by this
15620 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73   point there mus
15630 74 0a 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e  t.  ** be a poin
15640 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
15650 33 5f 76 74 61 62 20 73 74 72 75 63 74 75 72 65  3_vtab structure
15660 2e 20 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a  . Otherwise.  **
15670 20 73 71 6c 69 74 65 33 56 69 65 77 47 65 74 43   sqlite3ViewGetC
15680 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75  olumnNames() wou
15690 6c 64 20 68 61 76 65 20 70 69 63 6b 65 64 20 75  ld have picked u
156a0 70 20 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20  p the error. .  
156b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 54 61  */.  assert( pTa
156c0 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26  b->azModuleArg &
156d0 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65  & pTab->azModule
156e0 41 72 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65  Arg[0] );.  asse
156f0 72 74 28 20 73 71 6c 69 74 65 33 47 65 74 56 54  rt( sqlite3GetVT
15700 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
15710 20 70 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20   pTab) );..  /* 
15720 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61  Set the aConstra
15730 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65  int[].usable fie
15740 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  lds and initiali
15750 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74  ze all .  ** out
15760 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f  put variables to
15770 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   zero..  **.  **
15780 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75   aConstraint[].u
15790 73 61 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f  sable is true fo
157a0 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68  r constraints wh
157b0 65 72 65 20 74 68 65 20 72 69 67 68 74 2d 68 61  ere the right-ha
157c0 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e  nd.  ** side con
157d0 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72  tains only refer
157e0 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20  ences to tables 
157f0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
15800 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
15810 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72  table.  In other
15820 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63   words, if the c
15830 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20  onstraint is of 
15840 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20  the form:.  **. 
15850 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f   **           co
15860 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a  lumn = expr.  **
15870 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65  .  ** and we are
15880 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f   evaluating a jo
15890 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e  in, then the con
158a0 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d  straint on colum
158b0 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20  n is .  ** only 
158c0 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62  valid if all tab
158d0 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20 69  les referenced i
158e0 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20  n expr occur to 
158f0 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66  the left.  ** of
15900 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61   the table conta
15910 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20  ining column..  
15920 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e  **.  ** The aCon
15930 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79  straints[] array
15940 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
15950 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72  s for all constr
15960 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68  aints.  ** on th
15970 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e  e current table.
15980 20 20 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e    That way we on
15990 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75  ly have to compu
159a0 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20  te it once.  ** 
159b0 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d  even though we m
159c0 69 67 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b  ight try to pick
159d0 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   the best index 
159e0 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a  multiple times..
159f0 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74    ** For each at
15a00 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67  tempt at picking
15a10 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f   an index, the o
15a20 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69  rder of tables i
15a30 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20  n the.  ** join 
15a40 6d 69 67 68 74 20 62 65 20 64 69 66 66 65 72 65  might be differe
15a50 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f  nt so we have to
15a60 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75   recompute the u
15a70 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20  sable flag.  ** 
15a80 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  each time..  */.
15a90 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73    pIdxCons = *(s
15aa0 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
15ab0 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
15ac0 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
15ad0 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67  straint;.  pUsag
15ae0 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43  e = pIdxInfo->aC
15af0 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a  onstraintUsage;.
15b00 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64    for(i=0; i<pId
15b10 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
15b20 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e  nt; i++, pIdxCon
15b30 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49  s++){.    j = pI
15b40 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66  dxCons->iTermOff
15b50 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  set;.    pTerm =
15b60 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20   &pWC->a[j];.   
15b70 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c   pIdxCons->usabl
15b80 65 20 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  e = (pTerm->prer
15b90 65 71 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79  eqRight&notReady
15ba0 29 20 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20  ) ? 0 : 1;.  }. 
15bb0 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
15bc0 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
15bd0 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
15be0 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69  Constraint);.  i
15bf0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
15c00 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
15c10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
15c20 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
15c30 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49  tr);.  }.  pIdxI
15c40 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
15c50 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
15c60 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
15c70 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
15c80 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
15c90 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
15ca0 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a  nsumed = 0;.  /*
15cb0 20 28 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20   ((double)2) In 
15cc0 63 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f  case of SQLITE_O
15cd0 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
15ce0 4e 54 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49  NT... */.  pIdxI
15cf0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
15d00 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
15d10 44 42 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32  DBL / ((double)2
15d20 29 3b 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  );.  nOrderBy = 
15d30 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
15d40 42 79 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65  By;.  if( !pOrde
15d50 72 42 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49  rBy ){.    pIdxI
15d60 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
15d70 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74  0;.  }..  if( vt
15d80 61 62 42 65 73 74 49 6e 64 65 78 28 70 50 61 72  abBestIndex(pPar
15d90 73 65 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e  se, pTab, pIdxIn
15da0 66 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  fo) ){.    retur
15db0 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f  n;.  }..  pIdxCo
15dc0 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71  ns = *(struct sq
15dd0 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
15de0 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
15df0 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b  fo->aConstraint;
15e00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
15e10 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
15e20 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  int; i++){.    i
15e30 66 28 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67  f( pUsage[i].arg
15e40 76 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20  vIndex>0 ){.    
15e50 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d    pCost->used |=
15e60 20 70 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73   pWC->a[pIdxCons
15e70 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d  [i].iTermOffset]
15e80 2e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  .prereqRight;.  
15e90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
15ea0 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44   there is an ORD
15eb0 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 61 6e  ER BY clause, an
15ec0 64 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 76  d the selected v
15ed0 69 72 74 75 61 6c 20 74 61 62 6c 65 20 69 6e 64  irtual table ind
15ee0 65 78 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74  ex.  ** does not
15ef0 20 73 61 74 69 73 66 79 20 69 74 2c 20 69 6e 63   satisfy it, inc
15f00 72 65 61 73 65 20 74 68 65 20 63 6f 73 74 20 6f  rease the cost o
15f10 66 20 74 68 65 20 73 63 61 6e 20 61 63 63 6f 72  f the scan accor
15f20 64 69 6e 67 6c 79 2e 20 54 68 69 73 0a 20 20 2a  dingly. This.  *
15f30 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 70 72  * matches the pr
15f40 6f 63 65 73 73 69 6e 67 20 66 6f 72 20 6e 6f 6e  ocessing for non
15f50 2d 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20  -virtual tables 
15f60 69 6e 20 62 65 73 74 42 74 72 65 65 49 6e 64 65  in bestBtreeInde
15f70 78 28 29 2e 0a 20 20 2a 2f 0a 20 20 72 43 6f 73  x()..  */.  rCos
15f80 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73  t = pIdxInfo->es
15f90 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 69  timatedCost;.  i
15fa0 66 28 20 70 4f 72 64 65 72 42 79 20 26 26 20 70  f( pOrderBy && p
15fb0 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79  IdxInfo->orderBy
15fc0 43 6f 6e 73 75 6d 65 64 3d 3d 30 20 29 7b 0a 20  Consumed==0 ){. 
15fd0 20 20 20 72 43 6f 73 74 20 2b 3d 20 65 73 74 4c     rCost += estL
15fe0 6f 67 28 72 43 6f 73 74 29 2a 72 43 6f 73 74 3b  og(rCost)*rCost;
15ff0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
16000 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ost is not allow
16010 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20  ed to be larger 
16020 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f  than SQLITE_BIG_
16030 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69 6e  DBL (the.  ** in
16040 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c 6f  ital value of lo
16050 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69 73  westCost in this
16060 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73 2c   loop. If it is,
16070 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20 28   then the.  ** (
16080 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29  cost<lowestCost)
16090 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c   test below will
160a0 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e 0a   never be true..
160b0 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20 22    ** .  ** Use "
160c0 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74 65  (double)2" inste
160d0 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20 63  ad of "2.0" in c
160e0 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ase OMIT_FLOATIN
160f0 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69 73  G_POINT .  ** is
16100 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a 20   defined..  */. 
16110 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49 47   if( (SQLITE_BIG
16120 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32 29  _DBL/((double)2)
16130 29 3c 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 70  )<rCost ){.    p
16140 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 28 53  Cost->rCost = (S
16150 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
16160 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20 20 7d 65  double)2));.  }e
16170 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e  lse{.    pCost->
16180 72 43 6f 73 74 20 3d 20 72 43 6f 73 74 3b 0a 20  rCost = rCost;. 
16190 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e   }.  pCost->plan
161a0 2e 75 2e 70 56 74 61 62 49 64 78 20 3d 20 70 49  .u.pVtabIdx = pI
161b0 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
161c0 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43  dxInfo->orderByC
161d0 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 70  onsumed ){.    p
161e0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
161f0 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
16200 52 42 59 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74  RBY;.  }.  pCost
16210 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a  ->plan.nEq = 0;.
16220 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64    pIdxInfo->nOrd
16230 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
16240 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
16250 6e 64 20 61 20 6d 6f 72 65 20 65 66 66 69 63 69  nd a more effici
16260 65 6e 74 20 61 63 63 65 73 73 20 70 61 74 74 65  ent access patte
16270 72 6e 20 62 79 20 75 73 69 6e 67 20 6d 75 6c 74  rn by using mult
16280 69 70 6c 65 20 69 6e 64 65 78 65 73 0a 20 20 2a  iple indexes.  *
16290 2a 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e  * to optimize an
162a0 20 4f 52 20 65 78 70 72 65 73 73 69 6f 6e 20 77   OR expression w
162b0 69 74 68 69 6e 20 74 68 65 20 57 48 45 52 45 20  ithin the WHERE 
162c0 63 6c 61 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20  clause. .  */.  
162d0 62 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65  bestOrClauseInde
162e0 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
162f0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
16300 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42  otValid, pOrderB
16310 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a 23 65 6e  y, pCost);.}.#en
16320 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16330 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
16340 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  */../*.** Argume
16350 6e 74 20 70 49 64 78 20 69 73 20 61 20 70 6f 69  nt pIdx is a poi
16360 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 64 65 78  nter to an index
16370 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
16380 68 61 73 20 61 6e 20 61 72 72 61 79 20 6f 66 0a  has an array of.
16390 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  ** SQLITE_INDEX_
163a0 53 41 4d 50 4c 45 53 20 65 76 65 6e 6c 79 20 73  SAMPLES evenly s
163b0 70 61 63 65 64 20 73 61 6d 70 6c 65 73 20 6f 66  paced samples of
163c0 20 74 68 65 20 66 69 72 73 74 20 69 6e 64 65 78   the first index
163d0 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 73 74 6f  ed column.** sto
163e0 72 65 64 20 69 6e 20 49 6e 64 65 78 2e 61 53 61  red in Index.aSa
163f0 6d 70 6c 65 2e 20 54 68 65 73 65 20 73 61 6d 70  mple. These samp
16400 6c 65 73 20 64 69 76 69 64 65 20 74 68 65 20 64  les divide the d
16410 6f 6d 61 69 6e 20 6f 66 20 76 61 6c 75 65 73 20  omain of values 
16420 73 74 6f 72 65 64 0a 2a 2a 20 74 68 65 20 69 6e  stored.** the in
16430 64 65 78 20 69 6e 74 6f 20 28 53 51 4c 49 54 45  dex into (SQLITE
16440 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
16450 29 20 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65  ) regions..** Re
16460 67 69 6f 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20  gion 0 contains 
16470 61 6c 6c 20 76 61 6c 75 65 73 20 6c 65 73 73 20  all values less 
16480 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 73  than the first s
16490 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20 52 65 67  ample value. Reg
164a0 69 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74 61 69 6e  ion.** 1 contain
164b0 73 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  s values between
164c0 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 73   the first and s
164d0 65 63 6f 6e 64 20 73 61 6d 70 6c 65 73 2e 20 20  econd samples.  
164e0 52 65 67 69 6f 6e 20 32 20 63 6f 6e 74 61 69 6e  Region 2 contain
164f0 73 0a 2a 2a 20 76 61 6c 75 65 73 20 62 65 74 77  s.** values betw
16500 65 65 6e 20 73 61 6d 70 6c 65 73 20 32 20 61 6e  een samples 2 an
16510 64 20 33 2e 20 20 41 6e 64 20 73 6f 20 6f 6e 2e  d 3.  And so on.
16520 20 20 52 65 67 69 6f 6e 20 53 51 4c 49 54 45 5f    Region SQLITE_
16530 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 0a 2a 2a  INDEX_SAMPLES.**
16540 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 75 65 73   contains values
16550 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
16560 20 6c 61 73 74 20 73 61 6d 70 6c 65 2e 0a 2a 2a   last sample..**
16570 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78  .** If the index
16580 20 63 6f 6e 74 61 69 6e 73 20 6d 61 6e 79 20 64   contains many d
16590 75 70 6c 69 63 61 74 65 73 20 6f 66 20 61 20 73  uplicates of a s
165a0 69 6e 67 6c 65 20 76 61 6c 75 65 2c 20 74 68 65  ingle value, the
165b0 6e 20 69 74 20 69 73 0a 2a 2a 20 70 6f 73 73 69  n it is.** possi
165c0 62 6c 65 20 74 68 61 74 20 74 77 6f 20 6f 72 20  ble that two or 
165d0 6d 6f 72 65 20 61 64 6a 61 63 65 6e 74 20 73 61  more adjacent sa
165e0 6d 70 6c 65 73 20 63 61 6e 20 68 6f 6c 64 20 74  mples can hold t
165f0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a  he same value..*
16600 2a 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 74  * When that is t
16610 68 65 20 63 61 73 65 2c 20 74 68 65 20 73 6d 61  he case, the sma
16620 6c 6c 65 73 74 20 70 6f 73 73 69 62 6c 65 20 72  llest possible r
16630 65 67 69 6f 6e 20 63 6f 64 65 20 69 73 20 72 65  egion code is re
16640 74 75 72 6e 65 64 0a 2a 2a 20 77 68 65 6e 20 72  turned.** when r
16650 6f 75 6e 64 55 70 20 69 73 20 66 61 6c 73 65 20  oundUp is false 
16660 61 6e 64 20 74 68 65 20 6c 61 72 67 65 73 74 20  and the largest 
16670 70 6f 73 73 69 62 6c 65 20 72 65 67 69 6f 6e 20  possible region 
16680 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16690 0a 2a 2a 20 77 68 65 6e 20 72 6f 75 6e 64 55 70  .** when roundUp
166a0 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20   is true..**.** 
166b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
166c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
166d0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 6f 66  ermines which of
166e0 20 74 68 65 20 72 65 67 69 6f 6e 73 20 76 61 6c   the regions val
166f0 75 65 20 0a 2a 2a 20 70 56 61 6c 20 6c 69 65 73  ue .** pVal lies
16700 20 69 6e 2c 20 73 65 74 73 20 2a 70 69 52 65 67   in, sets *piReg
16710 69 6f 6e 20 74 6f 20 74 68 65 20 72 65 67 69 6f  ion to the regio
16720 6e 20 69 6e 64 65 78 20 28 61 20 76 61 6c 75 65  n index (a value
16730 20 62 65 74 77 65 65 6e 20 30 0a 2a 2a 20 61 6e   between 0.** an
16740 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  d SQLITE_INDEX_S
16750 41 4d 50 4c 45 53 2b 31 2c 20 69 6e 63 6c 75 73  AMPLES+1, inclus
16760 69 76 65 29 20 61 6e 64 20 72 65 74 75 72 6e 73  ive) and returns
16770 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f   SQLITE_OK..** O
16780 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  r, if an OOM occ
16790 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76 65 72  urs while conver
167a0 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75 65 73  ting text values
167b0 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69 6e   between encodin
167c0 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  gs,.** SQLITE_NO
167d0 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20  MEM is returned 
167e0 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20 69 73  and *piRegion is
167f0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23   undefined..*/.#
16800 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16810 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63  BLE_STAT2.static
16820 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65 52   int whereRangeR
16830 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65 20 2a  egion(.  Parse *
16840 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
16850 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
16860 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
16870 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20   Index *pIdx,   
16880 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16890 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64 65  Index to conside
168a0 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a 20  r domain of */. 
168b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
168c0 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  pVal,        /* 
168d0 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64 65  Value to conside
168e0 72 20 2a 2f 0a 20 20 69 6e 74 20 72 6f 75 6e 64  r */.  int round
168f0 55 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Up,             
16900 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6c 61 72     /* Return lar
16910 67 65 73 74 20 76 61 6c 69 64 20 72 65 67 69 6f  gest valid regio
16920 6e 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69  n if true */.  i
16930 6e 74 20 2a 70 69 52 65 67 69 6f 6e 20 20 20 20  nt *piRegion    
16940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16950 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64 6f 6d  T: Region of dom
16960 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76 61 6c  ain in which val
16970 75 65 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20 20  ue lies */.){.  
16980 61 73 73 65 72 74 28 20 72 6f 75 6e 64 55 70 3d  assert( roundUp=
16990 3d 30 20 7c 7c 20 72 6f 75 6e 64 55 70 3d 3d 31  =0 || roundUp==1
169a0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
169b0 28 70 56 61 6c 29 20 29 7b 0a 20 20 20 20 49 6e  (pVal) ){.    In
169c0 64 65 78 53 61 6d 70 6c 65 20 2a 61 53 61 6d 70  dexSample *aSamp
169d0 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53 61 6d 70  le = pIdx->aSamp
169e0 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  le;.    int i = 
169f0 30 3b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65  0;.    int eType
16a00 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
16a10 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a 0a 20 20  _type(pVal);..  
16a20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
16a30 49 54 45 5f 49 4e 54 45 47 45 52 20 7c 7c 20 65  ITE_INTEGER || e
16a40 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  Type==SQLITE_FLO
16a50 41 54 20 29 7b 0a 20 20 20 20 20 20 64 6f 75 62  AT ){.      doub
16a60 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 76  le r = sqlite3_v
16a70 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70 56 61 6c  alue_double(pVal
16a80 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
16a90 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45 58  ; i<SQLITE_INDEX
16aa0 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b 0a  _SAMPLES; i++){.
16ab0 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61 6d          if( aSam
16ac0 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d 3d 53 51  ple[i].eType==SQ
16ad0 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63 6f 6e 74  LITE_NULL ) cont
16ae0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
16af0 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79  ( aSample[i].eTy
16b00 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe>=SQLITE_TEXT 
16b10 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
16b20 20 69 66 28 20 72 6f 75 6e 64 55 70 20 29 7b 0a   if( roundUp ){.
16b30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 53            if( aS
16b40 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29  ample[i].u.r>r )
16b50 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
16b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16b70 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
16b80 75 2e 72 3e 3d 72 20 29 20 62 72 65 61 6b 3b 0a  u.r>=r ) break;.
16b90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16ba0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
16bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  eType==SQLITE_NU
16bc0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 69 20 3d 20  LL ){.      i = 
16bd0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 75  0;.      if( rou
16be0 6e 64 55 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ndUp ){.        
16bf0 77 68 69 6c 65 28 20 69 3c 53 51 4c 49 54 45 5f  while( i<SQLITE_
16c00 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 20 26 26  INDEX_SAMPLES &&
16c10 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70   aSample[i].eTyp
16c20 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  e==SQLITE_NULL )
16c30 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
16c40 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
16c50 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
16c60 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  arse->db;.      
16c70 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
16c80 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
16c90 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  z;.      int n;.
16ca0 0a 20 20 20 20 20 20 2f 2a 20 70 56 61 6c 20 63  .      /* pVal c
16cb0 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c 69 74 65  omes from sqlite
16cc0 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 29  3ValueFromExpr()
16cd0 20 73 6f 20 74 68 65 20 74 79 70 65 20 63 61 6e   so the type can
16ce0 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  not be NULL */. 
16cf0 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
16d00 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20  pe==SQLITE_TEXT 
16d10 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
16d20 5f 42 4c 4f 42 20 29 3b 0a 0a 20 20 20 20 20 20  _BLOB );..      
16d30 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
16d40 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20 20 20  E_BLOB ){.      
16d50 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20    z = (const u8 
16d60 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
16d70 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20 20 20  blob(pVal);.    
16d80 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
16d90 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20  pDfltColl;.     
16da0 20 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 6c     assert( pColl
16db0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
16dc0 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  F8 );.      }els
16dd0 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  e{.        pColl
16de0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f 6c   = sqlite3GetCol
16df0 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f  lSeq(db, SQLITE_
16e00 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78 2d 3e  UTF8, 0, *pIdx->
16e10 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  azColl);.       
16e20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b   if( pColl==0 ){
16e30 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
16e40 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
16e50 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 6c  e, "no such coll
16e60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 3a 20  ation sequence: 
16e70 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
16e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
16e90 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20  pIdx->azColl);. 
16ea0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16eb0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
16ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16ed0 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20 2a 29  z = (const u8 *)
16ee0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
16ef0 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  (pVal, pColl->en
16f00 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
16f10 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  !z ){.          
16f20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
16f30 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  MEM;.        }. 
16f40 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
16f50 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f   && pColl && pCo
16f60 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20 20 20  ll->xCmp );.    
16f70 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20 73 71    }.      n = sq
16f80 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65 73 28  lite3ValueBytes(
16f90 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  pVal, pColl->enc
16fa0 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  );..      for(i=
16fb0 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e 44 45  0; i<SQLITE_INDE
16fc0 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b 29 7b  X_SAMPLES; i++){
16fd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a  .        int c;.
16fe0 20 20 20 20 20 20 20 20 69 6e 74 20 65 53 61 6d          int eSam
16ff0 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d 70 6c  pletype = aSampl
17000 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20 20 20  e[i].eType;.    
17010 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c 65 74      if( eSamplet
17020 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  ype==SQLITE_NULL
17030 20 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70 65 3c   || eSampletype<
17040 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e 75 65  eType ) continue
17050 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 65  ;.        if( (e
17060 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54 79 70  Sampletype!=eTyp
17070 65 29 20 29 20 62 72 65 61 6b 3b 0a 23 69 66 6e  e) ) break;.#ifn
17080 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17090 55 54 46 31 36 0a 20 20 20 20 20 20 20 20 69 66  UTF16.        if
170a0 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 21 3d 53 51  ( pColl->enc!=SQ
170b0 4c 49 54 45 5f 55 54 46 38 20 29 7b 0a 20 20 20  LITE_UTF8 ){.   
170c0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 61 6d 70         int nSamp
170d0 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  le;.          ch
170e0 61 72 20 2a 7a 53 61 6d 70 6c 65 20 3d 20 73 71  ar *zSample = sq
170f0 6c 69 74 65 33 55 74 66 38 74 6f 31 36 28 0a 20  lite3Utf8to16(. 
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2c               db,
17110 20 70 43 6f 6c 6c 2d 3e 65 6e 63 2c 20 61 53 61   pColl->enc, aSa
17120 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 61 53 61  mple[i].u.z, aSa
17130 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 26  mple[i].nByte, &
17140 6e 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 20 20  nSample.        
17150 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69    );.          i
17160 66 28 20 21 7a 53 61 6d 70 6c 65 20 29 7b 0a 20  f( !zSample ){. 
17170 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
17180 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
17190 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 20  led );.         
171a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
171b0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
171c0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63 20    }.          c 
171d0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
171e0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 53 61 6d  oll->pUser, nSam
171f0 70 6c 65 2c 20 7a 53 61 6d 70 6c 65 2c 20 6e 2c  ple, zSample, n,
17200 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   z);.          s
17210 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
17220 20 7a 53 61 6d 70 6c 65 29 3b 0a 20 20 20 20 20   zSample);.     
17230 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
17240 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20          {.      
17250 20 20 20 20 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78      c = pColl->x
17260 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
17270 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 6e 42 79  , aSample[i].nBy
17280 74 65 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 75  te, aSample[i].u
17290 2e 7a 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 20  .z, n, z);.     
172a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
172b0 20 63 2d 72 6f 75 6e 64 55 70 3e 3d 30 20 29 20   c-roundUp>=0 ) 
172c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
172d0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
172e0 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 53 51 4c  ( i>=0 && i<=SQL
172f0 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
17300 53 20 29 3b 0a 20 20 20 20 2a 70 69 52 65 67 69  S );.    *piRegi
17310 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  on = i;.  }.  re
17320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17330 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23 69  }.#endif   /* #i
17340 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
17350 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT2 */../*.
17360 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f 6e  ** If expression
17370 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e 74   pExpr represent
17380 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17390 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f  e, set *pp to po
173a0 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71 6c  int to.** an sql
173b0 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
173c0 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
173d0 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c 20  the same value, 
173e0 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a 2a  with affinity.**
173f0 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f 20   aff applied to 
17400 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75 72  it, before retur
17410 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65 20  ning. It is the 
17420 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
17430 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65 72  f the .** caller
17440 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72   to eventually r
17450 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72 75  elease this stru
17460 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e 67  cture by passing
17470 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74   it to .** sqlit
17480 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a  e3ValueFree()..*
17490 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
174a0 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20 72  ent parse is a r
174b0 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74 65  ecompile (sqlite
174c0 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61 6e  3Reprepare()) an
174d0 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61 6e  d pExpr.** is an
174e0 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74 68   SQL variable th
174f0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  at currently has
17500 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75   a non-NULL valu
17510 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a 2a  e bound to it,.*
17520 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c 69  * create an sqli
17530 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
17540 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
17550 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69 6e  his value, again
17560 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69 74   with.** affinit
17570 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  y aff applied to
17580 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a 2a   it, instead..**
17590 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 6f  .** If neither o
175a0 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70 6c  f the above appl
175b0 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55  y, set *pp to NU
175c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
175d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
175e0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
175f0 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  de. Otherwise, S
17600 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69 66  QLITE_OK..*/.#if
17610 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
17620 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20 69  E_STAT2.static i
17630 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72  nt valueFromExpr
17640 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
17650 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78 70  e, .  Expr *pExp
17660 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a 20  r, .  u8 aff, . 
17670 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
17680 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 70 45 78  *pp.){.  if( pEx
17690 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52 49 41  pr->op==TK_VARIA
176a0 42 4c 45 0a 20 20 20 7c 7c 20 28 70 45 78 70 72  BLE.   || (pExpr
176b0 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45  ->op==TK_REGISTE
176c0 52 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 32 3d  R && pExpr->op2=
176d0 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29 0a 20 20  =TK_VARIABLE).  
176e0 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 72 20  ){.    int iVar 
176f0 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
17700 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17710 65 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72  eSetVarmask(pPar
17720 73 65 2d 3e 70 56 64 62 65 2c 20 69 56 61 72 29  se->pVdbe, iVar)
17730 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 33 32 35  ; /* IMP: R-2325
17740 37 2d 30 32 37 37 38 20 2a 2f 0a 20 20 20 20 2a  7-02778 */.    *
17750 70 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  pp = sqlite3Vdbe
17760 47 65 74 56 61 6c 75 65 28 70 50 61 72 73 65 2d  GetValue(pParse-
17770 3e 70 52 65 70 72 65 70 61 72 65 2c 20 69 56 61  >pReprepare, iVa
17780 72 2c 20 61 66 66 29 3b 0a 20 20 20 20 72 65 74  r, aff);.    ret
17790 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
177a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
177b0 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
177c0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 45 78  (pParse->db, pEx
177d0 70 72 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  pr, SQLITE_UTF8,
177e0 20 61 66 66 2c 20 70 70 29 3b 0a 7d 0a 23 65 6e   aff, pp);.}.#en
177f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
17800 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
17810 20 74 6f 20 65 73 74 69 6d 61 74 65 20 74 68 65   to estimate the
17820 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
17830 74 68 61 74 20 77 69 6c 6c 20 62 65 20 76 69 73  that will be vis
17840 69 74 65 64 0a 2a 2a 20 62 79 20 73 63 61 6e 6e  ited.** by scann
17850 69 6e 67 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  ing an index for
17860 20 61 20 72 61 6e 67 65 20 6f 66 20 76 61 6c 75   a range of valu
17870 65 73 2e 20 54 68 65 20 72 61 6e 67 65 20 6d 61  es. The range ma
17880 79 20 68 61 76 65 20 61 6e 20 75 70 70 65 72 0a  y have an upper.
17890 2a 2a 20 62 6f 75 6e 64 2c 20 61 20 6c 6f 77 65  ** bound, a lowe
178a0 72 20 62 6f 75 6e 64 2c 20 6f 72 20 62 6f 74 68  r bound, or both
178b0 2e 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  . The WHERE clau
178c0 73 65 20 74 65 72 6d 73 20 74 68 61 74 20 73 65  se terms that se
178d0 74 20 74 68 65 20 75 70 70 65 72 0a 2a 2a 20 61  t the upper.** a
178e0 6e 64 20 6c 6f 77 65 72 20 62 6f 75 6e 64 73 20  nd lower bounds 
178f0 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 20  are represented 
17900 62 79 20 70 4c 6f 77 65 72 20 61 6e 64 20 70 55  by pLower and pU
17910 70 70 65 72 20 72 65 73 70 65 63 74 69 76 65 6c  pper respectivel
17920 79 2e 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  y. For.** exampl
17930 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  e, assuming that
17940 20 69 6e 64 65 78 20 70 20 69 73 20 6f 6e 20 74   index p is on t
17950 31 28 61 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  1(a):.**.**   ..
17960 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
17970 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
17980 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
17990 20 20 20 20 20 20 20 20 20 20 7c 5f 5f 5f 5f 5f            |_____
179a0 7c 20 20 20 7c 5f 5f 5f 5f 5f 7c 0a 2a 2a 20 20  |   |_____|.**  
179b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179c0 20 20 20 20 20 7c 20 20 20 20 20 20 20 20 20 7c       |         |
179d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
179e0 20 20 20 20 20 20 20 20 70 4c 6f 77 65 72 20 20          pLower  
179f0 20 20 70 55 70 70 65 72 0a 2a 2a 0a 2a 2a 20 49    pUpper.**.** I
17a00 66 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  f either of the 
17a10 75 70 70 65 72 20 6f 72 20 6c 6f 77 65 72 20 62  upper or lower b
17a20 6f 75 6e 64 20 69 73 20 6e 6f 74 20 70 72 65 73  ound is not pres
17a30 65 6e 74 2c 20 74 68 65 6e 20 4e 55 4c 4c 20 69  ent, then NULL i
17a40 73 20 70 61 73 73 65 64 20 69 6e 0a 2a 2a 20 70  s passed in.** p
17a50 6c 61 63 65 20 6f 66 20 74 68 65 20 63 6f 72 72  lace of the corr
17a60 65 73 70 6f 6e 64 69 6e 67 20 57 68 65 72 65 54  esponding WhereT
17a70 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  erm..**.** The n
17a80 45 71 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  Eq parameter is 
17a90 70 61 73 73 65 64 20 74 68 65 20 69 6e 64 65 78  passed the index
17aa0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 63 6f   of the index co
17ab0 6c 75 6d 6e 20 73 75 62 6a 65 63 74 20 74 6f 20  lumn subject to 
17ac0 74 68 65 0a 2a 2a 20 72 61 6e 67 65 20 63 6f 6e  the.** range con
17ad0 73 74 72 61 69 6e 74 2e 20 4f 72 2c 20 65 71 75  straint. Or, equ
17ae0 69 76 61 6c 65 6e 74 6c 79 2c 20 74 68 65 20 6e  ivalently, the n
17af0 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
17b00 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  y constraints.**
17b10 20 6f 70 74 69 6d 69 7a 65 64 20 62 79 20 74 68   optimized by th
17b20 65 20 70 72 6f 70 6f 73 65 64 20 69 6e 64 65 78  e proposed index
17b30 20 73 63 61 6e 2e 20 46 6f 72 20 65 78 61 6d 70   scan. For examp
17b40 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 6e 64  le, assuming ind
17b50 65 78 20 70 20 69 73 0a 2a 2a 20 6f 6e 20 74 31  ex p is.** on t1
17b60 28 61 2c 20 62 29 2c 20 61 6e 64 20 74 68 65 20  (a, b), and the 
17b70 53 51 4c 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a  SQL query is:.**
17b80 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
17b90 31 20 57 48 45 52 45 20 61 20 3d 20 3f 20 41 4e  1 WHERE a = ? AN
17ba0 44 20 62 20 3e 20 3f 20 41 4e 44 20 62 20 3c 20  D b > ? AND b < 
17bb0 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e  ? ....**.** then
17bc0 20 6e 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70   nEq should be p
17bd0 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
17be0 31 20 28 61 73 20 74 68 65 20 72 61 6e 67 65 20  1 (as the range 
17bf0 72 65 73 74 72 69 63 74 65 64 20 63 6f 6c 75 6d  restricted colum
17c00 6e 2c 0a 2a 2a 20 62 2c 20 69 73 20 74 68 65 20  n,.** b, is the 
17c10 73 65 63 6f 6e 64 20 6c 65 66 74 2d 6d 6f 73 74  second left-most
17c20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
17c30 6e 64 65 78 29 2e 20 4f 72 2c 20 69 66 20 74 68  ndex). Or, if th
17c40 65 20 71 75 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a  e query is:.**.*
17c50 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74 31 20  *   ... FROM t1 
17c60 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e 44 20  WHERE a > ? AND 
17c70 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  a < ? ....**.** 
17c80 74 68 65 6e 20 6e 45 71 20 73 68 6f 75 6c 64 20  then nEq should 
17c90 62 65 20 70 61 73 73 65 64 20 30 2e 0a 2a 2a 0a  be passed 0..**.
17ca0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
17cb0 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 74 65  value is an inte
17cc0 67 65 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e  ger between 1 an
17cd0 64 20 31 30 30 2c 20 69 6e 63 6c 75 73 69 76 65  d 100, inclusive
17ce0 2e 20 41 20 72 65 74 75 72 6e 0a 2a 2a 20 76 61  . A return.** va
17cf0 6c 75 65 20 6f 66 20 31 20 69 6e 64 69 63 61 74  lue of 1 indicat
17d00 65 73 20 74 68 61 74 20 74 68 65 20 70 72 6f 70  es that the prop
17d10 6f 73 65 64 20 72 61 6e 67 65 20 73 63 61 6e 20  osed range scan 
17d20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20 76  is expected to v
17d30 69 73 69 74 0a 2a 2a 20 61 70 70 72 6f 78 69 6d  isit.** approxim
17d40 61 74 65 6c 79 20 31 2f 31 30 30 74 68 20 28 31  ately 1/100th (1
17d50 25 29 20 6f 66 20 74 68 65 20 72 6f 77 73 20 73  %) of the rows s
17d60 65 6c 65 63 74 65 64 20 62 79 20 74 68 65 20 6e  elected by the n
17d70 45 71 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63  Eq equality.** c
17d80 6f 6e 73 74 72 61 69 6e 74 73 20 28 69 66 20 61  onstraints (if a
17d90 6e 79 29 2e 20 41 20 72 65 74 75 72 6e 20 76 61  ny). A return va
17da0 6c 75 65 20 6f 66 20 31 30 30 20 69 6e 64 69 63  lue of 100 indic
17db0 61 74 65 73 20 74 68 61 74 20 69 74 20 69 73 20  ates that it is 
17dc0 65 78 70 65 63 74 65 64 0a 2a 2a 20 74 68 61 74  expected.** that
17dd0 20 74 68 65 20 72 61 6e 67 65 20 73 63 61 6e 20   the range scan 
17de0 77 69 6c 6c 20 76 69 73 69 74 20 65 76 65 72 79  will visit every
17df0 20 72 6f 77 20 28 31 30 30 25 29 20 73 65 6c 65   row (100%) sele
17e00 63 74 65 64 20 62 79 20 74 68 65 20 65 71 75 61  cted by the equa
17e10 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
17e20 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  nts..**.** In th
17e30 65 20 61 62 73 65 6e 63 65 20 6f 66 20 73 71 6c  e absence of sql
17e40 69 74 65 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a  ite_stat2 ANALYZ
17e50 45 20 64 61 74 61 2c 20 65 61 63 68 20 72 61 6e  E data, each ran
17e60 67 65 20 69 6e 65 71 75 61 6c 69 74 79 0a 2a 2a  ge inequality.**
17e70 20 72 65 64 75 63 65 73 20 74 68 65 20 73 65 61   reduces the sea
17e80 72 63 68 20 73 70 61 63 65 20 62 79 20 33 2f 34  rch space by 3/4
17e90 74 68 73 2e 20 20 48 65 6e 63 65 20 61 20 73 69  ths.  Hence a si
17ea0 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
17eb0 28 78 3e 3f 29 0a 2a 2a 20 72 65 73 75 6c 74 73  (x>?).** results
17ec0 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f 66 20   in a return of 
17ed0 32 35 20 61 6e 64 20 61 20 72 61 6e 67 65 20 63  25 and a range c
17ee0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 20 41  onstraint (x>? A
17ef0 4e 44 20 78 3c 3f 29 20 72 65 73 75 6c 74 73 0a  ND x<?) results.
17f00 2a 2a 20 69 6e 20 61 20 72 65 74 75 72 6e 20 6f  ** in a return o
17f10 66 20 36 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  f 6..*/.static i
17f20 6e 74 20 77 68 65 72 65 52 61 6e 67 65 53 63 61  nt whereRangeSca
17f30 6e 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  nEst(.  Parse *p
17f40 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20  Parse,       /* 
17f50 50 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67  Parsing & code g
17f60 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78  enerating contex
17f70 74 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c  t */.  Index *p,
17f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17f90 68 65 20 69 6e 64 65 78 20 63 6f 6e 74 61 69 6e  he index contain
17fa0 69 6e 67 20 74 68 65 20 72 61 6e 67 65 2d 63 6f  ing the range-co
17fb0 6d 70 61 72 65 64 20 63 6f 6c 75 6d 6e 3b 20 22  mpared column; "
17fc0 78 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 2c  x" */.  int nEq,
17fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17fe0 69 6e 64 65 78 20 69 6e 74 6f 20 70 2d 3e 61 43  index into p->aC
17ff0 6f 6c 5b 5d 20 6f 66 20 74 68 65 20 72 61 6e 67  ol[] of the rang
18000 65 2d 63 6f 6d 70 61 72 65 64 20 63 6f 6c 75 6d  e-compared colum
18010 6e 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d  n */.  WhereTerm
18020 20 2a 70 4c 6f 77 65 72 2c 20 20 20 2f 2a 20 4c   *pLower,   /* L
18030 6f 77 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68  ower bound on th
18040 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78 3e  e range. ex: "x>
18050 31 32 33 22 20 4d 69 67 68 74 20 62 65 20 4e 55  123" Might be NU
18060 4c 4c 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72  LL */.  WhereTer
18070 6d 20 2a 70 55 70 70 65 72 2c 20 20 20 2f 2a 20  m *pUpper,   /* 
18080 55 70 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74  Upper bound on t
18090 68 65 20 72 61 6e 67 65 2e 20 65 78 3a 20 22 78  he range. ex: "x
180a0 3c 34 35 35 22 20 4d 69 67 68 74 20 62 65 20 4e  <455" Might be N
180b0 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ULL */.  int *pi
180c0 45 73 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Est           /*
180d0 20 4f 55 54 3a 20 52 65 74 75 72 6e 20 76 61 6c   OUT: Return val
180e0 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  ue */.){.  int r
180f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18100 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18110 41 42 4c 45 5f 53 54 41 54 32 0a 0a 20 20 69 66  ABLE_STAT2..  if
18120 28 20 6e 45 71 3d 3d 30 20 26 26 20 70 2d 3e 61  ( nEq==0 && p->a
18130 53 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 73 71  Sample ){.    sq
18140 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 4c 6f  lite3_value *pLo
18150 77 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20  werVal = 0;.    
18160 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
18170 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a 20 20  UpperVal = 0;.  
18180 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20 20 20    int iEst;.    
18190 69 6e 74 20 69 4c 6f 77 65 72 20 3d 20 30 3b 0a  int iLower = 0;.
181a0 20 20 20 20 69 6e 74 20 69 55 70 70 65 72 20 3d      int iUpper =
181b0 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41   SQLITE_INDEX_SA
181c0 4d 50 4c 45 53 3b 0a 20 20 20 20 69 6e 74 20 72  MPLES;.    int r
181d0 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20 30 3b  oundUpUpper = 0;
181e0 0a 20 20 20 20 69 6e 74 20 72 6f 75 6e 64 55 70  .    int roundUp
181f0 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 75  Lower = 0;.    u
18200 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61 62 6c  8 aff = p->pTabl
18210 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43 6f 6c  e->aCol[p->aiCol
18220 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69 74 79  umn[0]].affinity
18230 3b 0a 0a 20 20 20 20 69 66 28 20 70 4c 6f 77 65  ;..    if( pLowe
18240 72 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  r ){.      Expr 
18250 2a 70 45 78 70 72 20 3d 20 70 4c 6f 77 65 72 2d  *pExpr = pLower-
18260 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a  >pExpr->pRight;.
18270 20 20 20 20 20 20 72 63 20 3d 20 76 61 6c 75 65        rc = value
18280 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73 65 2c  FromExpr(pParse,
18290 20 70 45 78 70 72 2c 20 61 66 66 2c 20 26 70 4c   pExpr, aff, &pL
182a0 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20  owerVal);.      
182b0 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 2d 3e  assert( pLower->
182c0 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54  eOperator==WO_GT
182d0 20 7c 7c 20 70 4c 6f 77 65 72 2d 3e 65 4f 70 65   || pLower->eOpe
182e0 72 61 74 6f 72 3d 3d 57 4f 5f 47 45 20 29 3b 0a  rator==WO_GE );.
182f0 20 20 20 20 20 20 72 6f 75 6e 64 55 70 4c 6f 77        roundUpLow
18300 65 72 20 3d 20 28 70 4c 6f 77 65 72 2d 3e 65 4f  er = (pLower->eO
18310 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 47 54 29 20  perator==WO_GT) 
18320 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ?1:0;.    }.    
18330 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18340 4b 20 26 26 20 70 55 70 70 65 72 20 29 7b 0a 20  K && pUpper ){. 
18350 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
18360 20 3d 20 70 55 70 70 65 72 2d 3e 70 45 78 70 72   = pUpper->pExpr
18370 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
18380 72 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78  rc = valueFromEx
18390 70 72 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  pr(pParse, pExpr
183a0 2c 20 61 66 66 2c 20 26 70 55 70 70 65 72 56 61  , aff, &pUpperVa
183b0 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l);.      assert
183c0 28 20 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61  ( pUpper->eOpera
183d0 74 6f 72 3d 3d 57 4f 5f 4c 54 20 7c 7c 20 70 55  tor==WO_LT || pU
183e0 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  pper->eOperator=
183f0 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =WO_LE );.      
18400 72 6f 75 6e 64 55 70 55 70 70 65 72 20 3d 20 28  roundUpUpper = (
18410 70 55 70 70 65 72 2d 3e 65 4f 70 65 72 61 74 6f  pUpper->eOperato
18420 72 3d 3d 57 4f 5f 4c 45 29 20 3f 31 3a 30 3b 0a  r==WO_LE) ?1:0;.
18430 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
18440 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
18450 28 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26  (pLowerVal==0 &&
18460 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29   pUpperVal==0) )
18470 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
18480 61 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56  alueFree(pLowerV
18490 61 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  al);.      sqlit
184a0 65 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70  e3ValueFree(pUpp
184b0 65 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f  erVal);.      go
184c0 74 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c  to range_est_fal
184d0 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65  lback;.    }else
184e0 20 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d   if( pLowerVal==
184f0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
18500 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e  whereRangeRegion
18510 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70  (pParse, p, pUpp
18520 65 72 56 61 6c 2c 20 72 6f 75 6e 64 55 70 55 70  erVal, roundUpUp
18530 70 65 72 2c 20 26 69 55 70 70 65 72 29 3b 0a 20  per, &iUpper);. 
18540 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72 20       if( pLower 
18550 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70 65  ) iLower = iUppe
18560 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  r/2;.    }else i
18570 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 20  f( pUpperVal==0 
18580 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68  ){.      rc = wh
18590 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70  ereRangeRegion(p
185a0 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72  Parse, p, pLower
185b0 56 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65  Val, roundUpLowe
185c0 72 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20  r, &iLower);.   
185d0 20 20 20 69 66 28 20 70 55 70 70 65 72 20 29 20     if( pUpper ) 
185e0 69 55 70 70 65 72 20 3d 20 28 69 4c 6f 77 65 72  iUpper = (iLower
185f0 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f   + SQLITE_INDEX_
18600 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f 32 3b 0a  SAMPLES + 1)/2;.
18610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18620 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e 67 65   rc = whereRange
18630 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c 20 70  Region(pParse, p
18640 2c 20 70 55 70 70 65 72 56 61 6c 2c 20 72 6f 75  , pUpperVal, rou
18650 6e 64 55 70 55 70 70 65 72 2c 20 26 69 55 70 70  ndUpUpper, &iUpp
18660 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
18670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18680 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 68 65          rc = whe
18690 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
186a0 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56  arse, p, pLowerV
186b0 61 6c 2c 20 72 6f 75 6e 64 55 70 4c 6f 77 65 72  al, roundUpLower
186c0 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20  , &iLower);.    
186d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 57 48    }.    }.    WH
186e0 45 52 45 54 52 41 43 45 28 28 22 72 61 6e 67 65  ERETRACE(("range
186f0 20 73 63 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25   scan regions: %
18700 64 2e 2e 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72  d..%d\n", iLower
18710 2c 20 69 55 70 70 65 72 29 29 3b 0a 0a 20 20 20  , iUpper));..   
18720 20 69 45 73 74 20 3d 20 69 55 70 70 65 72 20 2d   iEst = iUpper -
18730 20 69 4c 6f 77 65 72 3b 0a 20 20 20 20 74 65 73   iLower;.    tes
18740 74 63 61 73 65 28 20 69 45 73 74 3d 3d 53 51 4c  tcase( iEst==SQL
18750 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45  ITE_INDEX_SAMPLE
18760 53 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  S );.    assert(
18770 20 69 45 73 74 3c 3d 53 51 4c 49 54 45 5f 49 4e   iEst<=SQLITE_IN
18780 44 45 58 5f 53 41 4d 50 4c 45 53 20 29 3b 0a 20  DEX_SAMPLES );. 
18790 20 20 20 69 66 28 20 69 45 73 74 3c 31 20 29 7b     if( iEst<1 ){
187a0 0a 20 20 20 20 20 20 2a 70 69 45 73 74 20 3d 20  .      *piEst = 
187b0 35 30 2f 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  50/SQLITE_INDEX_
187c0 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d 65 6c  SAMPLES;.    }el
187d0 73 65 7b 0a 20 20 20 20 20 20 2a 70 69 45 73 74  se{.      *piEst
187e0 20 3d 20 28 69 45 73 74 2a 31 30 30 29 2f 53 51   = (iEst*100)/SQ
187f0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
18800 45 53 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ES;.    }.    sq
18810 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
18820 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20 20 20 73  LowerVal);.    s
18830 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
18840 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20 20  pUpperVal);.    
18850 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 72  return rc;.  }.r
18860 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61 63  ange_est_fallbac
18870 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  k:.#else.  UNUSE
18880 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 61 72  D_PARAMETER(pPar
18890 73 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  se);.  UNUSED_PA
188a0 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e  RAMETER(p);.  UN
188b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
188c0 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  Eq);.#endif.  as
188d0 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c 7c 20  sert( pLower || 
188e0 70 55 70 70 65 72 20 29 3b 0a 20 20 2a 70 69 45  pUpper );.  *piE
188f0 73 74 20 3d 20 31 30 30 3b 0a 20 20 69 66 28 20  st = 100;.  if( 
18900 70 4c 6f 77 65 72 20 26 26 20 28 70 4c 6f 77 65  pLower && (pLowe
18910 72 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  r->wtFlags & TER
18920 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 20 2a 70  M_VNULL)==0 ) *p
18930 69 45 73 74 20 2f 3d 20 34 3b 0a 20 20 69 66 28  iEst /= 4;.  if(
18940 20 70 55 70 70 65 72 20 29 20 2a 70 69 45 73 74   pUpper ) *piEst
18950 20 2f 3d 20 34 3b 0a 20 20 72 65 74 75 72 6e 20   /= 4;.  return 
18960 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
18970 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
18980 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74 65  2./*.** Estimate
18990 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
189a0 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ows that will be
189b0 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64 20   returned based 
189c0 6f 6e 0a 2a 2a 20 61 6e 20 65 71 75 61 6c 69 74  on.** an equalit
189d0 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 78 3d 56  y constraint x=V
189e0 41 4c 55 45 20 61 6e 64 20 77 68 65 72 65 20 74  ALUE and where t
189f0 68 61 74 20 56 41 4c 55 45 20 6f 63 63 75 72 73  hat VALUE occurs
18a00 20 69 6e 0a 2a 2a 20 74 68 65 20 68 69 73 74 6f   in.** the histo
18a10 67 72 61 6d 20 64 61 74 61 2e 20 20 54 68 69 73  gram data.  This
18a20 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 77 68 65 6e   only works when
18a30 20 78 20 69 73 20 74 68 65 20 6c 65 66 74 2d 6d   x is the left-m
18a40 6f 73 74 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 6f 66  ost.** column of
18a50 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 73 71   an index and sq
18a60 6c 69 74 65 5f 73 74 61 74 32 20 68 69 73 74 6f  lite_stat2 histo
18a70 67 72 61 6d 20 64 61 74 61 20 69 73 20 61 76 61  gram data is ava
18a80 69 6c 61 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68  ilable.** for th
18a90 61 74 20 69 6e 64 65 78 2e 20 20 57 68 65 6e 20  at index.  When 
18aa0 70 45 78 70 72 3d 3d 4e 55 4c 4c 20 74 68 61 74  pExpr==NULL that
18ab0 20 6d 65 61 6e 73 20 74 68 65 20 63 6f 6e 73 74   means the const
18ac0 72 61 69 6e 74 20 69 73 0a 2a 2a 20 22 78 20 49  raint is.** "x I
18ad0 53 20 4e 55 4c 4c 22 20 69 6e 73 74 65 61 64 20  S NULL" instead 
18ae0 6f 66 20 22 78 3d 56 41 4c 55 45 22 2e 0a 2a 2a  of "x=VALUE"..**
18af0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 65 73  .** Write the es
18b00 74 69 6d 61 74 65 64 20 72 6f 77 20 63 6f 75 6e  timated row coun
18b10 74 20 69 6e 74 6f 20 2a 70 6e 52 6f 77 20 61 6e  t into *pnRow an
18b20 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
18b30 4f 4b 2e 20 0a 2a 2a 20 49 66 20 75 6e 61 62 6c  OK. .** If unabl
18b40 65 20 74 6f 20 6d 61 6b 65 20 61 6e 20 65 73 74  e to make an est
18b50 69 6d 61 74 65 2c 20 6c 65 61 76 65 20 2a 70 6e  imate, leave *pn
18b60 52 6f 77 20 75 6e 63 68 61 6e 67 65 64 20 61 6e  Row unchanged an
18b70 64 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d  d return.** non-
18b80 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  zero..**.** This
18b90 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 66 61 69   routine can fai
18ba0 6c 20 69 66 20 69 74 20 69 73 20 75 6e 61 62 6c  l if it is unabl
18bb0 65 20 74 6f 20 6c 6f 61 64 20 61 20 63 6f 6c 6c  e to load a coll
18bc0 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 0a 2a  ating sequence.*
18bd0 2a 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 73  * required for s
18be0 74 72 69 6e 67 20 63 6f 6d 70 61 72 69 73 6f 6e  tring comparison
18bf0 2c 20 6f 72 20 69 66 20 75 6e 61 62 6c 65 20 74  , or if unable t
18c00 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
18c10 79 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 20 63  y.** for a UTF c
18c20 6f 6e 76 65 72 73 69 6f 6e 20 72 65 71 75 69 72  onversion requir
18c30 65 64 20 66 6f 72 20 63 6f 6d 70 61 72 69 73 6f  ed for compariso
18c40 6e 2e 20 20 54 68 65 20 65 72 72 6f 72 20 69 73  n.  The error is
18c50 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68   stored.** in th
18c60 65 20 70 50 61 72 73 65 20 73 74 72 75 63 74 75  e pParse structu
18c70 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18c80 74 20 77 68 65 72 65 45 71 75 61 6c 53 63 61 6e  t whereEqualScan
18c90 45 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50  Est(.  Parse *pP
18ca0 61 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 50  arse,       /* P
18cb0 61 72 73 69 6e 67 20 26 20 63 6f 64 65 20 67 65  arsing & code ge
18cc0 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74  nerating context
18cd0 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 2c 20   */.  Index *p, 
18ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
18cf0 65 20 69 6e 64 65 78 20 77 68 6f 73 65 20 6c 65  e index whose le
18d00 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69  ft-most column i
18d10 73 20 70 54 65 72 6d 20 2a 2f 0a 20 20 45 78 70  s pTerm */.  Exp
18d20 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
18d30 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20    /* Expression 
18d40 66 6f 72 20 56 41 4c 55 45 20 69 6e 20 74 68 65  for VALUE in the
18d50 20 78 3d 56 41 4c 55 45 20 63 6f 6e 73 74 72 61   x=VALUE constra
18d60 69 6e 74 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20  int */.  double 
18d70 2a 70 6e 52 6f 77 20 20 20 20 20 20 20 20 2f 2a  *pnRow        /*
18d80 20 57 72 69 74 65 20 74 68 65 20 72 65 76 69 73   Write the revis
18d90 65 64 20 72 6f 77 20 65 73 74 69 6d 61 74 65 20  ed row estimate 
18da0 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  here */.){.  sql
18db0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 68 73  ite3_value *pRhs
18dc0 20 3d 20 30 3b 20 20 2f 2a 20 56 41 4c 55 45 20   = 0;  /* VALUE 
18dd0 6f 6e 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  on right-hand si
18de0 64 65 20 6f 66 20 70 54 65 72 6d 20 2a 2f 0a 20  de of pTerm */. 
18df0 20 69 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70   int iLower, iUp
18e00 70 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 52 61  per;       /* Ra
18e10 6e 67 65 20 6f 66 20 68 69 73 74 6f 67 72 61 6d  nge of histogram
18e20 20 72 65 67 69 6f 6e 73 20 63 6f 6e 74 61 69 6e   regions contain
18e30 69 6e 67 20 70 52 68 73 20 2a 2f 0a 20 20 75 38  ing pRhs */.  u8
18e40 20 61 66 66 3b 20 20 20 20 20 20 20 20 20 20 20   aff;           
18e50 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
18e60 6e 20 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20  n affinity */.  
18e70 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
18e90 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20  function return 
18ea0 63 6f 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65  code */.  double
18eb0 20 6e 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20   nRowEst;       
18ec0 20 20 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d      /* New estim
18ed0 61 74 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ate of the numbe
18ee0 72 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 0a 20 20  r of rows */..  
18ef0 61 73 73 65 72 74 28 20 70 2d 3e 61 53 61 6d 70  assert( p->aSamp
18f00 6c 65 21 3d 30 20 29 3b 0a 20 20 61 66 66 20 3d  le!=0 );.  aff =
18f10 20 70 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c   p->pTable->aCol
18f20 5b 70 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d  [p->aiColumn[0]]
18f30 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 69 66 28  .affinity;.  if(
18f40 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 72 63   pExpr ){.    rc
18f50 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72   = valueFromExpr
18f60 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
18f70 61 66 66 2c 20 26 70 52 68 73 29 3b 0a 20 20 20  aff, &pRhs);.   
18f80 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 77   if( rc ) goto w
18f90 68 65 72 65 45 71 75 61 6c 53 63 61 6e 45 73 74  hereEqualScanEst
18fa0 5f 63 61 6e 63 65 6c 3b 0a 20 20 7d 65 6c 73 65  _cancel;.  }else
18fb0 7b 0a 20 20 20 20 70 52 68 73 20 3d 20 73 71 6c  {.    pRhs = sql
18fc0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 70 50 61  ite3ValueNew(pPa
18fd0 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20 20  rse->db);.  }.  
18fe0 69 66 28 20 70 52 68 73 3d 3d 30 20 29 20 72 65  if( pRhs==0 ) re
18ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
19000 4f 55 4e 44 3b 0a 20 20 72 63 20 3d 20 77 68 65  OUND;.  rc = whe
19010 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
19020 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 30  arse, p, pRhs, 0
19030 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 69 66  , &iLower);.  if
19040 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
19050 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
19060 6e 63 65 6c 3b 0a 20 20 72 63 20 3d 20 77 68 65  ncel;.  rc = whe
19070 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
19080 61 72 73 65 2c 20 70 2c 20 70 52 68 73 2c 20 31  arse, p, pRhs, 1
19090 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20 69 66  , &iUpper);.  if
190a0 28 20 72 63 20 29 20 67 6f 74 6f 20 77 68 65 72  ( rc ) goto wher
190b0 65 45 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61  eEqualScanEst_ca
190c0 6e 63 65 6c 3b 0a 20 20 57 48 45 52 45 54 52 41  ncel;.  WHERETRA
190d0 43 45 28 28 22 65 71 75 61 6c 69 74 79 20 73 63  CE(("equality sc
190e0 61 6e 20 72 65 67 69 6f 6e 73 3a 20 25 64 2e 2e  an regions: %d..
190f0 25 64 5c 6e 22 2c 20 69 4c 6f 77 65 72 2c 20 69  %d\n", iLower, i
19100 55 70 70 65 72 29 29 3b 0a 20 20 69 66 28 20 69  Upper));.  if( i
19110 4c 6f 77 65 72 3e 3d 69 55 70 70 65 72 20 29 7b  Lower>=iUpper ){
19120 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 70  .    nRowEst = p
19130 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f 28 53  ->aiRowEst[0]/(S
19140 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
19150 4c 45 53 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  LES*2);.    if( 
19160 6e 52 6f 77 45 73 74 3c 2a 70 6e 52 6f 77 20 29  nRowEst<*pnRow )
19170 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77 45 73   *pnRow = nRowEs
19180 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
19190 6e 52 6f 77 45 73 74 20 3d 20 28 69 55 70 70 65  nRowEst = (iUppe
191a0 72 2d 69 4c 6f 77 65 72 29 2a 70 2d 3e 61 69 52  r-iLower)*p->aiR
191b0 6f 77 45 73 74 5b 30 5d 2f 53 51 4c 49 54 45 5f  owEst[0]/SQLITE_
191c0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20  INDEX_SAMPLES;. 
191d0 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52 6f 77     *pnRow = nRow
191e0 45 73 74 3b 0a 20 20 7d 0a 0a 77 68 65 72 65 45  Est;.  }..whereE
191f0 71 75 61 6c 53 63 61 6e 45 73 74 5f 63 61 6e 63  qualScanEst_canc
19200 65 6c 3a 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  el:.  sqlite3Val
19210 75 65 46 72 65 65 28 70 52 68 73 29 3b 0a 20 20  ueFree(pRhs);.  
19220 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19230 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53  dif /* defined(S
19240 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
19250 54 32 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  T2) */..#ifdef S
19260 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
19270 54 32 0a 2f 2a 0a 2a 2a 20 45 73 74 69 6d 61 74  T2./*.** Estimat
19280 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
19290 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
192a0 65 20 72 65 74 75 72 6e 65 64 20 62 61 73 65 64  e returned based
192b0 20 6f 6e 0a 2a 2a 20 61 6e 20 49 4e 20 63 6f 6e   on.** an IN con
192c0 73 74 72 61 69 6e 74 20 77 68 65 72 65 20 74 68  straint where th
192d0 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
192e0 65 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  e of the IN oper
192f0 61 74 6f 72 0a 2a 2a 20 69 73 20 61 20 6c 69 73  ator.** is a lis
19300 74 20 6f 66 20 76 61 6c 75 65 73 2e 20 20 45 78  t of values.  Ex
19310 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ample:.**.**    
19320 20 20 20 20 57 48 45 52 45 20 78 20 49 4e 20 28      WHERE x IN (
19330 31 2c 32 2c 33 2c 34 29 0a 2a 2a 0a 2a 2a 20 57  1,2,3,4).**.** W
19340 72 69 74 65 20 74 68 65 20 65 73 74 69 6d 61 74  rite the estimat
19350 65 64 20 72 6f 77 20 63 6f 75 6e 74 20 69 6e 74  ed row count int
19360 6f 20 2a 70 6e 52 6f 77 20 61 6e 64 20 72 65 74  o *pnRow and ret
19370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 0a  urn SQLITE_OK. .
19380 2a 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f 20  ** If unable to 
19390 6d 61 6b 65 20 61 6e 20 65 73 74 69 6d 61 74 65  make an estimate
193a0 2c 20 6c 65 61 76 65 20 2a 70 6e 52 6f 77 20 75  , leave *pnRow u
193b0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 72 65 74  nchanged and ret
193c0 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2e  urn.** non-zero.
193d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
193e0 69 6e 65 20 63 61 6e 20 66 61 69 6c 20 69 66 20  ine can fail if 
193f0 69 74 20 69 73 20 75 6e 61 62 6c 65 20 74 6f 20  it is unable to 
19400 6c 6f 61 64 20 61 20 63 6f 6c 6c 61 74 69 6e 67  load a collating
19410 20 73 65 71 75 65 6e 63 65 0a 2a 2a 20 72 65 71   sequence.** req
19420 75 69 72 65 64 20 66 6f 72 20 73 74 72 69 6e 67  uired for string
19430 20 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 6f 72 20   comparison, or 
19440 69 66 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  if unable to all
19450 6f 63 61 74 65 20 6d 65 6d 6f 72 79 0a 2a 2a 20  ocate memory.** 
19460 66 6f 72 20 61 20 55 54 46 20 63 6f 6e 76 65 72  for a UTF conver
19470 73 69 6f 6e 20 72 65 71 75 69 72 65 64 20 66 6f  sion required fo
19480 72 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 20 20 54  r comparison.  T
19490 68 65 20 65 72 72 6f 72 20 69 73 20 73 74 6f 72  he error is stor
194a0 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 50 61  ed.** in the pPa
194b0 72 73 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  rse structure..*
194c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65  /.static int whe
194d0 72 65 49 6e 53 63 61 6e 45 73 74 28 0a 20 20 50  reInScanEst(.  P
194e0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
194f0 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 26      /* Parsing &
19500 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67   code generating
19510 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
19520 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
19530 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
19540 77 68 6f 73 65 20 6c 65 66 74 2d 6d 6f 73 74 20  whose left-most 
19550 63 6f 6c 75 6d 6e 20 69 73 20 70 54 65 72 6d 20  column is pTerm 
19560 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
19570 4c 69 73 74 2c 20 20 20 20 20 2f 2a 20 54 68 65  List,     /* The
19580 20 76 61 6c 75 65 20 6c 69 73 74 20 6f 6e 20 74   value list on t
19590 68 65 20 52 48 53 20 6f 66 20 22 78 20 49 4e 20  he RHS of "x IN 
195a0 28 76 31 2c 76 32 2c 76 33 2c 2e 2e 2e 29 22 20  (v1,v2,v3,...)" 
195b0 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 2a 70 6e 52  */.  double *pnR
195c0 6f 77 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  ow        /* Wri
195d0 74 65 20 74 68 65 20 72 65 76 69 73 65 64 20 72  te the revised r
195e0 6f 77 20 65 73 74 69 6d 61 74 65 20 68 65 72 65  ow estimate here
195f0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
19600 5f 76 61 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30  _value *pVal = 0
19610 3b 20 20 2f 2a 20 4f 6e 65 20 76 61 6c 75 65 20  ;  /* One value 
19620 66 72 6f 6d 20 6c 69 73 74 20 2a 2f 0a 20 20 69  from list */.  i
19630 6e 74 20 69 4c 6f 77 65 72 2c 20 69 55 70 70 65  nt iLower, iUppe
19640 72 3b 20 20 20 20 20 20 20 2f 2a 20 52 61 6e 67  r;       /* Rang
19650 65 20 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72  e of histogram r
19660 65 67 69 6f 6e 73 20 63 6f 6e 74 61 69 6e 69 6e  egions containin
19670 67 20 70 52 68 73 20 2a 2f 0a 20 20 75 38 20 61  g pRhs */.  u8 a
19680 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
19690 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
196a0 61 66 66 69 6e 69 74 79 20 2a 2f 0a 20 20 69 6e  affinity */.  in
196b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
196c0 3b 20 20 20 20 20 20 20 2f 2a 20 53 75 62 66 75  ;       /* Subfu
196d0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 20 63 6f  nction return co
196e0 64 65 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  de */.  double n
196f0 52 6f 77 45 73 74 3b 20 20 20 20 20 20 20 20 20  RowEst;         
19700 20 20 2f 2a 20 4e 65 77 20 65 73 74 69 6d 61 74    /* New estimat
19710 65 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  e of the number 
19720 6f 66 20 72 6f 77 73 20 2a 2f 0a 20 20 69 6e 74  of rows */.  int
19730 20 6e 53 70 61 6e 20 3d 20 30 3b 20 20 20 20 20   nSpan = 0;     
19740 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19750 20 6f 66 20 68 69 73 74 6f 67 72 61 6d 20 72 65   of histogram re
19760 67 69 6f 6e 73 20 73 70 61 6e 6e 65 64 20 2a 2f  gions spanned */
19770 0a 20 20 69 6e 74 20 6e 53 69 6e 67 6c 65 20 3d  .  int nSingle =
19780 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
19790 48 69 73 74 6f 67 72 61 6d 20 72 65 67 69 6f 6e  Histogram region
197a0 73 20 68 69 74 20 62 79 20 61 20 73 69 6e 67 6c  s hit by a singl
197b0 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  e value */.  int
197c0 20 6e 4e 6f 74 46 6f 75 6e 64 20 3d 20 30 3b 20   nNotFound = 0; 
197d0 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20         /* Count 
197e0 6f 66 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  of values that a
197f0 72 65 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74 73  re not constants
19800 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 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 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
19830 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
19840 75 38 20 61 53 70 61 6e 5b 53 51 4c 49 54 45 5f  u8 aSpan[SQLITE_
19850 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31 5d  INDEX_SAMPLES+1]
19860 3b 20 20 20 20 2f 2a 20 48 69 73 74 6f 67 72 61  ;    /* Histogra
19870 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20 61  m regions that a
19880 72 65 20 73 70 61 6e 6e 65 64 20 2a 2f 0a 20 20  re spanned */.  
19890 75 38 20 61 53 69 6e 67 6c 65 5b 53 51 4c 49 54  u8 aSingle[SQLIT
198a0 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b  E_INDEX_SAMPLES+
198b0 31 5d 3b 20 20 2f 2a 20 48 69 73 74 6f 67 72 61  1];  /* Histogra
198c0 6d 20 72 65 67 69 6f 6e 73 20 68 69 74 20 6f 6e  m regions hit on
198d0 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
198e0 20 70 2d 3e 61 53 61 6d 70 6c 65 21 3d 30 20 29   p->aSample!=0 )
198f0 3b 0a 20 20 61 66 66 20 3d 20 70 2d 3e 70 54 61  ;.  aff = p->pTa
19900 62 6c 65 2d 3e 61 43 6f 6c 5b 70 2d 3e 61 69 43  ble->aCol[p->aiC
19910 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61 66 66 69 6e 69  olumn[0]].affini
19920 74 79 3b 0a 20 20 6d 65 6d 73 65 74 28 61 53 70  ty;.  memset(aSp
19930 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 53  an, 0, sizeof(aS
19940 70 61 6e 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  pan));.  memset(
19950 61 53 69 6e 67 6c 65 2c 20 30 2c 20 73 69 7a 65  aSingle, 0, size
19960 6f 66 28 61 53 69 6e 67 6c 65 29 29 3b 0a 20 20  of(aSingle));.  
19970 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
19980 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
19990 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
199a0 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 72  ree(pVal);.    r
199b0 63 20 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  c = valueFromExp
199c0 72 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  r(pParse, pList-
199d0 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 61 66 66  >a[i].pExpr, aff
199e0 2c 20 26 70 56 61 6c 29 3b 0a 20 20 20 20 69 66  , &pVal);.    if
199f0 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20  ( rc ) break;.  
19a00 20 20 69 66 28 20 70 56 61 6c 3d 3d 30 20 7c 7c    if( pVal==0 ||
19a10 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
19a20 79 70 65 28 70 56 61 6c 29 3d 3d 53 51 4c 49 54  ype(pVal)==SQLIT
19a30 45 5f 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  E_NULL ){.      
19a40 6e 4e 6f 74 46 6f 75 6e 64 2b 2b 3b 0a 20 20 20  nNotFound++;.   
19a50 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
19a60 20 7d 0a 20 20 20 20 72 63 20 3d 20 77 68 65 72   }.    rc = wher
19a70 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61  eRangeRegion(pPa
19a80 72 73 65 2c 20 70 2c 20 70 56 61 6c 2c 20 30 2c  rse, p, pVal, 0,
19a90 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 69   &iLower);.    i
19aa0 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  f( rc ) break;. 
19ab0 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61 6e     rc = whereRan
19ac0 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65 2c  geRegion(pParse,
19ad0 20 70 2c 20 70 56 61 6c 2c 20 31 2c 20 26 69 55   p, pVal, 1, &iU
19ae0 70 70 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  pper);.    if( r
19af0 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  c ) break;.    i
19b00 66 28 20 69 4c 6f 77 65 72 3e 3d 69 55 70 70 65  f( iLower>=iUppe
19b10 72 20 29 7b 0a 20 20 20 20 20 20 61 53 69 6e 67  r ){.      aSing
19b20 6c 65 5b 69 4c 6f 77 65 72 5d 20 3d 20 31 3b 0a  le[iLower] = 1;.
19b30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19b40 20 61 73 73 65 72 74 28 20 69 4c 6f 77 65 72 3e   assert( iLower>
19b50 3d 30 20 26 26 20 69 55 70 70 65 72 3c 3d 53 51  =0 && iUpper<=SQ
19b60 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
19b70 45 53 20 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ES );.      whil
19b80 65 28 20 69 4c 6f 77 65 72 3c 69 55 70 70 65 72  e( iLower<iUpper
19b90 20 29 20 61 53 70 61 6e 5b 69 4c 6f 77 65 72 2b   ) aSpan[iLower+
19ba0 2b 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  +] = 1;.    }.  
19bb0 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
19bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72  TE_OK ){.    for
19bd0 28 69 3d 6e 53 70 61 6e 3d 30 3b 20 69 3c 3d 53  (i=nSpan=0; i<=S
19be0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
19bf0 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
19c00 20 69 66 28 20 61 53 70 61 6e 5b 69 5d 20 29 7b   if( aSpan[i] ){
19c10 0a 20 20 20 20 20 20 20 20 6e 53 70 61 6e 2b 2b  .        nSpan++
19c20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19c30 28 20 61 53 69 6e 67 6c 65 5b 69 5d 20 29 7b 0a  ( aSingle[i] ){.
19c40 20 20 20 20 20 20 20 20 6e 53 69 6e 67 6c 65 2b          nSingle+
19c50 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
19c60 0a 20 20 20 20 6e 52 6f 77 45 73 74 20 3d 20 28  .    nRowEst = (
19c70 6e 53 70 61 6e 2a 32 2b 6e 53 69 6e 67 6c 65 29  nSpan*2+nSingle)
19c80 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 2f  *p->aiRowEst[0]/
19c90 28 32 2a 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  (2*SQLITE_INDEX_
19ca0 53 41 4d 50 4c 45 53 29 0a 20 20 20 20 20 20 20  SAMPLES).       
19cb0 20 20 20 20 20 20 20 20 2b 20 6e 4e 6f 74 46 6f          + nNotFo
19cc0 75 6e 64 2a 70 2d 3e 61 69 52 6f 77 45 73 74 5b  und*p->aiRowEst[
19cd0 31 5d 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f 77  1];.    if( nRow
19ce0 45 73 74 20 3e 20 70 2d 3e 61 69 52 6f 77 45 73  Est > p->aiRowEs
19cf0 74 5b 30 5d 20 29 20 6e 52 6f 77 45 73 74 20 3d  t[0] ) nRowEst =
19d00 20 70 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 3b   p->aiRowEst[0];
19d10 0a 20 20 20 20 2a 70 6e 52 6f 77 20 3d 20 6e 52  .    *pnRow = nR
19d20 6f 77 45 73 74 3b 0a 20 20 20 20 57 48 45 52 45  owEst;.    WHERE
19d30 54 52 41 43 45 28 28 22 49 4e 20 72 6f 77 20 65  TRACE(("IN row e
19d40 73 74 69 6d 61 74 65 3a 20 6e 53 70 61 6e 3d 25  stimate: nSpan=%
19d50 64 2c 20 6e 53 69 6e 67 6c 65 3d 25 64 2c 20 6e  d, nSingle=%d, n
19d60 4e 6f 74 46 6f 75 6e 64 3d 25 64 2c 20 65 73 74  NotFound=%d, est
19d70 3d 25 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%g\n",.        
19d80 20 20 20 20 20 20 20 20 20 6e 53 70 61 6e 2c 20           nSpan, 
19d90 6e 53 69 6e 67 6c 65 2c 20 6e 4e 6f 74 46 6f 75  nSingle, nNotFou
19da0 6e 64 2c 20 6e 52 6f 77 45 73 74 29 29 3b 0a 20  nd, nRowEst));. 
19db0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75   }.  sqlite3Valu
19dc0 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 72  eFree(pVal);.  r
19dd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
19de0 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51  if /* defined(SQ
19df0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
19e00 32 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69  2) */.../*.** Fi
19e10 6e 64 20 74 68 65 20 62 65 73 74 20 71 75 65 72  nd the best quer
19e20 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65 73  y plan for acces
19e30 73 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61  sing a particula
19e40 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20  r table.  Write 
19e50 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72  the.** best quer
19e60 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63  y plan and its c
19e70 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65  ost into the Whe
19e80 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75  reCost object su
19e90 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a 2a 2a  pplied as the.**
19ea0 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e   last parameter.
19eb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73  .**.** The lowes
19ec0 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69 6e 73  t cost plan wins
19ed0 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73 20 61  .  The cost is a
19ee0 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
19ef0 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43  e amount of.** C
19f00 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20  PU and disk I/O 
19f10 6e 65 65 64 65 64 20 74 6f 20 70 72 6f 63 65 73  needed to proces
19f20 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
19f30 72 65 73 75 6c 74 2e 0a 2a 2a 20 46 61 63 74 6f  result..** Facto
19f40 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63  rs that influenc
19f50 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a  e cost include:.
19f60 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  **.**    *  The 
19f70 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  estimated number
19f80 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69   of rows that wi
19f90 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e  ll be retrieved.
19fa0 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20    (The.**       
19fb0 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72  fewer the better
19fc0 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  .).**.**    *  W
19fd0 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f  hether or not so
19fe0 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72  rting must occur
19ff0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ..**.**    *  Wh
1a000 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1a010 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72  re must be separ
1a020 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74  ate lookups in t
1a030 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65  he.**       inde
1a040 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69  x and in the mai
1a050 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  n table..**.** I
1a060 66 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49  f there was an I
1a070 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
1a080 20 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20   (pSrc->pIndex) 
1a090 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
1a0a0 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
1a0b0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  SQL statement, t
1a0c0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a0d0 6e 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73  n only considers
1a0e0 20 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65   plans using the
1a0f0 20 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78   .** named index
1a100 2e 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61  . If no such pla
1a110 6e 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  n is found, then
1a120 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f   the returned co
1a130 73 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f  st is.** SQLITE_
1a140 42 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c  BIG_DBL. If a pl
1a150 61 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74  an is found that
1a160 20 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20   uses the named 
1a170 69 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20  index, .** then 
1a180 74 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63  the cost is calc
1a190 75 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73  ulated in the us
1a1a0 75 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  ual way..**.** I
1a1b0 66 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20  f a NOT INDEXED 
1a1c0 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f  clause (pSrc->no
1a1d0 74 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73  tIndexed!=0) was
1a1e0 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
1a1f0 20 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68   table .** in th
1a200 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
1a210 6e 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65  nt, then no inde
1a220 78 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72  xes are consider
1a230 65 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65  ed. However, the
1a240 20 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c   .** selected pl
1a250 61 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b  an may still tak
1a260 65 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  e advantage of t
1a270 68 65 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69  he built-in rowi
1a280 64 20 70 72 69 6d 61 72 79 20 6b 65 79 0a 2a 2a  d primary key.**
1a290 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1a2a0 63 20 76 6f 69 64 20 62 65 73 74 42 74 72 65 65  c void bestBtree
1a2b0 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a  Index(.  Parse *
1a2c0 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
1a2d0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
1a2e0 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
1a2f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1a300 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  C,           /* 
1a310 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1a320 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1a330 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
1a340 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c    /* The FROM cl
1a350 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65 61  ause term to sea
1a360 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  rch */.  Bitmask
1a370 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 20   notReady,      
1a380 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
1a390 63 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69  cursors not avai
1a3a0 6c 61 62 6c 65 20 66 6f 72 20 69 6e 64 65 78 69  lable for indexi
1a3b0 6e 67 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ng */.  Bitmask 
1a3c0 6e 6f 74 56 61 6c 69 64 2c 20 20 20 20 20 20 20  notValid,       
1a3d0 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 6e      /* Cursors n
1a3e0 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ot available for
1a3f0 20 61 6e 79 20 70 75 72 70 6f 73 65 20 2a 2f 0a   any purpose */.
1a400 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
1a410 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  erBy,         /*
1a420 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
1a430 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
1a440 73 74 20 2a 70 44 69 73 74 69 6e 63 74 2c 20 20  st *pDistinct,  
1a450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 65 6c        /* The sel
1a460 65 63 74 2d 6c 69 73 74 20 69 66 20 71 75 65 72  ect-list if quer
1a470 79 20 69 73 20 44 49 53 54 49 4e 43 54 20 2a 2f  y is DISTINCT */
1a480 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43  .  WhereCost *pC
1a490 6f 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  ost            /
1a4a0 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75  * Lowest cost qu
1a4b0 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 20  ery plan */.){. 
1a4c0 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63   int iCur = pSrc
1a4d0 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20  ->iCursor;   /* 
1a4e0 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68  The cursor of th
1a4f0 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63  e table to be ac
1a500 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e 64 65  cessed */.  Inde
1a510 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20 20 20  x *pProbe;      
1a520 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e          /* An in
1a530 64 65 78 20 77 65 20 61 72 65 20 65 76 61 6c 75  dex we are evalu
1a540 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e 64 65 78  ating */.  Index
1a550 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1a560 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f         /* Copy o
1a570 66 20 70 50 72 6f 62 65 2c 20 6f 72 20 7a 65 72  f pProbe, or zer
1a580 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64 65 78 20  o for IPK index 
1a590 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d  */.  int eqTermM
1a5a0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
1a5b0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 61 73 6b   /* Current mask
1a5c0 20 6f 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69   of valid equali
1a5d0 74 79 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a  ty operators */.
1a5e0 20 20 69 6e 74 20 69 64 78 45 71 54 65 72 6d 4d    int idxEqTermM
1a5f0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ask;          /*
1a600 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f 66 20 76   Index mask of v
1a610 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
1a620 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 49 6e 64  erators */.  Ind
1a630 65 78 20 73 50 6b 3b 20 20 20 20 20 20 20 20 20  ex sPk;         
1a640 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 66 61           /* A fa
1a650 6b 65 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  ke index object 
1a660 66 6f 72 20 74 68 65 20 70 72 69 6d 61 72 79 20  for the primary 
1a670 6b 65 79 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  key */.  unsigne
1a680 64 20 69 6e 74 20 61 69 52 6f 77 45 73 74 50 6b  d int aiRowEstPk
1a690 5b 32 5d 3b 20 2f 2a 20 54 68 65 20 61 69 52 6f  [2]; /* The aiRo
1a6a0 77 45 73 74 5b 5d 20 76 61 6c 75 65 20 66 6f 72  wEst[] value for
1a6b0 20 74 68 65 20 73 50 6b 20 69 6e 64 65 78 20 2a   the sPk index *
1a6c0 2f 0a 20 20 69 6e 74 20 61 69 43 6f 6c 75 6d 6e  /.  int aiColumn
1a6d0 50 6b 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20  Pk = -1;        
1a6e0 2f 2a 20 54 68 65 20 61 43 6f 6c 75 6d 6e 5b 5d  /* The aColumn[]
1a6f0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
1a700 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
1a710 74 20 77 73 46 6c 61 67 4d 61 73 6b 3b 20 20 20  t wsFlagMask;   
1a720 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
1a730 6f 77 65 64 20 66 6c 61 67 73 20 69 6e 20 70 43  owed flags in pC
1a740 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  ost->plan.wsFlag
1a750 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61   */..  /* Initia
1a760 6c 69 7a 65 20 74 68 65 20 63 6f 73 74 20 74 6f  lize the cost to
1a770 20 61 20 77 6f 72 73 74 2d 63 61 73 65 20 76 61   a worst-case va
1a780 6c 75 65 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28  lue */.  memset(
1a790 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66  pCost, 0, sizeof
1a7a0 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f  (*pCost));.  pCo
1a7b0 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51 4c 49  st->rCost = SQLI
1a7c0 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 2f  TE_BIG_DBL;..  /
1a7d0 2a 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61  * If the pSrc ta
1a7e0 62 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74  ble is the right
1a7f0 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
1a800 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61   JOIN then we ma
1a810 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61  y not.  ** use a
1a820 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73  n index to satis
1a830 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74  fy IS NULL const
1a840 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74  raints on that t
1a850 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20  able.  This is. 
1a860 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75   ** because colu
1a870 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70  mns might end up
1a880 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74   being NULL if t
1a890 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f  he table does no
1a8a0 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61  t match -.  ** a
1a8b0 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68   circumstance wh
1a8c0 69 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61  ich the index ca
1a8d0 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73  nnot help us dis
1a8e0 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23  cover.  Ticket #
1a8f0 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  2177..  */.  if(
1a900 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20   pSrc->jointype 
1a910 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20 20 20  & JT_LEFT ){.   
1a920 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 20 3d   idxEqTermMask =
1a930 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
1a940 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 45 71  }else{.    idxEq
1a950 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
1a960 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c  |WO_IN|WO_ISNULL
1a970 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 72  ;.  }..  if( pSr
1a980 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20 20 20  c->pIndex ){.   
1a990 20 2f 2a 20 41 6e 20 49 4e 44 45 58 45 44 20 42   /* An INDEXED B
1a9a0 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66 69  Y clause specifi
1a9b0 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
1a9c0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 2a 2f 0a  index to use */.
1a9d0 20 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62      pIdx = pProb
1a9e0 65 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78  e = pSrc->pIndex
1a9f0 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b  ;.    wsFlagMask
1aa00 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44   = ~(WHERE_ROWID
1aa10 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
1aa20 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65  RANGE);.    eqTe
1aa30 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65  rmMask = idxEqTe
1aa40 72 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b  rmMask;.  }else{
1aa50 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
1aa60 20 6e 6f 20 49 4e 44 45 58 45 44 20 42 59 20 63   no INDEXED BY c
1aa70 6c 61 75 73 65 2e 20 20 43 72 65 61 74 65 20 61  lause.  Create a
1aa80 20 66 61 6b 65 20 49 6e 64 65 78 20 6f 62 6a 65   fake Index obje
1aa90 63 74 20 69 6e 20 6c 6f 63 61 6c 0a 20 20 20 20  ct in local.    
1aaa0 2a 2a 20 76 61 72 69 61 62 6c 65 20 73 50 6b 20  ** variable sPk 
1aab0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  to represent the
1aac0 20 72 6f 77 69 64 20 70 72 69 6d 61 72 79 20 6b   rowid primary k
1aad0 65 79 20 69 6e 64 65 78 2e 20 20 4d 61 6b 65 20  ey index.  Make 
1aae0 74 68 69 73 0a 20 20 20 20 2a 2a 20 66 61 6b 65  this.    ** fake
1aaf0 20 69 6e 64 65 78 20 74 68 65 20 66 69 72 73 74   index the first
1ab00 20 69 6e 20 61 20 63 68 61 69 6e 20 6f 66 20 49   in a chain of I
1ab10 6e 64 65 78 20 6f 62 6a 65 63 74 73 20 77 69 74  ndex objects wit
1ab20 68 20 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 61  h all of the rea
1ab30 6c 0a 20 20 20 20 2a 2a 20 69 6e 64 69 63 65 73  l.    ** indices
1ab40 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20   to follow */.  
1ab50 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73 74 3b    Index *pFirst;
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab70 20 20 2f 2a 20 46 69 72 73 74 20 6f 66 20 72 65    /* First of re
1ab80 61 6c 20 69 6e 64 69 63 65 73 20 6f 6e 20 74 68  al indices on th
1ab90 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d  e table */.    m
1aba0 65 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73  emset(&sPk, 0, s
1abb0 69 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20  izeof(Index));. 
1abc0 20 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d     sPk.nColumn =
1abd0 20 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f   1;.    sPk.aiCo
1abe0 6c 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e  lumn = &aiColumn
1abf0 50 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f  Pk;.    sPk.aiRo
1ac00 77 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50  wEst = aiRowEstP
1ac10 6b 3b 0a 20 20 20 20 73 50 6b 2e 6f 6e 45 72 72  k;.    sPk.onErr
1ac20 6f 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b  or = OE_Replace;
1ac30 0a 20 20 20 20 73 50 6b 2e 70 54 61 62 6c 65 20  .    sPk.pTable 
1ac40 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
1ac50 20 20 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20    aiRowEstPk[0] 
1ac60 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 6e 52  = pSrc->pTab->nR
1ac70 6f 77 45 73 74 3b 0a 20 20 20 20 61 69 52 6f 77  owEst;.    aiRow
1ac80 45 73 74 50 6b 5b 31 5d 20 3d 20 31 3b 0a 20 20  EstPk[1] = 1;.  
1ac90 20 20 70 46 69 72 73 74 20 3d 20 70 53 72 63 2d    pFirst = pSrc-
1aca0 3e 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 20  >pTab->pIndex;. 
1acb0 20 20 20 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74     if( pSrc->not
1acc0 49 6e 64 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20  Indexed==0 ){.  
1acd0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 61 6c 20      /* The real 
1ace0 69 6e 64 69 63 65 73 20 6f 66 20 74 68 65 20 74  indices of the t
1acf0 61 62 6c 65 20 61 72 65 20 6f 6e 6c 79 20 63 6f  able are only co
1ad00 6e 73 69 64 65 72 65 64 20 69 66 20 74 68 65 0a  nsidered if the.
1ad10 20 20 20 20 20 20 2a 2a 20 4e 4f 54 20 49 4e 44        ** NOT IND
1ad20 45 58 45 44 20 71 75 61 6c 69 66 69 65 72 20 69  EXED qualifier i
1ad30 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74  s omitted from t
1ad40 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
1ad50 2f 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65 78  /.      sPk.pNex
1ad60 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
1ad70 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d 20 26  }.    pProbe = &
1ad80 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61 67 4d  sPk;.    wsFlagM
1ad90 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20 20 20  ask = ~(.       
1ada0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
1adb0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51  |WHERE_COLUMN_EQ
1adc0 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
1add0 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  LL|WHERE_COLUMN_
1ade0 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20 20 20  RANGE.    );.   
1adf0 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f   eqTermMask = WO
1ae00 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20 20 70  _EQ|WO_IN;.    p
1ae10 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  Idx = 0;.  }..  
1ae20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c  /* Loop over all
1ae30 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69 6e 67   indices looking
1ae40 20 66 6f 72 20 74 68 65 20 62 65 73 74 20 6f 6e   for the best on
1ae50 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a 20 20  e to use.  */.  
1ae60 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 49  for(; pProbe; pI
1ae70 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  dx=pProbe=pProbe
1ae80 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 63 6f  ->pNext){.    co
1ae90 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  nst unsigned int
1aea0 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77 45 73   * const aiRowEs
1aeb0 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
1aec0 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62 6c 65  wEst;.    double
1aed0 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20   cost;          
1aee0 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66        /* Cost of
1aef0 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f   using pProbe */
1af00 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52 6f 77  .    double nRow
1af10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75   /* Estimated nu
1af30 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
1af40 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
1af50 20 20 64 6f 75 62 6c 65 20 6c 6f 67 31 30 4e 3b    double log10N;
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af70 20 62 61 73 65 2d 31 30 20 6c 6f 67 61 72 69 74   base-10 logarit
1af80 68 6d 20 6f 66 20 6e 52 6f 77 20 28 69 6e 65 78  hm of nRow (inex
1af90 61 63 74 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20  act) */.    int 
1afa0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
1afb0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1afc0 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
1afd0 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
1afe0 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 30 3b  int wsFlags = 0;
1aff0 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65  .    Bitmask use
1b000 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54  d = 0;..    /* T
1b010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
1b020 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
1b030 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
1b040 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 0a  e properties of.
1b050 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 62 65 69      ** index bei
1b060 6e 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68  ng evaluated. Th
1b070 65 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64  ey are then used
1b080 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
1b090 65 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a  e expected.    *
1b0a0 2a 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65  * cost and numbe
1b0b0 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
1b0c0 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
1b0d0 2a 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20  *  nEq: .    ** 
1b0e0 20 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75     Number of equ
1b0f0 61 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61 74  ality terms that
1b100 20 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e   can be implemen
1b110 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e  ted using the in
1b120 64 65 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 49  dex..    **    I
1b130 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74  n other words, t
1b140 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 69  he number of ini
1b150 74 69 61 6c 20 66 69 65 6c 64 73 20 69 6e 20 74  tial fields in t
1b160 68 65 20 69 6e 64 65 78 20 74 68 61 74 0a 20 20  he index that.  
1b170 20 20 2a 2a 20 20 20 20 61 72 65 20 75 73 65 64    **    are used
1b180 20 69 6e 20 3d 3d 20 6f 72 20 49 4e 20 6f 72 20   in == or IN or 
1b190 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
1b1a0 69 6e 74 73 20 6f 66 20 74 68 65 20 57 48 45 52  ints of the WHER
1b1b0 45 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2a  E clause..    **
1b1c0 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75 6c 3a  .    **  nInMul:
1b1d0 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 65    .    **    The
1b1e0 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65 72 22   "in-multiplier"
1b1f0 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65 73 74  . This is an est
1b200 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d 61 6e  imate of how man
1b210 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  y seek operation
1b220 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 51 4c  s .    **    SQL
1b230 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f 72 6d  ite must perform
1b240 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e   on the index in
1b250 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72 20 65   question. For e
1b260 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 0a  xample, if the .
1b270 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52 45 20      **    WHERE 
1b280 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20 20 2a  clause is:.    *
1b290 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48  *.    **      WH
1b2a0 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32 2c 20  ERE a IN (1, 2, 
1b2b0 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34 2c 20  3) AND b IN (4, 
1b2c0 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20 20 20  5, 6).    **.   
1b2d0 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
1b2e0 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c 6f 6f  st perform 9 loo
1b2f0 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64 65 78  kups on an index
1b300 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f 20 6e   on (a, b), so n
1b310 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20 2a 2a  InMul is .    **
1b320 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20 47 69      set to 9. Gi
1b330 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73 63 68  ven the same sch
1b340 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72 20 6f  ema and either o
1b350 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1b360 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20 20 20  WHERE .    **   
1b370 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20 2a 2a   clauses:.    **
1b380 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57 48 45  .    **      WHE
1b390 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20 2a 2a  RE a =  1.    **
1b3a0 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3e 3d        WHERE a >=
1b3b0 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   2.    **.    **
1b3c0 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20 73 65      nInMul is se
1b3d0 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a 0a 20  t to 1..    **. 
1b3e0 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68 65 72     **    If ther
1b3f0 65 20 65 78 69 73 74 73 20 61 20 57 48 45 52 45  e exists a WHERE
1b400 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72   term of the for
1b410 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  m "x IN (SELECT 
1b420 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20 20 20  ...)", then .   
1b430 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62 2d 73   **    the sub-s
1b440 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d 65 64  elect is assumed
1b450 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20 72 6f   to return 25 ro
1b460 77 73 20 66 6f 72 20 74 68 65 20 70 75 72 70 6f  ws for the purpo
1b470 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a 20 20  ses of .    **  
1b480 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 6e 49    determining nI
1b490 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nMul..    **.   
1b4a0 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20 0a 20   **  bInEst:  . 
1b4b0 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74 6f 20     **    Set to 
1b4c0 74 72 75 65 20 69 66 20 74 68 65 72 65 20 77 61  true if there wa
1b4d0 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 22  s at least one "
1b4e0 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  x IN (SELECT ...
1b4f0 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a 20 20  )" term used .  
1b500 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74 65 72    **    in deter
1b510 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  mining the value
1b520 20 6f 66 20 6e 49 6e 4d 75 6c 2e 20 20 4e 6f 74   of nInMul.  Not
1b530 65 20 74 68 61 74 20 74 68 65 20 52 48 53 20 6f  e that the RHS o
1b540 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 20 20 20  f the.    **    
1b550 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
1b560 20 62 65 20 61 20 53 45 4c 45 43 54 2c 20 6e 6f   be a SELECT, no
1b570 74 20 61 20 76 61 6c 75 65 20 6c 69 73 74 2c 20  t a value list, 
1b580 66 6f 72 20 74 68 69 73 20 76 61 72 69 61 62 6c  for this variabl
1b590 65 0a 20 20 20 20 2a 2a 20 20 20 20 74 6f 20 62  e.    **    to b
1b5a0 65 20 74 72 75 65 2e 0a 20 20 20 20 2a 2a 0a 20  e true..    **. 
1b5b0 20 20 20 2a 2a 20 20 65 73 74 42 6f 75 6e 64 3a     **  estBound:
1b5c0 0a 20 20 20 20 2a 2a 20 20 20 20 41 6e 20 65 73  .    **    An es
1b5d0 74 69 6d 61 74 65 20 6f 6e 20 74 68 65 20 61 6d  timate on the am
1b5e0 6f 75 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ount of the tabl
1b5f0 65 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 73  e that must be s
1b600 65 61 72 63 68 65 64 2e 20 20 41 0a 20 20 20 20  earched.  A.    
1b610 2a 2a 20 20 20 20 76 61 6c 75 65 20 6f 66 20 31  **    value of 1
1b620 30 30 20 6d 65 61 6e 73 20 74 68 65 20 65 6e 74  00 means the ent
1b630 69 72 65 20 74 61 62 6c 65 20 69 73 20 73 65 61  ire table is sea
1b640 72 63 68 65 64 2e 20 20 52 61 6e 67 65 20 63 6f  rched.  Range co
1b650 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
1b660 20 20 20 20 6d 69 67 68 74 20 72 65 64 75 63 65      might reduce
1b670 20 74 68 69 73 20 74 6f 20 61 20 76 61 6c 75 65   this to a value
1b680 20 6c 65 73 73 20 74 68 61 6e 20 31 30 30 20 74   less than 100 t
1b690 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1b6a0 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 61  only.    **    a
1b6b0 20 66 72 61 63 74 69 6f 6e 20 6f 66 20 74 68 65   fraction of the
1b6c0 20 74 61 62 6c 65 20 6e 65 65 64 73 20 73 65 61   table needs sea
1b6d0 72 63 68 69 6e 67 2e 20 20 49 6e 20 74 68 65 20  rching.  In the 
1b6e0 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20 20 2a  absence of.    *
1b6f0 2a 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74  *    sqlite_stat
1b700 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
1b710 61 20 73 69 6e 67 6c 65 20 69 6e 65 71 75 61 6c  a single inequal
1b720 69 74 79 20 72 65 64 75 63 65 73 20 74 68 65 20  ity reduces the 
1b730 73 65 61 72 63 68 0a 20 20 20 20 2a 2a 20 20 20  search.    **   
1b740 20 73 70 61 63 65 20 74 6f 20 31 2f 34 72 64 20   space to 1/4rd 
1b750 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
1b760 65 2e 20 20 53 6f 20 61 6e 20 78 3e 3f 20 63 6f  e.  So an x>? co
1b770 6e 73 74 72 61 69 6e 74 20 72 65 64 75 63 65 73  nstraint reduces
1b780 0a 20 20 20 20 2a 2a 20 20 20 20 65 73 74 42 6f  .    **    estBo
1b790 75 6e 64 20 74 6f 20 32 35 2e 20 20 54 77 6f 20  und to 25.  Two 
1b7a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78 3e 3f  constraints (x>?
1b7b0 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75 63 65   AND x<?) reduce
1b7c0 20 65 73 74 42 6f 75 6e 64 20 74 6f 20 36 2e 0a   estBound to 6..
1b7d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
1b7e0 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20  Sort:   .    ** 
1b7f0 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65     Boolean. True
1b800 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   if there is an 
1b810 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1b820 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
1b830 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  e an .    **    
1b840 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69  external sort (i
1b850 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65  .e. scanning the
1b860 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61   index being eva
1b870 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20  luated will not 
1b880 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65  .    **    corre
1b890 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72  ctly order recor
1b8a0 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ds)..    **.    
1b8b0 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20  **  bLookup: .  
1b8c0 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e    **    Boolean.
1b8d0 20 54 72 75 65 20 69 66 20 61 20 74 61 62 6c 65   True if a table
1b8e0 20 6c 6f 6f 6b 75 70 20 69 73 20 72 65 71 75 69   lookup is requi
1b8f0 72 65 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  red for each ind
1b900 65 78 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a 20  ex entry.    ** 
1b910 20 20 20 76 69 73 69 74 65 64 2e 20 20 49 6e 20     visited.  In 
1b920 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 74 72 75  other words, tru
1b930 65 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  e if this is not
1b940 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65   a covering inde
1b950 78 2e 0a 20 20 20 20 2a 2a 20 20 20 20 54 68 69  x..    **    Thi
1b960 73 20 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73  s is always fals
1b970 65 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20  e for the rowid 
1b980 70 72 69 6d 61 72 79 20 6b 65 79 20 69 6e 64 65  primary key inde
1b990 78 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 20 20  x of a table..  
1b9a0 20 20 2a 2a 20 20 20 20 46 6f 72 20 6f 74 68 65    **    For othe
1b9b0 72 20 69 6e 64 65 78 65 73 2c 20 69 74 20 69 73  r indexes, it is
1b9c0 20 74 72 75 65 20 75 6e 6c 65 73 73 20 61 6c 6c   true unless all
1b9d0 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20   the columns of 
1b9e0 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  the table.    **
1b9f0 20 20 20 20 75 73 65 64 20 62 79 20 74 68 65 20      used by the 
1ba00 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
1ba10 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20   are present in 
1ba20 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68 20  the index (such 
1ba30 61 6e 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 64  an.    **    ind
1ba40 65 78 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 20  ex is sometimes 
1ba50 64 65 73 63 72 69 62 65 64 20 61 73 20 61 20 63  described as a c
1ba60 6f 76 65 72 69 6e 67 20 69 6e 64 65 78 29 2e 0a  overing index)..
1ba70 20 20 20 20 2a 2a 20 20 20 20 46 6f 72 20 65 78      **    For ex
1ba80 61 6d 70 6c 65 2c 20 67 69 76 65 6e 20 74 68 65  ample, given the
1ba90 20 69 6e 64 65 78 20 6f 6e 20 28 61 2c 20 62 29   index on (a, b)
1baa0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 66 20  , the second of 
1bab0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20  the following . 
1bac0 20 20 20 2a 2a 20 20 20 20 74 77 6f 20 71 75 65     **    two que
1bad0 72 69 65 73 20 72 65 71 75 69 72 65 73 20 74 61  ries requires ta
1bae0 62 6c 65 20 62 2d 74 72 65 65 20 6c 6f 6f 6b 75  ble b-tree looku
1baf0 70 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 66  ps in order to f
1bb00 69 6e 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20  ind the value.  
1bb10 20 20 2a 2a 20 20 20 20 6f 66 20 63 6f 6c 75 6d    **    of colum
1bb20 6e 20 63 2c 20 62 75 74 20 74 68 65 20 66 69 72  n c, but the fir
1bb30 73 74 20 64 6f 65 73 20 6e 6f 74 20 62 65 63 61  st does not beca
1bb40 75 73 65 20 63 6f 6c 75 6d 6e 73 20 61 20 61 6e  use columns a an
1bb50 64 20 62 20 61 72 65 0a 20 20 20 20 2a 2a 20 20  d b are.    **  
1bb60 20 20 62 6f 74 68 20 61 76 61 69 6c 61 62 6c 65    both available
1bb70 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
1bb80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1bb90 20 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20           SELECT 
1bba0 61 2c 20 62 20 20 20 20 46 52 4f 4d 20 74 62 6c  a, b    FROM tbl
1bbb0 20 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20   WHERE a = 1;.  
1bbc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1bbd0 20 53 45 4c 45 43 54 20 61 2c 20 62 2c 20 63 20   SELECT a, b, c 
1bbe0 46 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61  FROM tbl WHERE a
1bbf0 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a 20 20 20   = 1;.    */.   
1bc00 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc20 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
1bc30 72 20 49 4e 20 74 65 72 6d 73 20 6d 61 74 63 68  r IN terms match
1bc40 69 6e 67 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  ing index */.   
1bc50 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30 3b   int bInEst = 0;
1bc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1bc70 2a 20 54 72 75 65 20 69 66 20 22 78 20 49 4e 20  * True if "x IN 
1bc80 28 53 45 4c 45 43 54 2e 2e 2e 29 22 20 73 65 65  (SELECT...)" see
1bc90 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 49 6e  n */.    int nIn
1bca0 4d 75 6c 20 3d 20 31 3b 20 20 20 20 20 20 20 20  Mul = 1;        
1bcb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1bcc0 20 6f 66 20 64 69 73 74 69 6e 63 74 20 65 71 75   of distinct equ
1bcd0 61 6c 69 74 69 65 73 20 74 6f 20 6c 6f 6f 6b 75  alities to looku
1bce0 70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 73 74  p */.    int est
1bcf0 42 6f 75 6e 64 20 3d 20 31 30 30 3b 20 20 20 20  Bound = 100;    
1bd00 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61         /* Estima
1bd10 74 65 64 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  ted reduction in
1bd20 20 73 65 61 72 63 68 20 73 70 61 63 65 20 2a 2f   search space */
1bd30 0a 20 20 20 20 69 6e 74 20 6e 42 6f 75 6e 64 20  .    int nBound 
1bd40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1bd50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bd60 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
1bd70 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 69 6e  s seen */.    in
1bd80 74 20 62 53 6f 72 74 20 3d 20 21 21 70 4f 72 64  t bSort = !!pOrd
1bd90 65 72 42 79 3b 20 20 20 20 20 20 20 2f 2a 20 54  erBy;       /* T
1bda0 72 75 65 20 69 66 20 65 78 74 65 72 6e 61 6c 20  rue if external 
1bdb0 73 6f 72 74 20 72 65 71 75 69 72 65 64 20 2a 2f  sort required */
1bdc0 0a 20 20 20 20 69 6e 74 20 62 44 69 73 74 20 3d  .    int bDist =
1bdd0 20 21 21 70 44 69 73 74 69 6e 63 74 3b 20 20 20   !!pDistinct;   
1bde0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
1bdf0 64 65 78 20 63 61 6e 6e 6f 74 20 68 65 6c 70 20  dex cannot help 
1be00 77 69 74 68 20 44 49 53 54 49 4e 43 54 20 2a 2f  with DISTINCT */
1be10 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70  .    int bLookup
1be20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1be30 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
1be40 74 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64  t a covering ind
1be50 65 78 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  ex */.    WhereT
1be60 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
1be70 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
1be80 67 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  gle term of the 
1be90 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1bea0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
1beb0 41 42 4c 45 5f 53 54 41 54 32 0a 20 20 20 20 57  ABLE_STAT2.    W
1bec0 68 65 72 65 54 65 72 6d 20 2a 70 46 69 72 73 74  hereTerm *pFirst
1bed0 54 65 72 6d 20 3d 20 30 3b 20 20 20 20 2f 2a 20  Term = 0;    /* 
1bee0 46 69 72 73 74 20 74 65 72 6d 20 6d 61 74 63 68  First term match
1bef0 69 6e 67 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  ing the index */
1bf00 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1bf10 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
1bf20 6c 75 65 73 20 6f 66 20 6e 45 71 20 61 6e 64 20  lues of nEq and 
1bf30 6e 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f  nInMul */.    fo
1bf40 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72  r(nEq=0; nEq<pPr
1bf50 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45  obe->nColumn; nE
1bf60 71 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  q++){.      int 
1bf70 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f  j = pProbe->aiCo
1bf80 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20  lumn[nEq];.     
1bf90 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
1bfa0 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
1bfb0 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d  notReady, eqTerm
1bfc0 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20  Mask, pIdx);.   
1bfd0 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
1bfe0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 77  ) break;.      w
1bff0 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
1c000 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45  _COLUMN_EQ|WHERE
1c010 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20 20 20 20  _ROWID_EQ);.    
1c020 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
1c030 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29  erator & WO_IN )
1c040 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
1c050 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
1c060 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 77 73  Expr;.        ws
1c070 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  Flags |= WHERE_C
1c080 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
1c090 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
1c0a0 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1c0b0 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
1c0c0 20 20 20 20 20 20 20 20 2f 2a 20 22 78 20 49 4e          /* "x IN
1c0d0 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 3a 20   (SELECT ...)": 
1c0e0 20 41 73 73 75 6d 65 20 74 68 65 20 53 45 4c 45   Assume the SELE
1c0f0 43 54 20 72 65 74 75 72 6e 73 20 32 35 20 72 6f  CT returns 25 ro
1c100 77 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ws */.          
1c110 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20  nInMul *= 25;.  
1c120 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d          bInEst =
1c130 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
1c140 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 45 78  e if( ALWAYS(pEx
1c150 70 72 2d 3e 78 2e 70 4c 69 73 74 20 26 26 20 70  pr->x.pList && p
1c160 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
1c170 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
1c180 20 20 20 2f 2a 20 22 78 20 49 4e 20 28 76 61 6c     /* "x IN (val
1c190 75 65 2c 20 76 61 6c 75 65 2c 20 2e 2e 2e 29 22  ue, value, ...)"
1c1a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 49   */.          nI
1c1b0 6e 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78  nMul *= pExpr->x
1c1c0 2e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  .pList->nExpr;. 
1c1d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c1e0 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d 3e  else if( pTerm->
1c1f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
1c200 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20  SNULL ){.       
1c210 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
1c220 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 3b 0a 20  E_COLUMN_NULL;. 
1c230 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
1c240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1c250 32 0a 20 20 20 20 20 20 69 66 28 20 6e 45 71 3d  2.      if( nEq=
1c260 3d 30 20 26 26 20 70 50 72 6f 62 65 2d 3e 61 53  =0 && pProbe->aS
1c270 61 6d 70 6c 65 20 29 20 70 46 69 72 73 74 54 65  ample ) pFirstTe
1c280 72 6d 20 3d 20 70 54 65 72 6d 3b 0a 23 65 6e 64  rm = pTerm;.#end
1c290 69 66 0a 20 20 20 20 20 20 75 73 65 64 20 7c 3d  if.      used |=
1c2a0 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
1c2b0 67 68 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ght;.    }..    
1c2c0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
1c2d0 20 76 61 6c 75 65 20 6f 66 20 65 73 74 42 6f 75   value of estBou
1c2e0 6e 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  nd. */.    if( n
1c2f0 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75  Eq<pProbe->nColu
1c300 6d 6e 20 26 26 20 70 50 72 6f 62 65 2d 3e 62 55  mn && pProbe->bU
1c310 6e 6f 72 64 65 72 65 64 3d 3d 30 20 29 7b 0a 20  nordered==0 ){. 
1c320 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
1c330 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  obe->aiColumn[nE
1c340 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66 69  q];.      if( fi
1c350 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
1c360 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
1c370 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
1c380 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29 7b  |WO_GE, pIdx) ){
1c390 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
1c3a0 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64 54  rm *pTop = findT
1c3b0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
1c3c0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
1c3d0 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b 0a  T|WO_LE, pIdx);.
1c3e0 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
1c3f0 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54 65  m *pBtm = findTe
1c400 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
1c410 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
1c420 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a 20  |WO_GE, pIdx);. 
1c430 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e 67         whereRang
1c440 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65 2c  eScanEst(pParse,
1c450 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70 42   pProbe, nEq, pB
1c460 74 6d 2c 20 70 54 6f 70 2c 20 26 65 73 74 42 6f  tm, pTop, &estBo
1c470 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  und);.        if
1c480 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20  ( pTop ){.      
1c490 20 20 20 20 6e 42 6f 75 6e 64 20 3d 20 31 3b 0a      nBound = 1;.
1c4a0 20 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67            wsFlag
1c4b0 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c  s |= WHERE_TOP_L
1c4c0 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20  IMIT;.          
1c4d0 75 73 65 64 20 7c 3d 20 70 54 6f 70 2d 3e 70 72  used |= pTop->pr
1c4e0 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20 20  ereqRight;.     
1c4f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
1c500 20 70 42 74 6d 20 29 7b 0a 20 20 20 20 20 20 20   pBtm ){.       
1c510 20 20 20 6e 42 6f 75 6e 64 2b 2b 3b 0a 20 20 20     nBound++;.   
1c520 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
1c530 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
1c540 54 3b 0a 20 20 20 20 20 20 20 20 20 20 75 73 65  T;.          use
1c550 64 20 7c 3d 20 70 42 74 6d 2d 3e 70 72 65 72 65  d |= pBtm->prere
1c560 71 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  qRight;.        
1c570 7d 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  }.        wsFlag
1c580 73 20 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55  s |= (WHERE_COLU
1c590 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 52  MN_RANGE|WHERE_R
1c5a0 4f 57 49 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20  OWID_RANGE);.   
1c5b0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
1c5c0 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
1c5d0 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 29 7b 0a 20  or!=OE_None ){. 
1c5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
1c5f0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  sFlags & WHERE_C
1c600 4f 4c 55 4d 4e 5f 49 4e 20 29 3b 0a 20 20 20 20  OLUMN_IN );.    
1c610 20 20 74 65 73 74 63 61 73 65 28 20 77 73 46 6c    testcase( wsFl
1c620 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
1c630 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20  MN_NULL );.     
1c640 20 69 66 28 20 28 77 73 46 6c 61 67 73 20 26 20   if( (wsFlags & 
1c650 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e  (WHERE_COLUMN_IN
1c660 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55  |WHERE_COLUMN_NU
1c670 4c 4c 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  LL))==0 ){.     
1c680 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1c690 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20  ERE_UNIQUE;.    
1c6a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1c6b0 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
1c6c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1c6d0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 62   and the index b
1c6e0 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65 64 20  eing considered 
1c6f0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 6e 61 74 75  will.    ** natu
1c700 72 61 6c 6c 79 20 73 63 61 6e 20 72 6f 77 73 20  rally scan rows 
1c710 69 6e 20 74 68 65 20 72 65 71 75 69 72 65 64 20  in the required 
1c720 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20 61  order, set the a
1c730 70 70 72 6f 70 72 69 61 74 65 20 66 6c 61 67 73  ppropriate flags
1c740 0a 20 20 20 20 2a 2a 20 69 6e 20 77 73 46 6c 61  .    ** in wsFla
1c750 67 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  gs. Otherwise, i
1c760 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
1c770 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 62 75  DER BY clause bu
1c780 74 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20  t the index.    
1c790 2a 2a 20 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77  ** will scan row
1c7a0 73 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74  s in a different
1c7b0 20 6f 72 64 65 72 2c 20 73 65 74 20 74 68 65 20   order, set the 
1c7c0 62 53 6f 72 74 20 76 61 72 69 61 62 6c 65 2e 20  bSort variable. 
1c7d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 53 6f   */.    if( isSo
1c7e0 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 20 20  rtingIndex(.    
1c7f0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 57        pParse, pW
1c800 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 70 50 72  C->pMaskSet, pPr
1c810 6f 62 65 2c 20 69 43 75 72 2c 20 70 4f 72 64 65  obe, iCur, pOrde
1c820 72 42 79 2c 20 6e 45 71 2c 20 77 73 46 6c 61 67  rBy, nEq, wsFlag
1c830 73 2c 20 26 72 65 76 29 0a 20 20 20 20 29 7b 0a  s, &rev).    ){.
1c840 20 20 20 20 20 20 62 53 6f 72 74 20 3d 20 30 3b        bSort = 0;
1c850 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
1c860 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  = WHERE_ROWID_RA
1c870 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  NGE|WHERE_COLUMN
1c880 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f 52 44  _RANGE|WHERE_ORD
1c890 45 52 42 59 3b 0a 20 20 20 20 20 20 77 73 46 6c  ERBY;.      wsFl
1c8a0 61 67 73 20 7c 3d 20 28 72 65 76 20 3f 20 57 48  ags |= (rev ? WH
1c8b0 45 52 45 5f 52 45 56 45 52 53 45 20 3a 20 30 29  ERE_REVERSE : 0)
1c8c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c8d0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 44 49  If there is a DI
1c8e0 53 54 49 4e 43 54 20 71 75 61 6c 69 66 69 65 72  STINCT qualifier
1c8f0 20 61 6e 64 20 74 68 69 73 20 69 6e 64 65 78 20   and this index 
1c900 77 69 6c 6c 20 73 63 61 6e 20 72 6f 77 73 20 69  will scan rows i
1c910 6e 0a 20 20 20 20 2a 2a 20 6f 72 64 65 72 20 6f  n.    ** order o
1c920 66 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 65  f the DISTINCT e
1c930 78 70 72 65 73 73 69 6f 6e 73 2c 20 63 6c 65 61  xpressions, clea
1c940 72 20 62 44 69 73 74 20 61 6e 64 20 73 65 74 20  r bDist and set 
1c950 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a  the appropriate.
1c960 20 20 20 20 2a 2a 20 66 6c 61 67 73 20 69 6e 20      ** flags in 
1c970 77 73 46 6c 61 67 73 2e 20 2a 2f 0a 20 20 20 20  wsFlags. */.    
1c980 69 66 28 20 69 73 44 69 73 74 69 6e 63 74 49 6e  if( isDistinctIn
1c990 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
1c9a0 20 70 50 72 6f 62 65 2c 20 69 43 75 72 2c 20 70   pProbe, iCur, p
1c9b0 44 69 73 74 69 6e 63 74 2c 20 6e 45 71 29 20 29  Distinct, nEq) )
1c9c0 7b 0a 20 20 20 20 20 20 62 44 69 73 74 20 3d 20  {.      bDist = 
1c9d0 30 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73  0;.      wsFlags
1c9e0 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f   |= WHERE_ROWID_
1c9f0 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
1ca00 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 44  MN_RANGE|WHERE_D
1ca10 49 53 54 49 4e 43 54 3b 0a 20 20 20 20 7d 0a 0a  ISTINCT;.    }..
1ca20 20 20 20 20 2f 2a 20 49 66 20 63 75 72 72 65 6e      /* If curren
1ca30 74 6c 79 20 63 61 6c 63 75 6c 61 74 69 6e 67 20  tly calculating 
1ca40 74 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e  the cost of usin
1ca50 67 20 61 6e 20 69 6e 64 65 78 20 28 6e 6f 74 20  g an index (not 
1ca60 74 68 65 20 49 50 4b 0a 20 20 20 20 2a 2a 20 69  the IPK.    ** i
1ca70 6e 64 65 78 29 2c 20 64 65 74 65 72 6d 69 6e 65  ndex), determine
1ca80 20 69 66 20 61 6c 6c 20 72 65 71 75 69 72 65 64   if all required
1ca90 20 63 6f 6c 75 6d 6e 20 64 61 74 61 20 6d 61 79   column data may
1caa0 20 62 65 20 6f 62 74 61 69 6e 65 64 20 77 69 74   be obtained wit
1cab0 68 6f 75 74 20 0a 20 20 20 20 2a 2a 20 75 73 69  hout .    ** usi
1cac0 6e 67 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  ng the main tabl
1cad0 65 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 69  e (i.e. if the i
1cae0 6e 64 65 78 20 69 73 20 61 20 63 6f 76 65 72 69  ndex is a coveri
1caf0 6e 67 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20  ng.    ** index 
1cb00 66 6f 72 20 74 68 69 73 20 71 75 65 72 79 29 2e  for this query).
1cb10 20 49 66 20 69 74 20 69 73 2c 20 73 65 74 20 74   If it is, set t
1cb20 68 65 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  he WHERE_IDX_ONL
1cb30 59 20 66 6c 61 67 20 69 6e 0a 20 20 20 20 2a 2a  Y flag in.    **
1cb40 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
1cb50 69 73 65 2c 20 73 65 74 20 74 68 65 20 62 4c 6f  ise, set the bLo
1cb60 6f 6b 75 70 20 76 61 72 69 61 62 6c 65 20 74 6f  okup variable to
1cb70 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 20 20 69   true.  */.    i
1cb80 66 28 20 70 49 64 78 20 26 26 20 77 73 46 6c 61  f( pIdx && wsFla
1cb90 67 73 20 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  gs ){.      Bitm
1cba0 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f  ask m = pSrc->co
1cbb0 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69 6e 74  lUsed;.      int
1cbc0 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   j;.      for(j=
1cbd0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
1cbe0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
1cbf0 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
1cc00 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
1cc10 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31       if( x<BMS-1
1cc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20   ){.          m 
1cc30 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31  &= ~(((Bitmask)1
1cc40 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  )<<x);.        }
1cc50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1cc60 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( m==0 ){.     
1cc70 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
1cc80 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
1cc90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1cca0 20 20 20 62 4c 6f 6f 6b 75 70 20 3d 20 31 3b 0a     bLookup = 1;.
1ccb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1ccc0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 45 73 74     /*.    ** Est
1ccd0 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72  imate the number
1cce0 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74 70   of rows of outp
1ccf0 75 74 2e 20 20 46 6f 72 20 61 6e 20 22 78 20 49  ut.  For an "x I
1cd00 4e 20 28 53 45 4c 45 43 54 2e 2e 2e 29 22 0a 20  N (SELECT...)". 
1cd10 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
1cd20 2c 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  , do not let the
1cd30 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
1cd40 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
1cd50 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
1cd60 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28   */.    nRow = (
1cd70 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74  double)(aiRowEst
1cd80 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  [nEq] * nInMul);
1cd90 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
1cda0 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45  && nRow*2>aiRowE
1cdb0 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e  st[0] ){.      n
1cdc0 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
1cdd0 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
1cde0 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f  l = (int)(nRow /
1cdf0 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b   aiRowEst[nEq]);
1ce00 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1ce10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
1ce20 54 32 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  T2.    /* If the
1ce30 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
1ce40 66 20 74 68 65 20 66 6f 72 6d 20 78 3d 56 41 4c  f the form x=VAL
1ce50 55 45 20 6f 72 20 78 20 49 4e 20 28 45 31 2c 45  UE or x IN (E1,E
1ce60 32 2c 2e 2e 2e 29 0a 20 20 20 20 2a 2a 20 61 6e  2,...).    ** an
1ce70 64 20 77 65 20 64 6f 20 6e 6f 74 20 74 68 69 6e  d we do not thin
1ce80 6b 20 74 68 61 74 20 76 61 6c 75 65 73 20 6f 66  k that values of
1ce90 20 78 20 61 72 65 20 75 6e 69 71 75 65 20 61 6e   x are unique an
1cea0 64 20 69 66 20 68 69 73 74 6f 67 72 61 6d 0a 20  d if histogram. 
1ceb0 20 20 20 2a 2a 20 64 61 74 61 20 69 73 20 61 76     ** data is av
1cec0 61 69 6c 61 62 6c 65 20 66 6f 72 20 63 6f 6c 75  ailable for colu
1ced0 6d 6e 20 78 2c 20 74 68 65 6e 20 69 74 20 6d 69  mn x, then it mi
1cee0 67 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 0a  ght be possible.
1cef0 20 20 20 20 2a 2a 20 74 6f 20 67 65 74 20 61 20      ** to get a 
1cf00 62 65 74 74 65 72 20 65 73 74 69 6d 61 74 65 20  better estimate 
1cf10 6f 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  on the number of
1cf20 20 72 6f 77 73 20 62 61 73 65 64 20 6f 6e 0a 20   rows based on. 
1cf30 20 20 20 2a 2a 20 56 41 4c 55 45 20 61 6e 64 20     ** VALUE and 
1cf40 68 6f 77 20 63 6f 6d 6d 6f 6e 20 74 68 61 74 20  how common that 
1cf50 76 61 6c 75 65 20 69 73 20 61 63 63 6f 72 64 69  value is accordi
1cf60 6e 67 20 74 6f 20 74 68 65 20 68 69 73 74 6f 67  ng to the histog
1cf70 72 61 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ram..    */.    
1cf80 69 66 28 20 6e 52 6f 77 3e 28 64 6f 75 62 6c 65  if( nRow>(double
1cf90 29 31 20 26 26 20 6e 45 71 3d 3d 31 20 26 26 20  )1 && nEq==1 && 
1cfa0 70 46 69 72 73 74 54 65 72 6d 21 3d 30 20 26 26  pFirstTerm!=0 &&
1cfb0 20 61 69 52 6f 77 45 73 74 5b 31 5d 3e 31 20 29   aiRowEst[1]>1 )
1cfc0 7b 0a 20 20 20 20 20 20 69 66 28 20 70 46 69 72  {.      if( pFir
1cfd0 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  stTerm->eOperato
1cfe0 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 49 53  r & (WO_EQ|WO_IS
1cff0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
1d000 20 74 65 73 74 63 61 73 65 28 20 70 46 69 72 73   testcase( pFirs
1d010 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  tTerm->eOperator
1d020 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20  ==WO_EQ );.     
1d030 20 20 20 74 65 73 74 63 61 73 65 28 20 70 46 69     testcase( pFi
1d040 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  rstTerm->eOperat
1d050 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b  or==WO_ISNULL );
1d060 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 45 71  .        whereEq
1d070 75 61 6c 53 63 61 6e 45 73 74 28 70 50 61 72 73  ualScanEst(pPars
1d080 65 2c 20 70 50 72 6f 62 65 2c 20 70 46 69 72 73  e, pProbe, pFirs
1d090 74 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  tTerm->pExpr->pR
1d0a0 69 67 68 74 2c 20 26 6e 52 6f 77 29 3b 0a 20 20  ight, &nRow);.  
1d0b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 46      }else if( pF
1d0c0 69 72 73 74 54 65 72 6d 2d 3e 65 4f 70 65 72 61  irstTerm->eOpera
1d0d0 74 6f 72 3d 3d 57 4f 5f 49 4e 20 26 26 20 62 49  tor==WO_IN && bI
1d0e0 6e 45 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nEst==0 ){.     
1d0f0 20 20 20 77 68 65 72 65 49 6e 53 63 61 6e 45 73     whereInScanEs
1d100 74 28 70 50 61 72 73 65 2c 20 70 50 72 6f 62 65  t(pParse, pProbe
1d110 2c 20 70 46 69 72 73 74 54 65 72 6d 2d 3e 70 45  , pFirstTerm->pE
1d120 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2c 20 26 6e  xpr->x.pList, &n
1d130 52 6f 77 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Row);.      }.  
1d140 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
1d150 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54  LITE_ENABLE_STAT
1d160 32 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 64 6a  2 */..    /* Adj
1d170 75 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ust the number o
1d180 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 61 6e  f output rows an
1d190 64 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72 65  d downward to re
1d1a0 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20 2a  flect rows.    *
1d1b0 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c 75  * that are exclu
1d1c0 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f 6e  ded by range con
1d1d0 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2f  straints..    */
1d1e0 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52 6f  .    nRow = (nRo
1d1f0 77 20 2a 20 28 64 6f 75 62 6c 65 29 65 73 74 42  w * (double)estB
1d200 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29  ound) / (double)
1d210 31 30 30 3b 0a 20 20 20 20 69 66 28 20 6e 52 6f  100;.    if( nRo
1d220 77 3c 31 20 29 20 6e 52 6f 77 20 3d 20 31 3b 0a  w<1 ) nRow = 1;.
1d230 0a 20 20 20 20 2f 2a 20 45 78 70 65 72 69 6d 65  .    /* Experime
1d240 6e 74 73 20 72 75 6e 20 6f 6e 20 72 65 61 6c 20  nts run on real 
1d250 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 73  SQLite databases
1d260 20 73 68 6f 77 20 74 68 61 74 20 74 68 65 20 74   show that the t
1d270 69 6d 65 20 6e 65 65 64 65 64 0a 20 20 20 20 2a  ime needed.    *
1d280 2a 20 74 6f 20 64 6f 20 61 20 62 69 6e 61 72 79  * to do a binary
1d290 20 73 65 61 72 63 68 20 74 6f 20 6c 6f 63 61 74   search to locat
1d2a0 65 20 61 20 72 6f 77 20 69 6e 20 61 20 74 61 62  e a row in a tab
1d2b0 6c 65 20 6f 72 20 69 6e 64 65 78 20 69 73 20 72  le or index is r
1d2c0 6f 75 67 68 6c 79 0a 20 20 20 20 2a 2a 20 6c 6f  oughly.    ** lo
1d2d0 67 31 30 28 4e 29 20 74 69 6d 65 73 20 74 68 65  g10(N) times the
1d2e0 20 74 69 6d 65 20 74 6f 20 6d 6f 76 65 20 66 72   time to move fr
1d2f0 6f 6d 20 6f 6e 65 20 72 6f 77 20 74 6f 20 74 68  om one row to th
1d300 65 20 6e 65 78 74 20 72 6f 77 20 77 69 74 68 69  e next row withi
1d310 6e 0a 20 20 20 20 2a 2a 20 61 20 74 61 62 6c 65  n.    ** a table
1d320 20 6f 72 20 69 6e 64 65 78 2e 20 20 54 68 65 20   or index.  The 
1d330 61 63 74 75 61 6c 20 74 69 6d 65 73 20 63 61 6e  actual times can
1d340 20 76 61 72 79 2c 20 77 69 74 68 20 74 68 65 20   vary, with the 
1d350 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a 2a 20 72  size of.    ** r
1d360 65 63 6f 72 64 73 20 62 65 69 6e 67 20 61 6e 20  ecords being an 
1d370 69 6d 70 6f 72 74 61 6e 74 20 66 61 63 74 6f 72  important factor
1d380 2e 20 20 42 6f 74 68 20 6d 6f 76 65 73 20 61 6e  .  Both moves an
1d390 64 20 73 65 61 72 63 68 65 73 20 61 72 65 0a 20  d searches are. 
1d3a0 20 20 20 2a 2a 20 73 6c 6f 77 65 72 20 77 69 74     ** slower wit
1d3b0 68 20 6c 61 72 67 65 72 20 72 65 63 6f 72 64 73  h larger records
1d3c0 2c 20 70 72 65 73 75 6d 61 62 6c 79 20 62 65 63  , presumably bec
1d3d0 61 75 73 65 20 66 65 77 65 72 20 72 65 63 6f 72  ause fewer recor
1d3e0 64 73 20 66 69 74 0a 20 20 20 20 2a 2a 20 6f 6e  ds fit.    ** on
1d3f0 20 6f 6e 65 20 70 61 67 65 20 61 6e 64 20 68 65   one page and he
1d400 6e 63 65 20 6d 6f 72 65 20 70 61 67 65 73 20 68  nce more pages h
1d410 61 76 65 20 74 6f 20 62 65 20 66 65 74 63 68 65  ave to be fetche
1d420 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1d430 20 54 68 65 20 41 4e 41 4c 59 5a 45 20 63 6f 6d   The ANALYZE com
1d440 6d 61 6e 64 20 61 6e 64 20 74 68 65 20 73 71 6c  mand and the sql
1d450 69 74 65 5f 73 74 61 74 31 20 61 6e 64 20 73 71  ite_stat1 and sq
1d460 6c 69 74 65 5f 73 74 61 74 32 20 74 61 62 6c 65  lite_stat2 table
1d470 73 20 64 6f 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  s do.    ** not 
1d480 67 69 76 65 20 75 73 20 64 61 74 61 20 6f 6e 20  give us data on 
1d490 74 68 65 20 72 65 6c 61 74 69 76 65 20 73 69 7a  the relative siz
1d4a0 65 73 20 6f 66 20 74 61 62 6c 65 20 61 6e 64 20  es of table and 
1d4b0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 0a 20  index records.. 
1d4c0 20 20 20 2a 2a 20 53 6f 20 74 68 69 73 20 63 6f     ** So this co
1d4d0 6d 70 75 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mputation assume
1d4e0 73 20 74 61 62 6c 65 20 72 65 63 6f 72 64 73 20  s table records 
1d4f0 61 72 65 20 61 62 6f 75 74 20 74 77 69 63 65 20  are about twice 
1d500 61 73 20 62 69 67 0a 20 20 20 20 2a 2a 20 61 73  as big.    ** as
1d510 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 20   index records. 
1d520 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1d530 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
1d540 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
1d550 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
1d560 63 6f 73 74 20 6f 66 20 61 20 66 75 6c 6c 20 74  cost of a full t
1d570 61 62 6c 65 20 73 63 61 6e 20 69 73 20 61 20 6e  able scan is a n
1d580 75 6d 62 65 72 20 6f 66 20 6d 6f 76 65 20 6f 70  umber of move op
1d590 65 72 61 74 69 6f 6e 73 20 65 71 75 61 6c 0a 20  erations equal. 
1d5a0 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6e       ** to the n
1d5b0 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
1d5c0 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
1d5d0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 57 65    **.      ** We
1d5e0 20 61 64 64 20 61 6e 20 61 64 64 69 74 69 6f 6e   add an addition
1d5f0 61 6c 20 34 78 20 70 65 6e 61 6c 74 79 20 74 6f  al 4x penalty to
1d600 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e   full table scan
1d610 73 2e 20 20 54 68 69 73 20 63 61 75 73 65 73 0a  s.  This causes.
1d620 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 73        ** the cos
1d630 74 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 65 72  t function to er
1d640 72 20 6f 6e 20 74 68 65 20 73 69 64 65 20 6f 66  r on the side of
1d650 20 63 68 6f 6f 73 69 6e 67 20 61 6e 20 69 6e 64   choosing an ind
1d660 65 78 20 6f 76 65 72 0a 20 20 20 20 20 20 2a 2a  ex over.      **
1d670 20 63 68 6f 6f 73 69 6e 67 20 61 20 66 75 6c 6c   choosing a full
1d680 20 73 63 61 6e 2e 20 20 54 68 69 73 20 34 78 20   scan.  This 4x 
1d690 66 75 6c 6c 2d 73 63 61 6e 20 70 65 6e 61 6c 74  full-scan penalt
1d6a0 79 20 69 73 20 61 6e 20 61 72 67 75 61 62 6c 65  y is an arguable
1d6b0 0a 20 20 20 20 20 20 2a 2a 20 64 65 63 69 73 69  .      ** decisi
1d6c0 6f 6e 20 61 6e 64 20 6f 6e 65 20 77 68 69 63 68  on and one which
1d6d0 20 77 65 20 65 78 70 65 63 74 20 74 6f 20 72 65   we expect to re
1d6e0 76 69 73 69 74 20 69 6e 20 74 68 65 20 66 75 74  visit in the fut
1d6f0 75 72 65 2e 20 20 42 75 74 0a 20 20 20 20 20 20  ure.  But.      
1d700 2a 2a 20 69 74 20 73 65 65 6d 73 20 74 6f 20 62  ** it seems to b
1d710 65 20 77 6f 72 6b 69 6e 67 20 77 65 6c 6c 20 65  e working well e
1d720 6e 6f 75 67 68 20 61 74 20 74 68 65 20 6d 6f 6d  nough at the mom
1d730 65 6e 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ent..      */.  
1d740 20 20 20 20 63 6f 73 74 20 3d 20 61 69 52 6f 77      cost = aiRow
1d750 45 73 74 5b 30 5d 2a 34 3b 0a 20 20 20 20 7d 65  Est[0]*4;.    }e
1d760 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 67 31 30  lse{.      log10
1d770 4e 20 3d 20 65 73 74 4c 6f 67 28 61 69 52 6f 77  N = estLog(aiRow
1d780 45 73 74 5b 30 5d 29 3b 0a 20 20 20 20 20 20 63  Est[0]);.      c
1d790 6f 73 74 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20  ost = nRow;.    
1d7a0 20 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20    if( pIdx ){.  
1d7b0 20 20 20 20 20 20 69 66 28 20 62 4c 6f 6f 6b 75        if( bLooku
1d7c0 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  p ){.          /
1d7d0 2a 20 46 6f 72 20 61 6e 20 69 6e 64 65 78 20 6c  * For an index l
1d7e0 6f 6f 6b 75 70 20 66 6f 6c 6c 6f 77 65 64 20 62  ookup followed b
1d7f0 79 20 61 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  y a table lookup
1d800 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1d810 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20 73    nInMul index s
1d820 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20  earches to find 
1d830 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1d840 68 20 69 6e 64 65 78 20 72 61 6e 67 65 0a 20 20  h index range.  
1d850 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1d860 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1d870 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20   the index.     
1d880 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52 6f 77 20       **  + nRow 
1d890 74 61 62 6c 65 20 73 65 61 72 63 68 65 73 20 74  table searches t
1d8a0 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 74 61 62  o lookup the tab
1d8b0 6c 65 20 65 6e 74 72 79 20 75 73 69 6e 67 20 74  le entry using t
1d8c0 68 65 20 72 6f 77 69 64 0a 20 20 20 20 20 20 20  he rowid.       
1d8d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1d8e0 63 6f 73 74 20 2b 3d 20 28 6e 49 6e 4d 75 6c 20  cost += (nInMul 
1d8f0 2b 20 6e 52 6f 77 29 2a 6c 6f 67 31 30 4e 3b 0a  + nRow)*log10N;.
1d900 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1d910 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
1d920 61 20 63 6f 76 65 72 69 6e 67 20 69 6e 64 65 78  a covering index
1d930 3a 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 20  :.          **  
1d940 20 20 20 6e 49 6e 4d 75 6c 20 69 6e 64 65 78 20     nInMul index 
1d950 73 65 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64  searches to find
1d960 20 74 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74   the initial ent
1d970 72 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ry .          **
1d980 20 20 20 2b 20 6e 52 6f 77 20 73 74 65 70 73 20     + nRow steps 
1d990 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e 64 65  through the inde
1d9a0 78 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  x.          */. 
1d9b0 20 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d           cost +=
1d9c0 20 6e 49 6e 4d 75 6c 2a 6c 6f 67 31 30 4e 3b 0a   nInMul*log10N;.
1d9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1d9f0 2a 20 46 6f 72 20 61 20 72 6f 77 69 64 20 70 72  * For a rowid pr
1da00 69 6d 61 72 79 20 6b 65 79 20 6c 6f 6f 6b 75 70  imary key lookup
1da10 3a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20  :.        **    
1da20 6e 49 6e 4d 75 6c 74 20 74 61 62 6c 65 20 73 65  nInMult table se
1da30 61 72 63 68 65 73 20 74 6f 20 66 69 6e 64 20 74  arches to find t
1da40 68 65 20 69 6e 69 74 69 61 6c 20 65 6e 74 72 79  he initial entry
1da50 20 66 6f 72 20 65 61 63 68 20 72 61 6e 67 65 0a   for each range.
1da60 20 20 20 20 20 20 20 20 2a 2a 20 20 2b 20 6e 52          **  + nR
1da70 6f 77 20 73 74 65 70 73 20 74 68 72 6f 75 67 68  ow steps through
1da80 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
1da90 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f     */.        co
1daa0 73 74 20 2b 3d 20 6e 49 6e 4d 75 6c 2a 6c 6f 67  st += nInMul*log
1dab0 31 30 4e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  10N;.      }.   
1dac0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 69   }..    /* Add i
1dad0 6e 20 74 68 65 20 65 73 74 69 6d 61 74 65 64 20  n the estimated 
1dae0 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
1daf0 74 68 65 20 72 65 73 75 6c 74 2e 20 20 41 63 74  the result.  Act
1db00 75 61 6c 20 65 78 70 65 72 69 6d 65 6e 74 61 6c  ual experimental
1db10 0a 20 20 20 20 2a 2a 20 6d 65 61 73 75 72 65 6d  .    ** measurem
1db20 65 6e 74 73 20 6f 66 20 73 6f 72 74 69 6e 67 20  ents of sorting 
1db30 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 20 53  performance in S
1db40 51 4c 69 74 65 20 73 68 6f 77 20 74 68 61 74 20  QLite show that 
1db50 73 6f 72 74 69 6e 67 20 74 69 6d 65 0a 20 20 20  sorting time.   
1db60 20 2a 2a 20 61 64 64 73 20 43 2a 4e 2a 6c 6f 67   ** adds C*N*log
1db70 31 30 28 4e 29 20 74 6f 20 74 68 65 20 63 6f 73  10(N) to the cos
1db80 74 2c 20 77 68 65 72 65 20 4e 20 69 73 20 74 68  t, where N is th
1db90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
1dba0 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1dbb0 6f 72 74 65 64 20 61 6e 64 20 43 20 69 73 20 61  orted and C is a
1dbc0 20 66 61 63 74 6f 72 20 62 65 74 77 65 65 6e 20   factor between 
1dbd0 31 2e 39 35 20 61 6e 64 20 34 2e 33 2e 20 20 57  1.95 and 4.3.  W
1dbe0 65 20 77 69 6c 6c 20 73 70 6c 69 74 20 74 68 65  e will split the
1dbf0 0a 20 20 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  .    ** differen
1dc00 63 65 20 61 6e 64 20 73 65 6c 65 63 74 20 43 20  ce and select C 
1dc10 6f 66 20 33 2e 30 2e 0a 20 20 20 20 2a 2f 0a 20  of 3.0..    */. 
1dc20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a     if( bSort ){.
1dc30 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 6e 52        cost += nR
1dc40 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 2a  ow*estLog(nRow)*
1dc50 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  3;.    }.    if(
1dc60 20 62 44 69 73 74 20 29 7b 0a 20 20 20 20 20 20   bDist ){.      
1dc70 63 6f 73 74 20 2b 3d 20 6e 52 6f 77 2a 65 73 74  cost += nRow*est
1dc80 4c 6f 67 28 6e 52 6f 77 29 2a 33 3b 0a 20 20 20  Log(nRow)*3;.   
1dc90 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 43 6f   }..    /**** Co
1dca0 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68 69 73  st of using this
1dcb0 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77 20 62   index has now b
1dcc0 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a 2a 2a  een computed ***
1dcd0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  */..    /* If th
1dce0 65 72 65 20 61 72 65 20 61 64 64 69 74 69 6f 6e  ere are addition
1dcf0 61 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f  al constraints o
1dd00 6e 20 74 68 69 73 20 74 61 62 6c 65 20 74 68 61  n this table tha
1dd10 74 20 63 61 6e 6e 6f 74 0a 20 20 20 20 2a 2a 20  t cannot.    ** 
1dd20 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 65  be used with the
1dd30 20 63 75 72 72 65 6e 74 20 69 6e 64 65 78 2c 20   current index, 
1dd40 62 75 74 20 77 68 69 63 68 20 6d 69 67 68 74 20  but which might 
1dd50 6c 6f 77 65 72 20 74 68 65 20 6e 75 6d 62 65 72  lower the number
1dd60 0a 20 20 20 20 2a 2a 20 6f 66 20 6f 75 74 70 75  .    ** of outpu
1dd70 74 20 72 6f 77 73 2c 20 61 64 6a 75 73 74 20 74  t rows, adjust t
1dd80 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 61 63  he nRow value ac
1dd90 63 6f 72 64 69 6e 67 6c 79 2e 20 20 54 68 69 73  cordingly.  This
1dda0 20 6f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 6d 61   only .    ** ma
1ddb0 74 74 65 72 73 20 69 66 20 74 68 65 20 63 75 72  tters if the cur
1ddc0 72 65 6e 74 20 69 6e 64 65 78 20 69 73 20 74 68  rent index is th
1ddd0 65 20 6c 65 61 73 74 20 63 6f 73 74 6c 79 2c 20  e least costly, 
1dde0 73 6f 20 64 6f 20 6e 6f 74 20 62 6f 74 68 65 72  so do not bother
1ddf0 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 69  .    ** with thi
1de00 73 20 73 74 65 70 20 69 66 20 77 65 20 61 6c 72  s step if we alr
1de10 65 61 64 79 20 6b 6e 6f 77 20 74 68 69 73 20 69  eady know this i
1de20 6e 64 65 78 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ndex will not be
1de30 20 63 68 6f 73 65 6e 2e 0a 20 20 20 20 2a 2a 20   chosen..    ** 
1de40 41 6c 73 6f 2c 20 6e 65 76 65 72 20 72 65 64 75  Also, never redu
1de50 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 72 6f  ce the output ro
1de60 77 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 32 20  w count below 2 
1de70 75 73 69 6e 67 20 74 68 69 73 20 73 74 65 70 2e  using this step.
1de80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1de90 74 20 69 73 20 63 72 69 74 69 63 61 6c 20 74 68  t is critical th
1dea0 61 74 20 74 68 65 20 6e 6f 74 56 61 6c 69 64 20  at the notValid 
1deb0 6d 61 73 6b 20 62 65 20 75 73 65 64 20 68 65 72  mask be used her
1dec0 65 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 20  e instead of.   
1ded0 20 2a 2a 20 74 68 65 20 6e 6f 74 52 65 61 64 79   ** the notReady
1dee0 20 6d 61 73 6b 2e 20 20 57 68 65 6e 20 63 6f 6d   mask.  When com
1def0 70 75 74 69 6e 67 20 61 6e 20 22 6f 70 74 69 6d  puting an "optim
1df00 61 6c 22 20 69 6e 64 65 78 2c 20 74 68 65 20 6e  al" index, the n
1df10 6f 74 52 65 61 64 79 0a 20 20 20 20 2a 2a 20 6d  otReady.    ** m
1df20 61 73 6b 20 77 69 6c 6c 20 6f 6e 6c 79 20 68 61  ask will only ha
1df30 76 65 20 6f 6e 65 20 62 69 74 20 73 65 74 20 2d  ve one bit set -
1df40 20 74 68 65 20 62 69 74 20 66 6f 72 20 74 68 65   the bit for the
1df50 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 0a   current table..
1df60 20 20 20 20 2a 2a 20 54 68 65 20 6e 6f 74 56 61      ** The notVa
1df70 6c 69 64 20 6d 61 73 6b 2c 20 6f 6e 20 74 68 65  lid mask, on the
1df80 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 61 6c 77   other hand, alw
1df90 61 79 73 20 68 61 73 20 61 6c 6c 20 62 69 74 73  ays has all bits
1dfa0 20 73 65 74 20 66 6f 72 0a 20 20 20 20 2a 2a 20   set for.    ** 
1dfb0 74 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  tables that are 
1dfc0 6e 6f 74 20 69 6e 20 6f 75 74 65 72 20 6c 6f 6f  not in outer loo
1dfd0 70 73 2e 20 20 49 66 20 6e 6f 74 52 65 61 64 79  ps.  If notReady
1dfe0 20 69 73 20 75 73 65 64 20 68 65 72 65 20 69 6e   is used here in
1dff0 73 74 65 61 64 0a 20 20 20 20 2a 2a 20 6f 66 20  stead.    ** of 
1e000 6e 6f 74 56 61 6c 69 64 2c 20 74 68 65 6e 20 61  notValid, then a
1e010 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65 78 20 74   optimal index t
1e020 68 61 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  hat depends on i
1e030 6e 6e 65 72 20 6a 6f 69 6e 73 20 6c 6f 6f 70 73  nner joins loops
1e040 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
1e050 20 73 65 6c 65 63 74 65 64 20 65 76 65 6e 20 77   selected even w
1e060 68 65 6e 20 74 68 65 72 65 20 65 78 69 73 74 73  hen there exists
1e070 20 61 6e 20 6f 70 74 69 6d 61 6c 20 69 6e 64 65   an optimal inde
1e080 78 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 2a  x that has.    *
1e090 2a 20 6e 6f 20 73 75 63 68 20 64 65 70 65 6e 64  * no such depend
1e0a0 65 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ency..    */.   
1e0b0 20 69 66 28 20 6e 52 6f 77 3e 32 20 26 26 20 63   if( nRow>2 && c
1e0c0 6f 73 74 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73  ost<=pCost->rCos
1e0d0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  t ){.      int k
1e0e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e0f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1e100 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1e110 20 69 6e 74 20 6e 53 6b 69 70 45 71 20 3d 20 6e   int nSkipEq = n
1e120 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Eq;           /*
1e130 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 63 6f   Number of == co
1e140 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 73 6b 69  nstraints to ski
1e150 70 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  p */.      int n
1e160 53 6b 69 70 52 61 6e 67 65 20 3d 20 6e 42 6f 75  SkipRange = nBou
1e170 6e 64 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  nd;     /* Numbe
1e180 72 20 6f 66 20 3c 20 63 6f 6e 73 74 72 61 69 6e  r of < constrain
1e190 74 73 20 74 6f 20 73 6b 69 70 20 2a 2f 0a 20 20  ts to skip */.  
1e1a0 20 20 20 20 42 69 74 6d 61 73 6b 20 74 68 69 73      Bitmask this
1e1b0 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tab;            
1e1c0 20 2f 2a 20 42 69 74 6d 61 70 20 66 6f 72 20 70   /* Bitmap for p
1e1d0 53 72 63 20 2a 2f 0a 0a 20 20 20 20 20 20 74 68  Src */..      th
1e1e0 69 73 54 61 62 20 3d 20 67 65 74 4d 61 73 6b 28  isTab = getMask(
1e1f0 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69  pWC->pMaskSet, i
1e200 43 75 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Cur);.      for(
1e210 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d  pTerm=pWC->a, k=
1e220 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6e 52 6f 77  pWC->nTerm; nRow
1e230 3e 32 20 26 26 20 6b 3b 20 6b 2d 2d 2c 20 70 54  >2 && k; k--, pT
1e240 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
1e250 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  if( pTerm->wtFla
1e260 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
1e270 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  L ) continue;.  
1e280 20 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d        if( (pTerm
1e290 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f  ->prereqAll & no
1e2a0 74 56 61 6c 69 64 29 21 3d 74 68 69 73 54 61 62  tValid)!=thisTab
1e2b0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e2c0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
1e2d0 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
1e2e0 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
1e2f0 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LL) ){.         
1e300 20 69 66 28 20 6e 53 6b 69 70 45 71 20 29 7b 0a   if( nSkipEq ){.
1e310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e320 67 6e 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  gnore the first 
1e330 6e 45 71 20 65 71 75 61 6c 69 74 79 20 6d 61 74  nEq equality mat
1e340 63 68 65 73 20 73 69 6e 63 65 20 74 68 65 20 69  ches since the i
1e350 6e 64 65 78 0a 20 20 20 20 20 20 20 20 20 20 20  ndex.           
1e360 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20   ** has already 
1e370 61 63 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68  accounted for th
1e380 65 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ese */.         
1e390 20 20 20 6e 53 6b 69 70 45 71 2d 2d 3b 0a 20 20     nSkipEq--;.  
1e3a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1e3b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
1e3c0 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74 69  sume each additi
1e3d0 6f 6e 61 6c 20 65 71 75 61 6c 69 74 79 20 6d 61  onal equality ma
1e3e0 74 63 68 20 72 65 64 75 63 65 73 20 74 68 65 20  tch reduces the 
1e3f0 72 65 73 75 6c 74 0a 20 20 20 20 20 20 20 20 20  result.         
1e400 20 20 20 2a 2a 20 73 65 74 20 73 69 7a 65 20 62     ** set size b
1e410 79 20 61 20 66 61 63 74 6f 72 20 6f 66 20 31 30  y a factor of 10
1e420 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e430 6e 52 6f 77 20 2f 3d 20 31 30 3b 0a 20 20 20 20  nRow /= 10;.    
1e440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e450 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72 6d 2d  }else if( pTerm-
1e460 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
1e470 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
1e480 57 4f 5f 47 45 29 20 29 7b 0a 20 20 20 20 20 20  WO_GE) ){.      
1e490 20 20 20 20 69 66 28 20 6e 53 6b 69 70 52 61 6e      if( nSkipRan
1e4a0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1e4b0 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
1e4c0 66 69 72 73 74 20 6e 53 6b 69 70 52 61 6e 67 65  first nSkipRange
1e4d0 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
1e4e0 74 73 20 73 69 6e 63 65 20 74 68 65 20 69 6e 64  ts since the ind
1e4f0 65 78 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ex.            *
1e500 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 61 63  * has already ac
1e510 63 6f 75 6e 74 65 64 20 66 6f 72 20 74 68 65 73  counted for thes
1e520 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1e530 20 6e 53 6b 69 70 52 61 6e 67 65 2d 2d 3b 0a 20   nSkipRange--;. 
1e540 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1e560 73 73 75 6d 65 20 65 61 63 68 20 61 64 64 69 74  ssume each addit
1e570 69 6f 6e 61 6c 20 72 61 6e 67 65 20 63 6f 6e 73  ional range cons
1e580 74 72 61 69 6e 74 20 72 65 64 75 63 65 73 20 74  traint reduces t
1e590 68 65 20 72 65 73 75 6c 74 0a 20 20 20 20 20 20  he result.      
1e5a0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 73 69 7a        ** set siz
1e5b0 65 20 62 79 20 61 20 66 61 63 74 6f 72 20 6f 66  e by a factor of
1e5c0 20 33 2e 20 20 49 6e 64 65 78 65 64 20 72 61 6e   3.  Indexed ran
1e5d0 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  ge constraints r
1e5e0 65 64 75 63 65 0a 20 20 20 20 20 20 20 20 20 20  educe.          
1e5f0 20 20 2a 2a 20 74 68 65 20 73 65 61 72 63 68 20    ** the search 
1e600 73 70 61 63 65 20 62 79 20 61 20 6c 61 72 67 65  space by a large
1e610 72 20 66 61 63 74 6f 72 3a 20 34 2e 20 20 57 65  r factor: 4.  We
1e620 20 6d 61 6b 65 20 69 6e 64 65 78 65 64 20 72 61   make indexed ra
1e630 6e 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  nge.            
1e640 2a 2a 20 6d 6f 72 65 20 73 65 6c 65 63 74 69 76  ** more selectiv
1e650 65 20 69 6e 74 65 6e 74 69 6f 6e 61 6c 6c 79 20  e intentionally 
1e660 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 73  because of the s
1e670 75 62 6a 65 63 74 69 76 65 20 0a 20 20 20 20 20  ubjective .     
1e680 20 20 20 20 20 20 20 2a 2a 20 6f 62 73 65 72 76         ** observ
1e690 61 74 69 6f 6e 20 74 68 61 74 20 69 6e 64 65 78  ation that index
1e6a0 65 64 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  ed range constra
1e6b0 69 6e 74 73 20 72 65 61 6c 6c 79 20 61 72 65 20  ints really are 
1e6c0 6d 6f 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  more.           
1e6d0 20 2a 2a 20 73 65 6c 65 63 74 69 76 65 20 69 6e   ** selective in
1e6e0 20 70 72 61 63 74 69 63 65 2c 20 6f 6e 20 61 76   practice, on av
1e6f0 65 72 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20  erage. */.      
1e700 20 20 20 20 20 20 6e 52 6f 77 20 2f 3d 20 33 3b        nRow /= 3;
1e710 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e720 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
1e730 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 21  Term->eOperator!
1e740 3d 57 4f 5f 4e 4f 4f 50 20 29 7b 0a 20 20 20 20  =WO_NOOP ){.    
1e750 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
1e760 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  er expression lo
1e770 77 65 72 73 20 74 68 65 20 6f 75 74 70 75 74 20  wers the output 
1e780 72 6f 77 20 63 6f 75 6e 74 20 62 79 20 68 61 6c  row count by hal
1e790 66 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  f */.          n
1e7a0 52 6f 77 20 2f 3d 20 32 3b 0a 20 20 20 20 20 20  Row /= 2;.      
1e7b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1e7c0 20 20 69 66 28 20 6e 52 6f 77 3c 32 20 29 20 6e    if( nRow<2 ) n
1e7d0 52 6f 77 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 0a  Row = 2;.    }..
1e7e0 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
1e7f0 28 0a 20 20 20 20 20 20 22 25 73 28 25 73 29 3a  (.      "%s(%s):
1e800 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75 6c 3d 25   nEq=%d nInMul=%
1e810 64 20 65 73 74 42 6f 75 6e 64 3d 25 64 20 62 53  d estBound=%d bS
1e820 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d 25  ort=%d bLookup=%
1e830 64 20 77 73 46 6c 61 67 73 3d 30 78 25 78 5c 6e  d wsFlags=0x%x\n
1e840 22 0a 20 20 20 20 20 20 22 20 20 20 20 20 20 20  ".      "       
1e850 20 20 6e 6f 74 52 65 61 64 79 3d 30 78 25 6c 6c    notReady=0x%ll
1e860 78 20 6c 6f 67 31 30 4e 3d 25 2e 31 66 20 6e 52  x log10N=%.1f nR
1e870 6f 77 3d 25 2e 31 66 20 63 6f 73 74 3d 25 2e 31  ow=%.1f cost=%.1
1e880 66 20 75 73 65 64 3d 30 78 25 6c 6c 78 5c 6e 22  f used=0x%llx\n"
1e890 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70 54  ,.      pSrc->pT
1e8a0 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64 78  ab->zName, (pIdx
1e8b0 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 3a   ? pIdx->zName :
1e8c0 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20 20   "ipk"), .      
1e8d0 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 65 73 74  nEq, nInMul, est
1e8e0 42 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c  Bound, bSort, bL
1e8f0 6f 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 0a  ookup, wsFlags,.
1e900 20 20 20 20 20 20 6e 6f 74 52 65 61 64 79 2c 20        notReady, 
1e910 6c 6f 67 31 30 4e 2c 20 6e 52 6f 77 2c 20 63 6f  log10N, nRow, co
1e920 73 74 2c 20 75 73 65 64 0a 20 20 20 20 29 29 3b  st, used.    ));
1e930 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1e940 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62 65   index is the be
1e950 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e 20  st we have seen 
1e960 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65 63  so far, then rec
1e970 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ord this.    ** 
1e980 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63 6f  index and its co
1e990 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74 20  st in the pCost 
1e9a0 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
1e9b0 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64 78  /.    if( (!pIdx
1e9c0 20 7c 7c 20 77 73 46 6c 61 67 73 29 0a 20 20 20   || wsFlags).   
1e9d0 20 20 26 26 20 28 63 6f 73 74 3c 70 43 6f 73 74    && (cost<pCost
1e9e0 2d 3e 72 43 6f 73 74 20 7c 7c 20 28 63 6f 73 74  ->rCost || (cost
1e9f0 3c 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 26  <=pCost->rCost &
1ea00 26 20 6e 52 6f 77 3c 70 43 6f 73 74 2d 3e 70 6c  & nRow<pCost->pl
1ea10 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 29 7b  an.nRow)).    ){
1ea20 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 72 43  .      pCost->rC
1ea30 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
1ea40 20 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20    pCost->used = 
1ea50 75 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73  used;.      pCos
1ea60 74 2d 3e 70 6c 61 6e 2e 6e 52 6f 77 20 3d 20 6e  t->plan.nRow = n
1ea70 52 6f 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  Row;.      pCost
1ea80 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
1ea90 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67   (wsFlags&wsFlag
1eaa0 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f  Mask);.      pCo
1eab0 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  st->plan.nEq = n
1eac0 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  Eq;.      pCost-
1ead0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
1eae0 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Idx;.    }..    
1eaf0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
1eb00 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
1eb10 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
1eb20 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
1eb30 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
1eb40 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
1eb50 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
1eb60 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  reak;..    /* Re
1eb70 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68  set masks for th
1eb80 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20  e next index in 
1eb90 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
1eba0 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
1ebb0 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
1ebc0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
1ebd0 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
1ebe0 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
1ebf0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
1ec00 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
1ec10 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
1ec20 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73  he SQLITE_Revers
1ec30 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a  eOrder flag.  **
1ec40 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65   is set, then re
1ec50 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
1ec60 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 77  that the index w
1ec70 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20  ill be scanned. 
1ec80 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20   ** in. This is 
1ec90 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61  used for applica
1eca0 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f  tion testing, to
1ecb0 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73   help find cases
1ecc0 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c  .  ** where appl
1ecd0 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75  ication behaviou
1ece0 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
1ecf0 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64   (undefined) ord
1ed00 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c  er that.  ** SQL
1ed10 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73  ite outputs rows
1ed20 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e   in in the absen
1ed30 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42  ce of an ORDER B
1ed40 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20  Y clause.  */.  
1ed50 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26 26  if( !pOrderBy &&
1ed60 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
1ed70 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
1ed80 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  rseOrder ){.    
1ed90 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
1eda0 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
1edb0 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ERSE;.  }..  ass
1edc0 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c  ert( pOrderBy ||
1edd0 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
1ede0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1edf0 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  RBY)==0 );.  ass
1ee00 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ert( pCost->plan
1ee10 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70  .u.pIdx==0 || (p
1ee20 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1ee30 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
1ee40 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
1ee50 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
1ee60 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  =0 .       || pC
1ee70 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
1ee80 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
1ee90 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
1eea0 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
1eeb0 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
1eec0 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
1eed0 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20   is: %s\n", .   
1eee0 20 28 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77   ((pCost->plan.w
1eef0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4e  sFlags & WHERE_N
1ef00 4f 54 5f 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 20  OT_FULLSCAN)==0 
1ef10 3f 20 22 6e 6f 6e 65 22 20 3a 20 0a 20 20 20 20  ? "none" : .    
1ef20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
1ef30 2e 75 2e 70 49 64 78 20 3f 20 70 43 6f 73 74 2d  .u.pIdx ? pCost-
1ef40 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e  >plan.u.pIdx->zN
1ef50 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20 20 29  ame : "ipk").  )
1ef60 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72 43 6c  );.  .  bestOrCl
1ef70 61 75 73 65 49 6e 64 65 78 28 70 50 61 72 73 65  auseIndex(pParse
1ef80 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1ef90 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
1efa0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
1efb0 29 3b 0a 20 20 62 65 73 74 41 75 74 6f 6d 61 74  );.  bestAutomat
1efc0 69 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  icIndex(pParse, 
1efd0 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65  pWC, pSrc, notRe
1efe0 61 64 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70  ady, pCost);.  p
1eff0 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
1f000 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b  gs |= eqTermMask
1f010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
1f020 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66  the query plan f
1f030 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61 62  or accessing tab
1f040 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57  le pSrc->pTab. W
1f050 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74  rite the.** best
1f060 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20   query plan and 
1f070 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68  its cost into th
1f080 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65  e WhereCost obje
1f090 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20  ct supplied .** 
1f0a0 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72 61  as the last para
1f0b0 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63  meter. This func
1f0c0 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61  tion may calcula
1f0d0 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a  te the cost of.*
1f0e0 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20  * both real and 
1f0f0 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63  virtual table sc
1f100 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ans..*/.static v
1f110 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20  oid bestIndex(. 
1f120 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f140 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74  The parsing cont
1f150 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ext */.  WhereCl
1f160 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20  ause *pWC,      
1f170 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
1f180 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
1f190 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
1f1a0 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65  m *pSrc,  /* The
1f1b0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
1f1c0 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
1f1d0 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
1f1e0 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  y,           /* 
1f1f0 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20  Mask of cursors 
1f200 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  not available fo
1f210 72 20 69 6e 64 65 78 69 6e 67 20 2a 2f 0a 20 20  r indexing */.  
1f220 42 69 74 6d 61 73 6b 20 6e 6f 74 56 61 6c 69 64  Bitmask notValid
1f230 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
1f240 75 72 73 6f 72 73 20 6e 6f 74 20 61 76 61 69 6c  ursors not avail
1f250 61 62 6c 65 20 66 6f 72 20 61 6e 79 20 70 75 72  able for any pur
1f260 70 6f 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  pose */.  ExprLi
1f270 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
1f280 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
1f290 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
1f2a0 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
1f2b0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
1f2c0 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
1f2d0 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69  ry plan */.){.#i
1f2e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1f2f0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
1f300 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
1f310 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  Src->pTab) ){.  
1f320 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
1f330 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20  info *p = 0;.   
1f340 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
1f350 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
1f360 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e  Src, notReady, n
1f370 6f 74 56 61 6c 69 64 2c 20 70 4f 72 64 65 72 42  otValid, pOrderB
1f380 79 2c 20 70 43 6f 73 74 2c 26 70 29 3b 0a 20 20  y, pCost,&p);.  
1f390 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54 6f 46    if( p->needToF
1f3a0 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
1f3b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1f3c0 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  p->idxStr);.    
1f3d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  }.    sqlite3DbF
1f3e0 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ree(pParse->db, 
1f3f0 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  p);.  }else.#end
1f400 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73 74 42  if.  {.    bestB
1f410 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65  treeIndex(pParse
1f420 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74  , pWC, pSrc, not
1f430 52 65 61 64 79 2c 20 6e 6f 74 56 61 6c 69 64 2c  Ready, notValid,
1f440 20 70 4f 72 64 65 72 42 79 2c 20 30 2c 20 70 43   pOrderBy, 0, pC
1f450 6f 73 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ost);.  }.}../*.
1f460 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74 65 72  ** Disable a ter
1f470 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  m in the WHERE c
1f480 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74 2c 20  lause.  Except, 
1f490 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65 20 74  do not disable t
1f4a0 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74  he term.** if it
1f4b0 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54   controls a LEFT
1f4c0 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20   OUTER JOIN and 
1f4d0 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69  it did not origi
1f4e0 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a  nate in the ON.*
1f4f0 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  * or USING claus
1f500 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a  e of that join..
1f510 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74  **.** Consider t
1f520 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b  he term t2.z='ok
1f530 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ' in the followi
1f540 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a  ng queries:.**.*
1f550 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43 54 20  *   (1)  SELECT 
1f560 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a  * FROM t1 LEFT J
1f570 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74  OIN t2 ON t1.a=t
1f580 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a 3d 27  2.x WHERE t2.z='
1f590 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20 53 45  ok'.**   (2)  SE
1f5a0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
1f5b0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
1f5c0 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e  1.a=t2.x AND t2.
1f5d0 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20  z='ok'.**   (3) 
1f5e0 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
1f5f0 31 2c 20 74 32 20 57 48 45 52 45 20 74 31 2e 61  1, t2 WHERE t1.a
1f600 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
1f610 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32  ok'.**.** The t2
1f620 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73 61 62  .z='ok' is disab
1f630 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20 28 32  led in the in (2
1f640 29 20 62 65 63 61 75 73 65 20 69 74 20 6f 72 69  ) because it ori
1f650 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68  ginates.** in th
1f660 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20 54 68  e ON clause.  Th
1f670 65 20 74 65 72 6d 20 69 73 20 64 69 73 61 62 6c  e term is disabl
1f680 65 64 20 69 6e 20 28 33 29 20 62 65 63 61 75 73  ed in (3) becaus
1f690 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74  e it is not part
1f6a0 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20 4f 55  .** of a LEFT OU
1f6b0 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31  TER JOIN.  In (1
1f6c0 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e  ), the term is n
1f6d0 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a  ot disabled..**.
1f6e0 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f  ** IMPLEMENTATIO
1f6f0 4e 2d 4f 46 3a 20 52 2d 32 34 35 39 37 2d 35 38  N-OF: R-24597-58
1f700 36 35 35 20 4e 6f 20 74 65 73 74 73 20 61 72 65  655 No tests are
1f710 20 64 6f 6e 65 20 66 6f 72 20 74 65 72 6d 73 20   done for terms 
1f720 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 6f 6d 70  that are.** comp
1f730 6c 65 74 65 6c 79 20 73 61 74 69 73 66 69 65 64  letely satisfied
1f740 20 62 79 20 69 6e 64 69 63 65 73 2e 0a 2a 2a 0a   by indices..**.
1f750 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61 20 74  ** Disabling a t
1f760 65 72 6d 20 63 61 75 73 65 73 20 74 68 61 74 20  erm causes that 
1f770 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74  term to not be t
1f780 65 73 74 65 64 20 69 6e 20 74 68 65 20 69 6e 6e  ested in the inn
1f790 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68  er loop.** of th
1f7a0 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69  e join.  Disabli
1f7b0 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  ng is an optimiz
1f7c0 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72  ation.  When ter
1f7d0 6d 73 20 61 72 65 20 73 61 74 69 73 66 69 65 64  ms are satisfied
1f7e0 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73 2c 20  .** by indices, 
1f7f0 77 65 20 64 69 73 61 62 6c 65 20 74 68 65 6d 20  we disable them 
1f800 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64 75 6e  to prevent redun
1f810 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20 74 68  dant tests in th
1f820 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e  e inner.** loop.
1f830 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74    We would get t
1f840 68 65 20 63 6f 72 72 65 63 74 20 72 65 73 75 6c  he correct resul
1f850 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65  ts if nothing we
1f860 72 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64  re ever disabled
1f870 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d  ,.** but joins m
1f880 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c  ight run a littl
1f890 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74  e slower.  The t
1f8a0 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62  rick is to disab
1f8b0 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73  le as much.** as
1f8c0 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20   we can without 
1f8d0 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75  disabling too mu
1f8e0 63 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62  ch.  If we disab
1f8f0 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64  led in (1), we'd
1f900 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e   get.** the wron
1f910 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65 20 74  g answer.  See t
1f920 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73  icket #813..*/.s
1f930 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62  tatic void disab
1f940 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65  leTerm(WhereLeve
1f950 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65 72 65  l *pLevel, Where
1f960 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20  Term *pTerm){.  
1f970 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20 20 20  if( pTerm.      
1f980 26 26 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61  && (pTerm->wtFla
1f990 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
1f9a0 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
1f9b0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
1f9c0 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
1f9d0 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
1f9e0 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
1f9f0 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
1fa00 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
1fa10 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
1fa20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
1fa30 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
1fa40 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
1fa50 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
1fa60 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
1fa70 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
1fa80 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
1fa90 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
1faa0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
1fab0 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
1fac0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
1fad0 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66  ** Code an OP_Af
1fae0 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20 74 6f  finity opcode to
1faf0 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d   apply the colum
1fb00 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e  n affinity strin
1fb10 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65  g zAff.** to the
1fb20 20 6e 20 72 65 67 69 73 74 65 72 73 20 73 74 61   n registers sta
1fb30 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e 20 0a  rting at base. .
1fb40 2a 2a 0a 2a 2a 20 41 73 20 61 6e 20 6f 70 74 69  **.** As an opti
1fb50 6d 69 7a 61 74 69 6f 6e 2c 20 53 51 4c 49 54 45  mization, SQLITE
1fb60 5f 41 46 46 5f 4e 4f 4e 45 20 65 6e 74 72 69 65  _AFF_NONE entrie
1fb70 73 20 28 77 68 69 63 68 20 61 72 65 20 6e 6f 2d  s (which are no-
1fb80 6f 70 73 29 20 61 74 20 74 68 65 0a 2a 2a 20 62  ops) at the.** b
1fb90 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64  eginning and end
1fba0 20 6f 66 20 7a 41 66 66 20 61 72 65 20 69 67 6e   of zAff are ign
1fbb0 6f 72 65 64 2e 20 20 49 66 20 61 6c 6c 20 65 6e  ored.  If all en
1fbc0 74 72 69 65 73 20 69 6e 20 7a 41 66 66 20 61 72  tries in zAff ar
1fbd0 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f  e.** SQLITE_AFF_
1fbe0 4e 4f 4e 45 2c 20 74 68 65 6e 20 6e 6f 20 63 6f  NONE, then no co
1fbf0 64 65 20 67 65 74 73 20 67 65 6e 65 72 61 74 65  de gets generate
1fc00 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1fc10 75 74 69 6e 65 20 6d 61 6b 65 73 20 69 74 73 20  utine makes its 
1fc20 6f 77 6e 20 63 6f 70 79 20 6f 66 20 7a 41 66 66  own copy of zAff
1fc30 20 73 6f 20 74 68 61 74 20 74 68 65 20 63 61 6c   so that the cal
1fc40 6c 65 72 20 69 73 20 66 72 65 65 0a 2a 2a 20 74  ler is free.** t
1fc50 6f 20 6d 6f 64 69 66 79 20 7a 41 66 66 20 61 66  o modify zAff af
1fc60 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
1fc70 20 72 65 74 75 72 6e 73 2e 0a 2a 2f 0a 73 74 61   returns..*/.sta
1fc80 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 70 70  tic void codeApp
1fc90 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72 73 65  lyAffinity(Parse
1fca0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 62 61   *pParse, int ba
1fcb0 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72 20  se, int n, char 
1fcc0 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65 20 2a  *zAff){.  Vdbe *
1fcd0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
1fce0 65 3b 0a 20 20 69 66 28 20 7a 41 66 66 3d 3d 30  e;.  if( zAff==0
1fcf0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1fd00 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
1fd10 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1fd20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
1fd30 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 0a 20  sert( v!=0 );.. 
1fd40 20 2f 2a 20 41 64 6a 75 73 74 20 62 61 73 65 20   /* Adjust base 
1fd50 61 6e 64 20 6e 20 74 6f 20 73 6b 69 70 20 6f 76  and n to skip ov
1fd60 65 72 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  er SQLITE_AFF_NO
1fd70 4e 45 20 65 6e 74 72 69 65 73 20 61 74 20 74 68  NE entries at th
1fd80 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 2a 2a  e beginning.  **
1fd90 20 61 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20   and end of the 
1fda0 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 2e  affinity string.
1fdb0 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 6e  .  */.  while( n
1fdc0 3e 30 20 26 26 20 7a 41 66 66 5b 30 5d 3d 3d 53  >0 && zAff[0]==S
1fdd0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20 29  QLITE_AFF_NONE )
1fde0 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 62  {.    n--;.    b
1fdf0 61 73 65 2b 2b 3b 0a 20 20 20 20 7a 41 66 66 2b  ase++;.    zAff+
1fe00 2b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  +;.  }.  while( 
1fe10 6e 3e 31 20 26 26 20 7a 41 66 66 5b 6e 2d 31 5d  n>1 && zAff[n-1]
1fe20 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
1fe30 45 20 29 7b 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20  E ){.    n--;.  
1fe40 7d 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  }..  /* Code the
1fe50 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63   OP_Affinity opc
1fe60 6f 64 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ode if there is 
1fe70 61 6e 79 74 68 69 6e 67 20 6c 65 66 74 20 74 6f  anything left to
1fe80 20 64 6f 2e 20 2a 2f 0a 20 20 69 66 28 20 6e 3e   do. */.  if( n>
1fe90 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1fea0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1feb0 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
1fec0 20 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   n);.    sqlite3
1fed0 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20  VdbeChangeP4(v, 
1fee0 2d 31 2c 20 7a 41 66 66 2c 20 6e 29 3b 0a 20 20  -1, zAff, n);.  
1fef0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ff00 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
1ff10 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
1ff20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1ff30 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
1ff40 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61  or a single equa
1ff50 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65  lity term of the
1ff60 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
1ff70 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74  An equality.** t
1ff80 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65  erm can be eithe
1ff90 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e  r X=expr or X IN
1ffa0 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20   (...).   pTerm 
1ffb0 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62  is the term to b
1ffc0 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a  e .** coded..**.
1ffd0 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  ** The current v
1ffe0 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e  alue for the con
1fff0 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20  straint is left 
20000 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
20010 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
20020 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
20030 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
20040 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
20050 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
20060 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
20070 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
20080 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
20090 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
200a0 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
200b0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
200c0 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
200d0 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
200e0 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
200f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
20100 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a  deEqualityTerm(.
20110 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
20120 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
20130 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
20140 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
20150 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72  rm,   /* The ter
20160 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
20170 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65  lause to be code
20180 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65  d */.  WhereLeve
20190 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68  l *pLevel, /* Wh
201a0 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  en level of the 
201b0 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61  FROM clause we a
201c0 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f  re working on */
201d0 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20 20  .  int iTarget  
201e0 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d 70         /* Attemp
201f0 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75 6c  t to leave resul
20200 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69 73  ts in this regis
20210 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72  ter */.){.  Expr
20220 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
20230 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  xpr;.  Vdbe *v =
20240 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
20250 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20 20    int iReg;     
20260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20270 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67  Register holding
20280 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20 61   results */..  a
20290 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e 30  ssert( iTarget>0
202a0 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70   );.  if( pX->op
202b0 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20 69  ==TK_EQ ){.    i
202c0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
202d0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
202e0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
202f0 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c 73  iTarget);.  }els
20300 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  e if( pX->op==TK
20310 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 69  _ISNULL ){.    i
20320 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a 20  Reg = iTarget;. 
20330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
20340 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c  dOp2(v, OP_Null,
20350 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e 64   0, iReg);.#ifnd
20360 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
20370 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
20380 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b 0a  .    int eType;.
20390 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20 20      int iTab;.  
203a0 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70 20    struct InLoop 
203b0 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65 72  *pIn;..    asser
203c0 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  t( pX->op==TK_IN
203d0 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20 69   );.    iReg = i
203e0 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79 70  Target;.    eTyp
203f0 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 49  e = sqlite3FindI
20400 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  nIndex(pParse, p
20410 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62 20  X, 0);.    iTab 
20420 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  = pX->iTable;.  
20430 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
20440 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  Op2(v, OP_Rewind
20450 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
20460 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d 3e  assert( pLevel->
20470 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
20480 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a  HERE_IN_ABLE );.
20490 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
204a0 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  u.in.nIn==0 ){. 
204b0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64       pLevel->add
204c0 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64  rNxt = sqlite3Vd
204d0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
204e0 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
204f0 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20  ->u.in.nIn++;.  
20500 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61    pLevel->u.in.a
20510 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20 20  InLoop =.       
20520 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
20530 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64  OrFree(pParse->d
20540 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  b, pLevel->u.in.
20550 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
20580 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
20590 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75  op[0])*pLevel->u
205a0 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70 49  .in.nIn);.    pI
205b0 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  n = pLevel->u.in
205c0 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66  .aInLoop;.    if
205d0 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20 70  ( pIn ){.      p
205e0 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e  In += pLevel->u.
205f0 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20 20  in.nIn - 1;.    
20600 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69 54    pIn->iCur = iT
20610 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54  ab;.      if( eT
20620 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f  ype==IN_INDEX_RO
20630 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  WID ){.        p
20640 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20  In->addrInTop = 
20650 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
20660 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
20670 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Tab, iReg);.    
20680 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20690 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20   pIn->addrInTop 
206a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  = sqlite3VdbeAdd
206b0 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  Op3(v, OP_Column
206c0 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67 29  , iTab, 0, iReg)
206d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
206e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
206f0 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  1(v, OP_IsNull, 
20700 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  iReg);.    }else
20710 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
20720 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20  u.in.nIn = 0;.  
20730 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
20740 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
20750 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 72  vel, pTerm);.  r
20760 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f  eturn iReg;.}../
20770 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
20780 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
20790 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
207a0 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
207b0 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
207c0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
207d0 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20 74 61 62  le, consider tab
207e0 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c  le t1(a,b,c,d,e,
207f0 66 29 20 77 69 74 68 20 69 6e 64 65 78 20 69 31  f) with index i1
20800 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70  (a,b,c)..** Supp
20810 6f 73 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ose the WHERE cl
20820 61 75 73 65 20 69 73 20 74 68 69 73 3a 20 20 61  ause is this:  a
20830 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20 28 31 2c  ==5 AND b IN (1,
20840 32 2c 33 29 20 41 4e 44 20 63 3e 35 20 41 4e 44  2,3) AND c>5 AND
20850 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64   c<10.** The ind
20860 65 78 20 68 61 73 20 61 73 20 6d 61 6e 79 20 61  ex has as many a
20870 73 20 74 68 72 65 65 20 65 71 75 61 6c 69 74 79  s three equality
20880 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 62 75   constraints, bu
20890 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61  t in this.** exa
208a0 6d 70 6c 65 2c 20 74 68 65 20 74 68 69 72 64 20  mple, the third 
208b0 22 63 22 20 76 61 6c 75 65 20 69 73 20 61 6e 20  "c" value is an 
208c0 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 53 6f 20  inequality.  So 
208d0 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e  only two .** con
208e0 73 74 72 61 69 6e 74 73 20 61 72 65 20 63 6f 64  straints are cod
208f0 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
20900 65 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  e will generate 
20910 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
20920 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20 62 20 49  .** a==5 and b I
20930 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54 68 65 20  N (1,2,3).  The 
20940 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
20950 6f 72 20 61 20 61 6e 64 20 62 20 77 69 6c 6c 20  or a and b will 
20960 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  be stored.** in 
20970 63 6f 6e 73 65 63 75 74 69 76 65 20 72 65 67 69  consecutive regi
20980 73 74 65 72 73 20 61 6e 64 20 74 68 65 20 69 6e  sters and the in
20990 64 65 78 20 6f 66 20 74 68 65 20 66 69 72 73 74  dex of the first
209a0 20 72 65 67 69 73 74 65 72 20 69 73 20 72 65 74   register is ret
209b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  urned..**.** In 
209c0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
209d0 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
209e0 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
209f0 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
20a00 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
20a10 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
20a20 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
20a30 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
20a40 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
20a50 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
20a60 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
20a70 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
20a80 6f 72 79 20 63 65 6c 6c 20 61 6e 64 0a 2a 2a 20  ory cell and.** 
20a90 63 6f 6d 70 75 74 65 20 74 68 65 20 61 66 66 69  compute the affi
20aa0 6e 69 74 79 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a  nity string..**.
20ab0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
20ac0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
20ad0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
20ae0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
20af0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
20b00 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
20b10 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
20b20 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
20b30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
20b40 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
20b50 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
20b60 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
20b70 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
20b80 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
20b90 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
20ba0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
20bb0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
20bc0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
20bd0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
20be0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
20bf0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
20c00 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
20c10 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
20c20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
20c30 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
20c40 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
20c50 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
20c60 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
20c70 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
20c80 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
20c90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
20ca0 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
20cb0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
20cc0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
20cd0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
20ce0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
20cf0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
20d00 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
20d10 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
20d20 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
20d30 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
20d40 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
20d50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
20d60 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
20d70 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
20d80 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
20d90 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
20da0 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
20db0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
20dc0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
20dd0 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
20de0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
20df0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
20e00 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
20e10 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
20e20 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
20e30 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
20e40 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
20e50 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
20e60 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
20e70 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
20e80 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
20e90 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
20ea0 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
20eb0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
20ec0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
20ed0 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
20ee0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
20ef0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
20f00 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
20f10 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
20f20 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
20f30 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
20f40 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
20f50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
20f60 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
20f70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
20f80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
20f90 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
20fa0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
20fb0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
20fc0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
20fd0 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
20fe0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
20ff0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
21000 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
21010 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
21020 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
21030 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
21040 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
21050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21060 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
21070 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
21080 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
21090 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
210a0 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
210b0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
210c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
210d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
210e0 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75  nEq;   /* The nu
210f0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
21100 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
21110 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
21120 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
21130 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
21140 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  m under construc
21150 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
21160 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
21170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
21180 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
21190 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
211a0 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
211b0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
211c0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
211d0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
211e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
211f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
21200 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
21210 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
21220 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
21230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21240 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
21250 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
21260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21270 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
21280 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
212b0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
212c0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
212d0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
212e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
212f0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
21300 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
21310 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
21320 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
21330 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
21340 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
21350 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
21360 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
21370 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
21380 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76  );.  pIdx = pLev
21390 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
213a0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
213b0 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
213c0 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
213d0 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
213e0 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
213f0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
21400 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
21410 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  eg = pLevel->pla
21420 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  n.nEq + nExtraRe
21430 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
21440 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
21450 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
21460 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
21470 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
21480 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
21490 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
214a0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
214b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
214c0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
214d0 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
214e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
214f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
21500 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
21510 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
21520 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
21530 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
21540 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
21550 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
21560 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
21570 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
21580 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  eady, pLevel->pl
21590 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78  an.wsFlags, pIdx
215a0 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
215b0 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65  (pTerm==0) ) bre
215c0 61 6b 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ak;.    /* The f
215d0 6f 6c 6c 6f 77 69 6e 67 20 74 72 75 65 20 66 6f  ollowing true fo
215e0 72 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 72  r indices with r
215f0 65 64 75 6e 64 61 6e 74 20 63 6f 6c 75 6d 6e 73  edundant columns
21600 2e 20 0a 20 20 20 20 2a 2a 20 45 78 3a 20 43 52  . .    ** Ex: CR
21610 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
21620 20 74 31 28 61 2c 62 2c 61 29 3b 20 53 45 4c 45   t1(a,b,a); SELE
21630 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
21640 52 45 20 61 3d 30 20 41 4e 44 20 62 3d 30 3b 20  RE a=0 AND b=0; 
21650 2a 2f 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  */.    testcase(
21660 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73   (pTerm->wtFlags
21670 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 21 3d   & TERM_CODED)!=
21680 30 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0 );.    testcas
21690 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  e( pTerm->wtFlag
216a0 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  s & TERM_VIRTUAL
216b0 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35   ); /* EV: R-305
216c0 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20  75-11662 */.    
216d0 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
216e0 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
216f0 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67  erm, pLevel, reg
21700 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
21710 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
21720 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
21730 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
21740 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
21750 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
21760 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
21770 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
21780 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21790 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
217a0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
217b0 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
217c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
217d0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
217e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
217f0 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
21800 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
21810 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
21820 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
21830 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
21840 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
21850 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
21860 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
21870 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70   pTerm->pExpr->p
21880 52 69 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c  Right;.      sql
21890 69 74 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75  ite3ExprCodeIsNu
218a0 6c 6c 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74  llJump(v, pRight
218b0 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
218c0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
218d0 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 29 7b       if( zAff ){
218e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
218f0 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
21900 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
21910 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  [j])==SQLITE_AFF
21920 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _NONE ){.       
21930 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
21940 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
21950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21960 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
21970 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
21980 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 41 66  ange(pRight, zAf
21990 66 5b 6a 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  f[j]) ){.       
219a0 20 20 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c     zAff[j] = SQL
219b0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
219c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
219d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41      }.  }.  *pzA
219e0 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65 74  ff = zAff;.  ret
219f0 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a 0a  urn regBase;.}..
21a00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21a10 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a  MIT_EXPLAIN./*.*
21a20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
21a30 73 20 61 20 68 65 6c 70 65 72 20 66 6f 72 20 65  s a helper for e
21a40 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
21a50 28 29 20 62 65 6c 6f 77 0a 2a 2a 0a 2a 2a 20 70  () below.**.** p
21a60 53 74 72 20 68 6f 6c 64 73 20 74 68 65 20 74 65  Str holds the te
21a70 78 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  xt of an express
21a80 69 6f 6e 20 74 68 61 74 20 77 65 20 61 72 65 20  ion that we are 
21a90 62 75 69 6c 64 69 6e 67 20 75 70 20 6f 6e 65 20  building up one 
21aa0 74 65 72 6d 0a 2a 2a 20 61 74 20 61 20 74 69 6d  term.** at a tim
21ab0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21ac0 20 61 64 64 73 20 61 20 6e 65 77 20 74 65 72 6d   adds a new term
21ad0 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
21ae0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
21af0 2a 20 54 65 72 6d 73 20 61 72 65 20 73 65 70 61  * Terms are sepa
21b00 72 61 74 65 64 20 62 79 20 41 4e 44 20 73 6f 20  rated by AND so 
21b10 61 64 64 20 74 68 65 20 22 41 4e 44 22 20 74 65  add the "AND" te
21b20 78 74 20 66 6f 72 20 73 65 63 6f 6e 64 20 61 6e  xt for second an
21b30 64 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  d subsequent.** 
21b40 74 65 72 6d 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  terms only..*/.s
21b50 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61  tatic void expla
21b60 69 6e 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  inAppendTerm(.  
21b70 53 74 72 41 63 63 75 6d 20 2a 70 53 74 72 2c 20  StrAccum *pStr, 
21b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21b90 68 65 20 74 65 78 74 20 65 78 70 72 65 73 73 69  he text expressi
21ba0 6f 6e 20 62 65 69 6e 67 20 62 75 69 6c 74 20 2a  on being built *
21bb0 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d 2c 20 20  /.  int iTerm,  
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 69 73  /* Index of this
21be0 20 74 65 72 6d 2e 20 20 46 69 72 73 74 20 69 73   term.  First is
21bf0 20 7a 65 72 6f 20 2a 2f 0a 20 20 63 6f 6e 73 74   zero */.  const
21c00 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 2c 20   char *zColumn, 
21c10 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21c20 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  f the column */.
21c30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
21c40 70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p             /*
21c50 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
21c60 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 66  rator */.){.  if
21c70 28 20 69 54 65 72 6d 20 29 20 73 71 6c 69 74 65  ( iTerm ) sqlite
21c80 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
21c90 70 53 74 72 2c 20 22 20 41 4e 44 20 22 2c 20 35  pStr, " AND ", 5
21ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41  );.  sqlite3StrA
21cb0 63 63 75 6d 41 70 70 65 6e 64 28 70 53 74 72 2c  ccumAppend(pStr,
21cc0 20 7a 43 6f 6c 75 6d 6e 2c 20 2d 31 29 3b 0a 20   zColumn, -1);. 
21cd0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
21ce0 41 70 70 65 6e 64 28 70 53 74 72 2c 20 7a 4f 70  Append(pStr, zOp
21cf0 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 53  , 1);.  sqlite3S
21d00 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 53  trAccumAppend(pS
21d10 74 72 2c 20 22 3f 22 2c 20 31 29 3b 0a 7d 0a 0a  tr, "?", 1);.}..
21d20 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
21d30 4c 65 76 65 6c 20 64 65 73 63 72 69 62 65 73 20  Level describes 
21d40 61 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 73  a strategy for s
21d50 63 61 6e 6e 69 6e 67 20 74 61 62 6c 65 20 70 54  canning table pT
21d60 61 62 2e 20 54 68 69 73 20 0a 2a 2a 20 66 75 6e  ab. This .** fun
21d70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
21d80 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72  pointer to a str
21d90 69 6e 67 20 62 75 66 66 65 72 20 63 6f 6e 74 61  ing buffer conta
21da0 69 6e 69 6e 67 20 61 20 64 65 73 63 72 69 70 74  ining a descript
21db0 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 73 75  ion.** of the su
21dc0 62 73 65 74 20 6f 66 20 74 61 62 6c 65 20 72 6f  bset of table ro
21dd0 77 73 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68  ws scanned by th
21de0 65 20 73 74 72 61 74 65 67 79 20 69 6e 20 74 68  e strategy in th
21df0 65 20 66 6f 72 6d 20 6f 66 20 61 6e 0a 2a 2a 20  e form of an.** 
21e00 53 51 4c 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  SQL expression. 
21e10 4f 72 2c 20 69 66 20 61 6c 6c 20 72 6f 77 73 20  Or, if all rows 
21e20 61 72 65 20 73 63 61 6e 6e 65 64 2c 20 4e 55 4c  are scanned, NUL
21e30 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
21e40 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
21e50 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 3a 0a  , if the query:.
21e60 2a 2a 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a  **.**   SELECT *
21e70 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61   FROM t1 WHERE a
21e80 3d 31 20 41 4e 44 20 62 3e 32 3b 0a 2a 2a 0a 2a  =1 AND b>2;.**.*
21e90 2a 20 69 73 20 72 75 6e 20 61 6e 64 20 74 68 65  * is run and the
21ea0 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20 6f  re is an index o
21eb0 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 6e 20 74  n (a, b), then t
21ec0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
21ed0 75 72 6e 73 20 61 0a 2a 2a 20 73 74 72 69 6e 67  urns a.** string
21ee0 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   similar to:.**.
21ef0 2a 2a 20 20 20 22 61 3d 3f 20 41 4e 44 20 62 3e  **   "a=? AND b>
21f00 3f 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  ?".**.** The ret
21f10 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 70 6f  urned pointer po
21f20 69 6e 74 73 20 74 6f 20 6d 65 6d 6f 72 79 20 6f  ints to memory o
21f30 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
21f40 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 0a  ite3DbMalloc()..
21f50 2a 2a 20 49 74 20 69 73 20 74 68 65 20 72 65 73  ** It is the res
21f60 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
21f70 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 66 72 65  he caller to fre
21f80 65 20 74 68 65 20 62 75 66 66 65 72 20 77 68 65  e the buffer whe
21f90 6e 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  n it is.** no lo
21fa0 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a 2a  nger required..*
21fb0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 65  /.static char *e
21fc0 78 70 6c 61 69 6e 49 6e 64 65 78 52 61 6e 67 65  xplainIndexRange
21fd0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
21fe0 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
21ff0 2c 20 54 61 62 6c 65 20 2a 70 54 61 62 29 7b 0a  , Table *pTab){.
22000 20 20 57 68 65 72 65 50 6c 61 6e 20 2a 70 50 6c    WherePlan *pPl
22010 61 6e 20 3d 20 26 70 4c 65 76 65 6c 2d 3e 70 6c  an = &pLevel->pl
22020 61 6e 3b 0a 20 20 49 6e 64 65 78 20 2a 70 49 6e  an;.  Index *pIn
22030 64 65 78 20 3d 20 70 50 6c 61 6e 2d 3e 75 2e 70  dex = pPlan->u.p
22040 49 64 78 3b 0a 20 20 69 6e 74 20 6e 45 71 20 3d  Idx;.  int nEq =
22050 20 70 50 6c 61 6e 2d 3e 6e 45 71 3b 0a 20 20 69   pPlan->nEq;.  i
22060 6e 74 20 69 2c 20 6a 3b 0a 20 20 43 6f 6c 75 6d  nt i, j;.  Colum
22070 6e 20 2a 61 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *aCol = pTab->
22080 61 43 6f 6c 3b 0a 20 20 69 6e 74 20 2a 61 69 43  aCol;.  int *aiC
22090 6f 6c 75 6d 6e 20 3d 20 70 49 6e 64 65 78 2d 3e  olumn = pIndex->
220a0 61 69 43 6f 6c 75 6d 6e 3b 0a 20 20 53 74 72 41  aiColumn;.  StrA
220b0 63 63 75 6d 20 74 78 74 3b 0a 0a 20 20 69 66 28  ccum txt;..  if(
220c0 20 6e 45 71 3d 3d 30 20 26 26 20 28 70 50 6c 61   nEq==0 && (pPla
220d0 6e 2d 3e 77 73 46 6c 61 67 73 20 26 20 28 57 48  n->wsFlags & (WH
220e0 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57 48  ERE_BTM_LIMIT|WH
220f0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29 3d  ERE_TOP_LIMIT))=
22100 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
22110 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
22120 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 74  3StrAccumInit(&t
22130 78 74 2c 20 30 2c 20 30 2c 20 53 51 4c 49 54 45  xt, 0, 0, SQLITE
22140 5f 4d 41 58 5f 4c 45 4e 47 54 48 29 3b 0a 20 20  _MAX_LENGTH);.  
22150 74 78 74 2e 64 62 20 3d 20 64 62 3b 0a 20 20 73  txt.db = db;.  s
22160 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
22170 70 65 6e 64 28 26 74 78 74 2c 20 22 20 28 22 2c  pend(&txt, " (",
22180 20 32 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   2);.  for(i=0; 
22190 69 3c 6e 45 71 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nEq; i++){.   
221a0 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
221b0 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c  rm(&txt, i, aCol
221c0 5b 61 69 43 6f 6c 75 6d 6e 5b 69 5d 5d 2e 7a 4e  [aiColumn[i]].zN
221d0 61 6d 65 2c 20 22 3d 22 29 3b 0a 20 20 7d 0a 0a  ame, "=");.  }..
221e0 20 20 6a 20 3d 20 69 3b 0a 20 20 69 66 28 20 70    j = i;.  if( p
221f0 50 6c 61 6e 2d 3e 77 73 46 6c 61 67 73 26 57 48  Plan->wsFlags&WH
22200 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b  ERE_BTM_LIMIT ){
22210 0a 20 20 20 20 65 78 70 6c 61 69 6e 41 70 70 65  .    explainAppe
22220 6e 64 54 65 72 6d 28 26 74 78 74 2c 20 69 2b 2b  ndTerm(&txt, i++
22230 2c 20 61 43 6f 6c 5b 61 69 43 6f 6c 75 6d 6e 5b  , aCol[aiColumn[
22240 6a 5d 5d 2e 7a 4e 61 6d 65 2c 20 22 3e 22 29 3b  j]].zName, ">");
22250 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 6c 61 6e  .  }.  if( pPlan
22260 2d 3e 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f  ->wsFlags&WHERE_
22270 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  TOP_LIMIT ){.   
22280 20 65 78 70 6c 61 69 6e 41 70 70 65 6e 64 54 65   explainAppendTe
22290 72 6d 28 26 74 78 74 2c 20 69 2c 20 61 43 6f 6c  rm(&txt, i, aCol
222a0 5b 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 5d 2e 7a 4e  [aiColumn[j]].zN
222b0 61 6d 65 2c 20 22 3c 22 29 3b 0a 20 20 7d 0a 20  ame, "<");.  }. 
222c0 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
222d0 41 70 70 65 6e 64 28 26 74 78 74 2c 20 22 29 22  Append(&txt, ")"
222e0 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 1);.  return s
222f0 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69  qlite3StrAccumFi
22300 6e 69 73 68 28 26 74 78 74 29 3b 0a 7d 0a 0a 2f  nish(&txt);.}../
22310 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
22320 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e  on is a no-op un
22330 6c 65 73 73 20 63 75 72 72 65 6e 74 6c 79 20 70  less currently p
22340 72 6f 63 65 73 73 69 6e 67 20 61 6e 20 45 58 50  rocessing an EXP
22350 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 0a  LAIN QUERY PLAN.
22360 2a 2a 20 63 6f 6d 6d 61 6e 64 2e 20 49 66 20 74  ** command. If t
22370 68 65 20 71 75 65 72 79 20 62 65 69 6e 67 20 63  he query being c
22380 6f 6d 70 69 6c 65 64 20 69 73 20 61 6e 20 45 58  ompiled is an EX
22390 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
223a0 2c 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 72 65  , a single.** re
223b0 63 6f 72 64 20 69 73 20 61 64 64 65 64 20 74 6f  cord is added to
223c0 20 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 64   the output to d
223d0 65 73 63 72 69 62 65 20 74 68 65 20 74 61 62 6c  escribe the tabl
223e0 65 20 73 63 61 6e 20 73 74 72 61 74 65 67 79 20  e scan strategy 
223f0 69 6e 20 0a 2a 2a 20 70 4c 65 76 65 6c 2e 0a 2a  in .** pLevel..*
22400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
22410 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a 20 20  plainOneScan(.  
22420 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
22430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22440 2f 2a 20 50 61 72 73 65 20 63 6f 6e 74 65 78 74  /* Parse context
22450 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
22460 54 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 20  TabList,        
22470 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6c        /* Table l
22480 69 73 74 20 74 68 69 73 20 6c 6f 6f 70 20 72 65  ist this loop re
22490 66 65 72 73 20 74 6f 20 2a 2f 0a 20 20 57 68 65  fers to */.  Whe
224a0 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c  reLevel *pLevel,
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
224c0 53 63 61 6e 20 74 6f 20 77 72 69 74 65 20 4f 50  Scan to write OP
224d0 5f 45 78 70 6c 61 69 6e 20 6f 70 63 6f 64 65 20  _Explain opcode 
224e0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  for */.  int iLe
224f0 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
22500 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
22510 65 20 66 6f 72 20 22 6c 65 76 65 6c 22 20 63 6f  e for "level" co
22520 6c 75 6d 6e 20 6f 66 20 6f 75 74 70 75 74 20 2a  lumn of output *
22530 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 2c 20 20  /.  int iFrom,  
22540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22550 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72      /* Value for
22560 20 22 66 72 6f 6d 22 20 63 6f 6c 75 6d 6e 20 6f   "from" column o
22570 66 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 75 31  f output */.  u1
22580 36 20 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20  6 wctrlFlags    
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
225a0 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   Flags passed to
225b0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
225c0 69 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  in() */.){.  if(
225d0 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
225e0 3d 3d 32 20 29 7b 0a 20 20 20 20 75 33 32 20 66  ==2 ){.    u32 f
225f0 6c 61 67 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  lags = pLevel->p
22600 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
22610 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
22620 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
22630 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
22640 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 56  l->iFrom];.    V
22650 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
22660 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
22670 56 4d 20 62 65 69 6e 67 20 63 6f 6e 73 74 72 75  VM being constru
22680 63 74 65 64 20 2a 2f 0a 20 20 20 20 73 71 6c 69  cted */.    sqli
22690 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
226a0 2d 3e 64 62 3b 20 20 20 20 20 2f 2a 20 44 61 74  ->db;     /* Dat
226b0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
226c0 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 20      char *zMsg; 
226d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
226e0 20 20 2f 2a 20 54 65 78 74 20 74 6f 20 61 64 64    /* Text to add
226f0 20 74 6f 20 45 51 50 20 6f 75 74 70 75 74 20 2a   to EQP output *
22700 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  /.    sqlite3_in
22710 74 36 34 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  t64 nRow;       
22720 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20      /* Expected 
22730 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 76  number of rows v
22740 69 73 69 74 65 64 20 62 79 20 73 63 61 6e 20 2a  isited by scan *
22750 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20  /.    int iId = 
22760 70 50 61 72 73 65 2d 3e 69 53 65 6c 65 63 74 49  pParse->iSelectI
22770 64 3b 20 20 2f 2a 20 53 65 6c 65 63 74 20 69 64  d;  /* Select id
22780 20 28 6c 65 66 74 2d 6d 6f 73 74 20 6f 75 74 70   (left-most outp
22790 75 74 20 63 6f 6c 75 6d 6e 29 20 2a 2f 0a 20 20  ut column) */.  
227a0 20 20 69 6e 74 20 69 73 53 65 61 72 63 68 3b 20    int isSearch; 
227b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227c0 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 53 45  /* True for a SE
227d0 41 52 43 48 2e 20 46 61 6c 73 65 20 66 6f 72 20  ARCH. False for 
227e0 53 43 41 4e 2e 20 2a 2f 0a 0a 20 20 20 20 69 66  SCAN. */..    if
227f0 28 20 28 66 6c 61 67 73 26 57 48 45 52 45 5f 4d  ( (flags&WHERE_M
22800 55 4c 54 49 5f 4f 52 29 20 7c 7c 20 28 77 63 74  ULTI_OR) || (wct
22810 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 4e  rlFlags&WHERE_ON
22820 45 54 41 42 4c 45 5f 4f 4e 4c 59 29 20 29 20 72  ETABLE_ONLY) ) r
22830 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 73 53 65  eturn;..    isSe
22840 61 72 63 68 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  arch = (pLevel->
22850 70 6c 61 6e 2e 6e 45 71 3e 30 29 0a 20 20 20 20  plan.nEq>0).    
22860 20 20 20 20 20 20 20 20 20 7c 7c 20 28 66 6c 61           || (fla
22870 67 73 26 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49  gs&(WHERE_BTM_LI
22880 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49  MIT|WHERE_TOP_LI
22890 4d 49 54 29 29 21 3d 30 0a 20 20 20 20 20 20 20  MIT))!=0.       
228a0 20 20 20 20 20 20 7c 7c 20 28 77 63 74 72 6c 46        || (wctrlF
228b0 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44 45  lags&(WHERE_ORDE
228c0 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f 52  RBY_MIN|WHERE_OR
228d0 44 45 52 42 59 5f 4d 41 58 29 29 3b 0a 0a 20 20  DERBY_MAX));..  
228e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
228f0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 22  MPrintf(db, "%s"
22900 2c 20 69 73 53 65 61 72 63 68 3f 22 53 45 41 52  , isSearch?"SEAR
22910 43 48 22 3a 22 53 43 41 4e 22 29 3b 0a 20 20 20  CH":"SCAN");.   
22920 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
22930 65 63 74 20 29 7b 0a 20 20 20 20 20 20 7a 4d 73  ect ){.      zMs
22940 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22950 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22960 73 20 53 55 42 51 55 45 52 59 20 25 64 22 2c 20  s SUBQUERY %d", 
22970 7a 4d 73 67 2c 70 49 74 65 6d 2d 3e 69 53 65 6c  zMsg,pItem->iSel
22980 65 63 74 49 64 29 3b 0a 20 20 20 20 7d 65 6c 73  ectId);.    }els
22990 65 7b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  e{.      zMsg = 
229a0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
229b0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 54 41  db, zMsg, "%s TA
229c0 42 4c 45 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70  BLE %s", zMsg, p
229d0 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
229e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 74    }..    if( pIt
229f0 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
22a00 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22a10 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22a20 4d 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c  Msg, "%s AS %s",
22a30 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41   zMsg, pItem->zA
22a40 6c 69 61 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lias);.    }.   
22a50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 57 48   if( (flags & WH
22a60 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
22a70 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
22a80 57 68 65 72 65 20 3d 20 65 78 70 6c 61 69 6e 49  Where = explainI
22a90 6e 64 65 78 52 61 6e 67 65 28 64 62 2c 20 70 4c  ndexRange(db, pL
22aa0 65 76 65 6c 2c 20 70 49 74 65 6d 2d 3e 70 54 61  evel, pItem->pTa
22ab0 62 29 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  b);.      zMsg =
22ac0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
22ad0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
22ae0 53 49 4e 47 20 25 73 25 73 49 4e 44 45 58 25 73  SING %s%sINDEX%s
22af0 25 73 25 73 22 2c 20 7a 4d 73 67 2c 20 0a 20 20  %s%s", zMsg, .  
22b00 20 20 20 20 20 20 20 20 28 28 66 6c 61 67 73 20          ((flags 
22b10 26 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44  & WHERE_TEMP_IND
22b20 45 58 29 3f 22 41 55 54 4f 4d 41 54 49 43 20 22  EX)?"AUTOMATIC "
22b30 3a 22 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  :""),.          
22b40 28 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ((flags & WHERE_
22b50 49 44 58 5f 4f 4e 4c 59 29 3f 22 43 4f 56 45 52  IDX_ONLY)?"COVER
22b60 49 4e 47 20 22 3a 22 22 29 2c 0a 20 20 20 20 20  ING ":""),.     
22b70 20 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57       ((flags & W
22b80 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29  HERE_TEMP_INDEX)
22b90 3f 22 22 3a 22 20 22 29 2c 0a 20 20 20 20 20 20  ?"":" "),.      
22ba0 20 20 20 20 28 28 66 6c 61 67 73 20 26 20 57 48      ((flags & WH
22bb0 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 3f  ERE_TEMP_INDEX)?
22bc0 22 22 3a 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  "": pLevel->plan
22bd0 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 2c  .u.pIdx->zName),
22be0 0a 20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72  .          zWher
22bf0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
22c00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22c10 62 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  b, zWhere);.    
22c20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
22c30 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
22c40 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
22c50 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 7a 4d  NGE) ){.      zM
22c60 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70  sg = sqlite3MApp
22c70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22  endf(db, zMsg, "
22c80 25 73 20 55 53 49 4e 47 20 49 4e 54 45 47 45 52  %s USING INTEGER
22c90 20 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a   PRIMARY KEY", z
22ca0 4d 73 67 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Msg);..      if(
22cb0 20 66 6c 61 67 73 26 57 48 45 52 45 5f 52 4f 57   flags&WHERE_ROW
22cc0 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 20  ID_EQ ){.       
22cd0 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22ce0 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22cf0 2c 20 22 25 73 20 28 72 6f 77 69 64 3d 3f 29 22  , "%s (rowid=?)"
22d00 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
22d10 65 6c 73 65 20 69 66 28 20 28 66 6c 61 67 73 26  else if( (flags&
22d20 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49 4d 49 54  WHERE_BOTH_LIMIT
22d30 29 3d 3d 57 48 45 52 45 5f 42 4f 54 48 5f 4c 49  )==WHERE_BOTH_LI
22d40 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  MIT ){.        z
22d50 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70  Msg = sqlite3MAp
22d60 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20  pendf(db, zMsg, 
22d70 22 25 73 20 28 72 6f 77 69 64 3e 3f 20 41 4e 44  "%s (rowid>? AND
22d80 20 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d 73 67   rowid<?)", zMsg
22d90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
22da0 66 28 20 66 6c 61 67 73 26 57 48 45 52 45 5f 42  f( flags&WHERE_B
22db0 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  TM_LIMIT ){.    
22dc0 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
22dd0 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
22de0 4d 73 67 2c 20 22 25 73 20 28 72 6f 77 69 64 3e  Msg, "%s (rowid>
22df0 3f 29 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  ?)", zMsg);.    
22e00 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
22e10 73 26 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  s&WHERE_TOP_LIMI
22e20 54 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  T ){.        zMs
22e30 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22e40 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22e50 73 20 28 72 6f 77 69 64 3c 3f 29 22 2c 20 7a 4d  s (rowid<?)", zM
22e60 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
22e70 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
22e80 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
22e90 42 4c 45 0a 20 20 20 20 65 6c 73 65 20 69 66 28  BLE.    else if(
22ea0 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f   (flags & WHERE_
22eb0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
22ec0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22ed0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
22ee0 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
22ef0 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
22f00 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
22f10 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28 64  qlite3MAppendf(d
22f20 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49 52  b, zMsg, "%s VIR
22f30 54 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58  TUAL TABLE INDEX
22f40 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20   %d:%s", zMsg,. 
22f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f60 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75   pVtabIdx->idxNu
22f70 6d 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  m, pVtabIdx->idx
22f80 53 74 72 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Str);.    }.#end
22f90 69 66 0a 20 20 20 20 69 66 28 20 77 63 74 72 6c  if.    if( wctrl
22fa0 46 6c 61 67 73 26 28 57 48 45 52 45 5f 4f 52 44  Flags&(WHERE_ORD
22fb0 45 52 42 59 5f 4d 49 4e 7c 57 48 45 52 45 5f 4f  ERBY_MIN|WHERE_O
22fc0 52 44 45 52 42 59 5f 4d 41 58 29 20 29 7b 0a 20  RDERBY_MAX) ){. 
22fd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 77       testcase( w
22fe0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22ff0 45 5f 4f 52 44 45 52 42 59 5f 4d 49 4e 20 29 3b  E_ORDERBY_MIN );
23000 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20 31 3b  .      nRow = 1;
23010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23020 20 20 6e 52 6f 77 20 3d 20 28 73 71 6c 69 74 65    nRow = (sqlite
23030 33 5f 69 6e 74 36 34 29 70 4c 65 76 65 6c 2d 3e  3_int64)pLevel->
23040 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20 20 20 20 7d  plan.nRow;.    }
23050 0a 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  .    zMsg = sqli
23060 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
23070 7a 4d 73 67 2c 20 22 25 73 20 28 7e 25 6c 6c 64  zMsg, "%s (~%lld
23080 20 72 6f 77 73 29 22 2c 20 7a 4d 73 67 2c 20 6e   rows)", zMsg, n
23090 52 6f 77 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Row);.    sqlite
230a0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
230b0 50 5f 45 78 70 6c 61 69 6e 2c 20 69 49 64 2c 20  P_Explain, iId, 
230c0 69 4c 65 76 65 6c 2c 20 69 46 72 6f 6d 2c 20 7a  iLevel, iFrom, z
230d0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
230e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  ;.  }.}.#else.# 
230f0 64 65 66 69 6e 65 20 65 78 70 6c 61 69 6e 4f 6e  define explainOn
23100 65 53 63 61 6e 28 75 2c 76 2c 77 2c 78 2c 79 2c  eScan(u,v,w,x,y,
23110 7a 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  z).#endif /* SQL
23120 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
23130 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   */.../*.** Gene
23140 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68  rate code for th
23150 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 69  e start of the i
23160 4c 65 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e  Level-th loop in
23170 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
23180 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
23190 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20 62 79  ion described by
231a0 20 70 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74   pWInfo..*/.stat
231b0 69 63 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f  ic Bitmask codeO
231c0 6e 65 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57  neLoopStart(.  W
231d0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
231e0 2c 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20  ,   /* Complete 
231f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
23200 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
23210 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76  se */.  int iLev
23220 65 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el,          /* 
23230 57 68 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70  Which level of p
23240 57 49 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c  WInfo->a[] shoul
23250 64 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  d be coded */.  
23260 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20  u16 wctrlFlags, 
23270 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
23280 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73  he WHERE_* flags
23290 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69   defined in sqli
232a0 74 65 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74  teInt.h */.  Bit
232b0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20  mask notReady   
232c0 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65    /* Which table
232d0 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
232e0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a  available */.){.
232f0 20 20 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20    int j, k;     
23300 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
23310 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
23320 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20 20   iCur;          
23330 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
23340 72 73 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62  rsor for the tab
23350 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  le */.  int addr
23360 4e 78 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Nxt;         /* 
23370 57 68 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f  Where to jump to
23380 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74   continue with t
23390 68 65 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20  he next IN case 
233a0 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  */.  int omitTab
233b0 6c 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  le;       /* Tru
233c0 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20  e if we use the 
233d0 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20  index only */.  
233e0 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
233f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
23400 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20  we need to scan 
23410 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
23420 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
23430 20 2a 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68   *pLevel;  /* Th
23440 65 20 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f  e where level to
23450 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57   be coded */.  W
23460 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b  hereClause *pWC;
23470 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
23480 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  tion of the enti
23490 72 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  re WHERE clause 
234a0 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
234b0 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
234c0 20 20 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20       /* A WHERE 
234d0 63 6c 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20  clause term */. 
234e0 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23500 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
23510 65 78 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76  ext */.  Vdbe *v
23520 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23530 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23540 70 72 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e  prepared stmt un
23550 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
23560 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
23570 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
23580 49 74 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63  Item;  /* FROM c
23590 6c 61 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67  lause term being
235a0 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20   coded */.  int 
235b0 61 64 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20  addrBrk;        
235c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
235d0 75 6d 70 20 68 65 72 65 20 74 6f 20 62 72 65 61  ump here to brea
235e0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  k out of the loo
235f0 70 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43  p */.  int addrC
23600 6f 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ont;            
23610 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
23620 65 72 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ere to continue 
23630 77 69 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20  with next cycle 
23640 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52  */.  int iRowidR
23650 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  eg = 0;        /
23660 2a 20 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65  * Rowid is store
23670 64 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  d in this regist
23680 65 72 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20  er, if not zero 
23690 2a 2f 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73  */.  int iReleas
236a0 65 52 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f  eReg = 0;      /
236b0 2a 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20  * Temp register 
236c0 74 6f 20 66 72 65 65 20 62 65 66 6f 72 65 20 72  to free before r
236d0 65 74 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70  eturning */..  p
236e0 50 61 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e  Parse = pWInfo->
236f0 70 50 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50  pParse;.  v = pP
23700 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70  arse->pVdbe;.  p
23710 57 43 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43  WC = pWInfo->pWC
23720 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57  ;.  pLevel = &pW
23730 49 6e 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b  Info->a[iLevel];
23740 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70  .  pTabItem = &p
23750 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d  WInfo->pTabList-
23760 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
23770 5d 3b 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62  ];.  iCur = pTab
23780 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
23790 20 62 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d   bRev = (pLevel-
237a0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
237b0 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d  WHERE_REVERSE)!=
237c0 30 3b 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d  0;.  omitTable =
237d0 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
237e0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
237f0 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20  DX_ONLY)!=0 .   
23800 20 20 20 20 20 20 20 20 26 26 20 28 77 63 74 72          && (wctr
23810 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46  lFlags & WHERE_F
23820 4f 52 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a  ORCE_TABLE)==0;.
23830 0a 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62  .  /* Create lab
23840 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72 65  els for the "bre
23850 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75  ak" and "continu
23860 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a  e" instructions.
23870 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
23880 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
23890 20 74 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62   to addrBrk to b
238a0 72 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f  reak out of a lo
238b0 6f 70 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f  op..  ** Jump to
238c0 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65   cont to go imme
238d0 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e  diately to the n
238e0 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
238f0 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a   the.  ** loop..
23900 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
23910 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70  here is an IN op
23920 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20  erator, we also 
23930 68 61 76 65 20 61 20 22 61 64 64 72 4e 78 74 22  have a "addrNxt"
23940 20 6c 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a   label that.  **
23950 20 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e   means to contin
23960 75 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74  ue with the next
23970 20 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e   IN value combin
23980 61 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a  ation.  When.  *
23990 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49  * there are no I
239a0 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74  N operators in t
239b0 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20  he constraints, 
239c0 74 68 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61  the "addrNxt" la
239d0 62 65 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  bel.  ** is the 
239e0 73 61 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b  same as "addrBrk
239f0 22 2e 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72  "..  */.  addrBr
23a00 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
23a10 42 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Brk = pLevel->ad
23a20 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
23a30 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
23a40 0a 20 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c  .  addrCont = pL
23a50 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d  evel->addrCont =
23a60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
23a70 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20  Label(v);..  /* 
23a80 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72  If this is the r
23a90 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20  ight table of a 
23aa0 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c  LEFT OUTER JOIN,
23ab0 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20   allocate and.  
23ac0 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20  ** initialize a 
23ad0 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74  memory cell that
23ae0 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69 73   records if this
23af0 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61   table matches a
23b00 6e 79 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  ny.  ** row of t
23b10 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
23b20 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
23b30 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46    if( pLevel->iF
23b40 72 6f 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74  rom>0 && (pTabIt
23b50 65 6d 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  em[0].jointype &
23b60 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
23b70 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66      pLevel->iLef
23b80 74 4a 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65  tJoin = ++pParse
23b90 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69  ->nMem;.    sqli
23ba0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23bb0 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
23bc0 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
23bd0 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d  n);.    VdbeComm
23be0 65 6e 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45  ent((v, "init LE
23bf0 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68  FT JOIN no-match
23c00 20 66 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23   flag"));.  }..#
23c10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23c20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
23c30 20 20 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e    if(  (pLevel->
23c40 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
23c50 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
23c60 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  E)!=0 ){.    /* 
23c70 43 61 73 65 20 30 3a 20 20 54 68 65 20 74 61 62  Case 0:  The tab
23c80 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d  le is a virtual-
23c90 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20  table.  Use the 
23ca0 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78  VFilter and VNex
23cb0 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  t.    **        
23cc0 20 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20    to access the 
23cd0 64 61 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  data..    */.   
23ce0 20 69 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20   int iReg;   /* 
23cf0 50 33 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f  P3 Value for OP_
23d00 56 46 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73  VFilter */.    s
23d10 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
23d20 6f 20 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c  o *pVtabIdx = pL
23d30 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74  evel->plan.u.pVt
23d40 61 62 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e  abIdx;.    int n
23d50 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74  Constraint = pVt
23d60 61 62 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69  abIdx->nConstrai
23d70 6e 74 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  nt;.    struct s
23d80 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
23d90 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61  straint_usage *a
23da0 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20  Usage =.        
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 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
23de0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
23df0 67 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74  ge;.    const st
23e00 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
23e10 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61  ex_constraint *a
23e20 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20  Constraint =.   
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 20 20 20 20 20 20 70 56 74               pVt
23e60 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69  abIdx->aConstrai
23e70 6e 74 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  nt;..    sqlite3
23e80 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70 50  ExprCachePush(pP
23e90 61 72 73 65 29 3b 0a 20 20 20 20 69 52 65 67 20  arse);.    iReg 
23ea0 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
23eb0 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e 43  Range(pParse, nC
23ec0 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20  onstraint+2);.  
23ed0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43    for(j=1; j<=nC
23ee0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
23ef0 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20  .      for(k=0; 
23f00 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b  k<nConstraint; k
23f10 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
23f20 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49   aUsage[k].argvI
23f30 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20  ndex==j ){.     
23f40 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d       int iTerm =
23f50 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e   aConstraint[k].
23f60 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
23f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
23f80 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
23f90 57 43 2d 3e 61 5b 69 54 65 72 6d 5d 2e 70 45 78  WC->a[iTerm].pEx
23fa0 70 72 2d 3e 70 52 69 67 68 74 2c 20 69 52 65 67  pr->pRight, iReg
23fb0 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20  +j+1);.         
23fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23fd0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
23fe0 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69  if( k==nConstrai
23ff0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
24000 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  }.    sqlite3Vdb
24010 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e  eAddOp2(v, OP_In
24020 74 65 67 65 72 2c 20 70 56 74 61 62 49 64 78 2d  teger, pVtabIdx-
24030 3e 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a  >idxNum, iReg);.
24040 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24050 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65  ddOp2(v, OP_Inte
24060 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b 31  ger, j-1, iReg+1
24070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
24080 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56  beAddOp4(v, OP_V
24090 46 69 6c 74 65 72 2c 20 69 43 75 72 2c 20 61 64  Filter, iCur, ad
240a0 64 72 42 72 6b 2c 20 69 52 65 67 2c 20 70 56 74  drBrk, iReg, pVt
240b0 61 62 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20  abIdx->idxStr,. 
240c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
240d0 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e       pVtabIdx->n
240e0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
240f0 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20 50  ? P4_MPRINTF : P
24100 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 70  4_STATIC);.    p
24110 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46  VtabIdx->needToF
24120 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20  reeIdxStr = 0;. 
24130 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
24140 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
24150 0a 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67  .      if( aUsag
24160 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20  e[j].omit ){.   
24170 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d       int iTerm =
24180 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e   aConstraint[j].
24190 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20  iTermOffset;.   
241a0 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
241b0 28 70 4c 65 76 65 6c 2c 20 26 70 57 43 2d 3e 61  (pLevel, &pWC->a
241c0 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20  [iTerm]);.      
241d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  }.    }.    pLev
241e0 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 56 4e 65 78  el->op = OP_VNex
241f0 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
24200 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c  1 = iCur;.    pL
24210 65 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74  evel->p2 = sqlit
24220 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
24230 72 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(v);.    sqlite
24240 33 52 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67  3ReleaseTempRang
24250 65 28 70 50 61 72 73 65 2c 20 69 52 65 67 2c 20  e(pParse, iReg, 
24260 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29 3b 0a  nConstraint+2);.
24270 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24280 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 2c 20  achePop(pParse, 
24290 31 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  1);.  }else.#end
242a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
242b0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
242c0 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  /..  if( pLevel-
242d0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
242e0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
242f0 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
24300 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
24310 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
24320 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
24330 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
24340 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
24350 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
24360 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
24370 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
24380 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
24390 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
243a0 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
243b0 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
243c0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
243d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65  ..    */.    iRe
243e0 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
243f0 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
24400 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  rse);.    pTerm 
24410 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
24420 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
24430 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
24440 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
24450 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
24460 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
24470 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
24480 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c  assert( pTerm->l
24490 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
244a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
244b0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
244c0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
244d0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
244e0 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a  RM_VIRTUAL ); /*
244f0 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31 31 36   EV: R-30575-116
24500 36 32 20 2a 2f 0a 20 20 20 20 69 52 6f 77 69 64  62 */.    iRowid
24510 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69  Reg = codeEquali
24520 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70  tyTerm(pParse, p
24530 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52  Term, pLevel, iR
24540 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20  eleaseReg);.    
24550 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
24560 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73  ->addrNxt;.    s
24570 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
24580 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74  (v, OP_MustBeInt
24590 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64  , iRowidReg, add
245a0 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rNxt);.    sqlit
245b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
245c0 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43  OP_NotExists, iC
245d0 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f  ur, addrNxt, iRo
245e0 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  widReg);.    sql
245f0 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f  ite3ExprCacheSto
24600 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c  re(pParse, iCur,
24610 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b   -1, iRowidReg);
24620 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
24630 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
24640 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
24650 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69  _Noop;.  }else i
24660 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
24670 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
24680 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20  ROWID_RANGE ){. 
24690 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57     /* Case 2:  W
246a0 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61  e have an inequa
246b0 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20  lity comparison 
246c0 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49  against the ROWI
246d0 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a  D field..    */.
246e0 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d      int testOp =
246f0 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e   OP_Noop;.    in
24700 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74  t start;.    int
24710 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30   memEndValue = 0
24720 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  ;.    WhereTerm 
24730 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a  *pStart, *pEnd;.
24740 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69  .    assert( omi
24750 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
24760 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65   pStart = findTe
24770 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
24780 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
24790 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20  T|WO_GE, 0);.   
247a0 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d   pEnd = findTerm
247b0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
247c0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
247d0 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69  WO_LE, 0);.    i
247e0 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
247f0 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b   pTerm = pStart;
24800 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d 20  .      pStart = 
24810 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64  pEnd;.      pEnd
24820 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = pTerm;.    }.
24830 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29      if( pStart )
24840 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
24850 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24860 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
24870 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
24880 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a   start bound */.
24890 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54        int r1, rT
248a0 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  emp;        /* R
248b0 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c  egisters for hol
248c0 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 62  ding the start b
248d0 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20  oundary */..    
248e0 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
248f0 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73  ng constant maps
24900 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74   TK_xx codes int
24910 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  o corresponding 
24920 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f  .      ** seek o
24930 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65  pcodes.  It depe
24940 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75  nds on a particu
24950 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20  lar ordering of 
24960 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20  TK_xx.      */. 
24970 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d       const u8 aM
24980 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  oveOp[] = {.    
24990 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20         /* TK_GT 
249a0 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20  */  OP_SeekGt,. 
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f            /* TK_
249c0 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65  LE */  OP_SeekLe
249d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,.           /* 
249e0 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65  TK_LT */  OP_See
249f0 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  kLt,.           
24a00 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f  /* TK_GE */  OP_
24a10 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a  SeekGe.      };.
24a20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
24a30 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20  _LE==TK_GT+1 ); 
24a40 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72       /* Make sur
24a50 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e  e the ordering..
24a60 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
24a70 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32  ( TK_LT==TK_GT+2
24a80 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
24a90 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61   of the TK_xx va
24aa0 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20  lues... */.     
24ab0 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d   assert( TK_GE==
24ac0 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20  TK_GT+3 );      
24ad0 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65  /*  ... is corre
24ae0 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 74  cct. */..      t
24af0 65 73 74 63 61 73 65 28 20 70 53 74 61 72 74 2d  estcase( pStart-
24b00 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
24b10 56 49 52 54 55 41 4c 20 29 3b 20 2f 2a 20 45 56  VIRTUAL ); /* EV
24b20 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32 20  : R-30575-11662 
24b30 2a 2f 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53  */.      pX = pS
24b40 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
24b50 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30     assert( pX!=0
24b60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
24b70 28 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75  ( pStart->leftCu
24b80 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
24b90 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
24ba0 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
24bb0 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
24bc0 20 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20   &rTemp);.      
24bd0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24be0 33 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d  3(v, aMoveOp[pX-
24bf0 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72  >op-TK_GT], iCur
24c00 2c 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a  , addrBrk, r1);.
24c10 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
24c20 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
24c30 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
24c40 61 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e  acheAffinityChan
24c50 67 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31  ge(pParse, r1, 1
24c60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
24c70 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
24c80 50 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20  Parse, rTemp);. 
24c90 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
24ca0 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29  (pLevel, pStart)
24cb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
24cc0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
24cd0 64 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f  dOp2(v, bRev ? O
24ce0 50 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69  P_Last : OP_Rewi
24cf0 6e 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  nd, iCur, addrBr
24d00 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
24d10 28 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( pEnd ){.      
24d20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20  Expr *pX;.      
24d30 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
24d40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24d50 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61  pX!=0 );.      a
24d60 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66  ssert( pEnd->lef
24d70 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
24d80 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
24d90 20 70 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26   pEnd->wtFlags &
24da0 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
24db0 20 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d   /* EV: R-30575-
24dc0 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 20 20 6d  11662 */.      m
24dd0 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70  emEndValue = ++p
24de0 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
24df0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
24e00 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
24e10 52 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c  Right, memEndVal
24e20 75 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ue);.      if( p
24e30 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20  X->op==TK_LT || 
24e40 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b  pX->op==TK_GT ){
24e50 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
24e60 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
24e70 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65   OP_Ge;.      }e
24e80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73  lse{.        tes
24e90 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  tOp = bRev ? OP_
24ea0 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20  Lt : OP_Gt;.    
24eb0 20 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c    }.      disabl
24ec0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45  eTerm(pLevel, pE
24ed0 6e 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nd);.    }.    s
24ee0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
24ef0 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
24f00 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70  ;.    pLevel->op
24f10 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
24f20 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
24f30 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
24f40 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ur;.    pLevel->
24f50 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
24f60 69 66 28 20 70 53 74 61 72 74 3d 3d 30 20 26 26  if( pStart==0 &&
24f70 20 70 45 6e 64 3d 3d 30 20 29 7b 0a 20 20 20 20   pEnd==0 ){.    
24f80 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 53    pLevel->p5 = S
24f90 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
24fa0 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 3b 0a  _FULLSCAN_STEP;.
24fb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24fc0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
24fd0 3e 70 35 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  >p5==0 );.    }.
24fe0 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
24ff0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
25000 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52 65   iRowidReg = iRe
25010 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
25020 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
25030 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rse);.      sqli
25040 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
25050 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c   OP_Rowid, iCur,
25060 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
25070 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
25080 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c  cheStore(pParse,
25090 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69   iCur, -1, iRowi
250a0 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  dReg);.      sql
250b0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
250c0 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e 64  , testOp, memEnd
250d0 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c 20  Value, addrBrk, 
250e0 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20  iRowidReg);.    
250f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
25100 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45 5f  ngeP5(v, SQLITE_
25110 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53 51  AFF_NUMERIC | SQ
25120 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
25130 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
25140 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
25150 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
25160 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
25170 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29 20  HERE_COLUMN_EQ) 
25180 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 33  ){.    /* Case 3
25190 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20 61  : A scan using a
251a0 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 0a  n index..    **.
251b0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
251c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
251d0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f  may contain zero
251e0 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69 74   or more equalit
251f0 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  y .    **       
25200 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f 72    terms ("==" or
25210 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 29   "IN" operators)
25220 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74   that refer to t
25230 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20 20  he N.    **     
25240 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f      left-most co
25250 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64  lumns of the ind
25260 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f 20  ex. It may also 
25270 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20 20  contain.    **  
25280 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69 74         inequalit
25290 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 3e  y constraints (>
252a0 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20 6f  , <, >= or <=) o
252b0 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20 20  n the indexed.  
252c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c    **         col
252d0 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69 61  umn that immedia
252e0 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68 65  tely follows the
252f0 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20 4f   N equalities. O
25300 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  nly .    **     
25310 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d 6f      the right-mo
25320 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65  st column can be
25330 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d   an inequality -
25340 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20   the rest must. 
25350 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75 73     **         us
25360 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20 22  e the "==" and "
25370 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20 46  IN" operators. F
25380 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
25390 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  he .    **      
253a0 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28     index is on (
253b0 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68 65  x,y,z), then the
253c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75 73   following claus
253d0 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20 20  es are all .    
253e0 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69 6d  **         optim
253f0 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ized:.    **.   
25400 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78   **            x
25410 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  =5.    **       
25420 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 31       x=5 AND y=1
25430 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
25440 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31 30      x=5 AND y<10
25450 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
25460 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20 41     x=5 AND y>5 A
25470 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20  ND y<10.    **  
25480 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
25490 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30 0a  D y=5 AND z<=10.
254a0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
254b0 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20 74        The z<10 t
254c0 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  erm of the follo
254d0 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  wing cannot be u
254e0 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  sed, only.    **
254f0 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d 35           the x=5
25500 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20 20   term:.    **.  
25510 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
25520 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20 20  x=5 AND z<10.   
25530 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
25540 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72 6f     N may be zero
25550 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
25560 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
25570 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20 20  ints..    **    
25580 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61 72       If there ar
25590 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79 20  e no inequality 
255a0 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65  constraints, the
255b0 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a 2a  n N is at.    **
255c0 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20 6f           least o
255d0 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ne..    **.    *
255e0 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
255f0 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
25600 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
25610 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
25620 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63      **         c
25630 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20 61  onstraints but a
25640 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63  n index is selec
25650 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f  ted anyway, in o
25660 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20 20  rder.    **     
25670 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
25680 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
25690 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
256a0 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f 20  RDER BY..    */ 
256b0 20 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e   .    static con
256c0 73 74 20 75 38 20 61 53 74 61 72 74 4f 70 5b 5d  st u8 aStartOp[]
256d0 20 3d 20 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20   = {.      0,.  
256e0 20 20 20 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f      0,.      OP_
256f0 52 65 77 69 6e 64 2c 20 20 20 20 20 20 20 20 20  Rewind,         
25700 20 20 2f 2a 20 32 3a 20 28 21 73 74 61 72 74 5f    /* 2: (!start_
25710 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73  constraints && s
25720 74 61 72 74 45 71 20 26 26 20 20 21 62 52 65 76  tartEq &&  !bRev
25730 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61  ) */.      OP_La
25740 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
25750 2f 2a 20 33 3a 20 28 21 73 74 61 72 74 5f 63 6f  /* 3: (!start_co
25760 6e 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61  nstraints && sta
25770 72 74 45 71 20 26 26 20 20 20 62 52 65 76 29 20  rtEq &&   bRev) 
25780 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b  */.      OP_Seek
25790 47 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Gt,           /*
257a0 20 34 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74   4: (start_const
257b0 72 61 69 6e 74 73 20 20 26 26 20 21 73 74 61 72  raints  && !star
257c0 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a 2f  tEq && !bRev) */
257d0 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74  .      OP_SeekLt
257e0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 35  ,           /* 5
257f0 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61  : (start_constra
25800 69 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45  ints  && !startE
25810 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a 20  q &&  bRev) */. 
25820 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20       OP_SeekGe, 
25830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 36 3a 20            /* 6: 
25840 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e  (start_constrain
25850 74 73 20 20 26 26 20 20 73 74 61 72 74 45 71 20  ts  &&  startEq 
25860 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20  && !bRev) */.   
25870 20 20 20 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20     OP_SeekLe    
25880 20 20 20 20 20 20 20 20 2f 2a 20 37 3a 20 28 73          /* 7: (s
25890 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
258a0 20 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26    &&  startEq &&
258b0 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d    bRev) */.    }
258c0 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
258d0 73 74 20 75 38 20 61 45 6e 64 4f 70 5b 5d 20 3d  st u8 aEndOp[] =
258e0 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70   {.      OP_Noop
258f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
25900 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72   0: (!end_constr
25910 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20  aints) */.      
25920 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20  OP_IdxGE,       
25930 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f       /* 1: (end_
25940 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21  constraints && !
25950 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
25960 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20 20  P_IdxLT         
25970 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63      /* 2: (end_c
25980 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62 52  onstraints && bR
25990 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20  ev) */.    };.  
259a0 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
259b0 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 2f  el->plan.nEq;  /
259c0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
259d0 72 20 49 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20  r IN terms */.  
259e0 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79    int isMinQuery
259f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
25a00 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
25a10 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54  optimized SELECT
25a20 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20   min(x).. */.   
25a30 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20   int regBase;   
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a50 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 68   Base register h
25a60 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
25a70 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  t values */.    
25a80 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20 20  int r1;         
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25aa0 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f  Temp register */
25ab0 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
25ac0 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b  pRangeStart = 0;
25ad0 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20    /* Inequality 
25ae0 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61  constraint at ra
25af0 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20  nge start */.   
25b00 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e   WhereTerm *pRan
25b10 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a  geEnd = 0;    /*
25b20 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   Inequality cons
25b30 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20  traint at range 
25b40 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  end */.    int s
25b50 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20 20  tartEq;         
25b60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
25b70 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20 75  if range start u
25b80 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d  ses ==, >= or <=
25b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45   */.    int endE
25ba0 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q;              
25bb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
25bc0 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d  range end uses =
25bd0 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20  =, >= or <= */. 
25be0 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e     int start_con
25bf0 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20  straints;       
25c00 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67  /* Start of rang
25c10 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  e is constrained
25c20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e   */.    int nCon
25c30 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20  straint;        
25c40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25c50 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  f constraint ter
25c60 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20  ms */.    Index 
25c70 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
25c80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
25c90 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75  dex we will be u
25ca0 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20  sing */.    int 
25cb0 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 20  iIdxCur;        
25cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
25cd0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
25ce0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
25cf0 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d   int nExtraReg =
25d00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
25d10 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   Number of extra
25d20 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64 65   registers neede
25d30 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70 3b  d */.    int op;
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63        /* Instruc
25d60 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20  tion opcode */. 
25d70 20 20 20 63 68 61 72 20 2a 7a 53 74 61 72 74 41     char *zStartA
25d80 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
25d90 2f 2a 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20  /* Affinity for 
25da0 73 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20 63  start of range c
25db0 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20  onstraint */.   
25dc0 20 63 68 61 72 20 2a 7a 45 6e 64 41 66 66 3b 20   char *zEndAff; 
25dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25de0 20 41 66 66 69 6e 69 74 79 20 66 6f 72 20 65 6e   Affinity for en
25df0 64 20 6f 66 20 72 61 6e 67 65 20 63 6f 6e 73 74  d of range const
25e00 72 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 70 49  raint */..    pI
25e10 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  dx = pLevel->pla
25e20 6e 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49  n.u.pIdx;.    iI
25e30 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
25e40 69 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d  iIdxCur;.    k =
25e50 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
25e60 6e 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c  nEq];     /* Col
25e70 75 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69  umn for inequali
25e80 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  ty constraints *
25e90 2f 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  /..    /* If thi
25ea0 73 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73  s loop satisfies
25eb0 20 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70   a sort order (p
25ec0 4f 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74  OrderBy) request
25ed0 20 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61   that .    ** wa
25ee0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  s passed to this
25ef0 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70   function to imp
25f00 6c 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54  lement a "SELECT
25f10 20 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20   min(x) ..." .  
25f20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e    ** query, then
25f30 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
25f40 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20   only allow the 
25f50 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a  loop to run for.
25f60 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
25f70 69 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iteration. This 
25f80 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
25f90 69 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65  irst row returne
25fa0 64 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20  d.    ** should 
25fb0 6e 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20  not have a NULL 
25fc0 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
25fd0 27 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27  'x'. If column '
25fe0 78 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65  x' is.    ** the
25ff0 20 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72   first one after
26000 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74   the nEq equalit
26010 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e  y constraints in
26020 20 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20   the index,.    
26030 2a 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73  ** this requires
26040 20 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61   some special ha
26050 6e 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  ndling..    */. 
26060 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
26070 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
26080 5f 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26  _MIN)!=0.     &&
26090 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
260a0 73 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  sFlags&WHERE_ORD
260b0 45 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70  ERBY).     && (p
260c0 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71  Idx->nColumn>nEq
260d0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f  ).    ){.      /
260e0 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72  * assert( pOrder
260f0 42 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20  By->nExpr==1 ); 
26100 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  */.      /* asse
26110 72 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  rt( pOrderBy->a[
26120 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
26130 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
26140 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20  n[nEq] ); */.   
26150 20 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20     isMinQuery = 
26160 31 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52  1;.      nExtraR
26170 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  eg = 1;.    }.. 
26180 20 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69     /* Find any i
26190 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
261a0 61 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74  aint terms for t
261b0 68 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64  he start and end
261c0 20 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20   .    ** of the 
261d0 72 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20  range. .    */. 
261e0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
261f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
26200 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b  ERE_TOP_LIMIT ){
26210 0a 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64  .      pRangeEnd
26220 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
26230 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
26240 64 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  dy, (WO_LT|WO_LE
26250 29 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  ), pIdx);.      
26260 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
26270 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65     }.    if( pLe
26280 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
26290 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
262a0 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61  MIT ){.      pRa
262b0 6e 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54  ngeStart = findT
262c0 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
262d0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f  , notReady, (WO_
262e0 47 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29  GT|WO_GE), pIdx)
262f0 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
26300 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
26310 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
26320 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61  de to evaluate a
26330 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  ll constraint te
26340 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20  rms using == or 
26350 49 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74  IN.    ** and st
26360 6f 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f  ore the values o
26370 66 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e  f those terms in
26380 20 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67   an array of reg
26390 69 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74  isters.    ** st
263a0 61 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73  arting at regBas
263b0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  e..    */.    re
263c0 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45  gBase = codeAllE
263d0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
263e0 20 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c        pParse, pL
263f0 65 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65  evel, pWC, notRe
26400 61 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20  ady, nExtraReg, 
26410 26 7a 53 74 61 72 74 41 66 66 0a 20 20 20 20 29  &zStartAff.    )
26420 3b 0a 20 20 20 20 7a 45 6e 64 41 66 66 20 3d 20  ;.    zEndAff = 
26430 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
26440 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61  pParse->db, zSta
26450 72 74 41 66 66 29 3b 0a 20 20 20 20 61 64 64 72  rtAff);.    addr
26460 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64  Nxt = pLevel->ad
26470 64 72 4e 78 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  drNxt;..    /* I
26480 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
26490 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 73   reverse order s
264a0 63 61 6e 20 6f 6e 20 61 6e 20 61 73 63 65 6e 64  can on an ascend
264b0 69 6e 67 20 69 6e 64 65 78 2c 20 6f 72 0a 20 20  ing index, or.  
264c0 20 20 2a 2a 20 61 20 66 6f 72 77 61 72 64 20 6f    ** a forward o
264d0 72 64 65 72 20 73 63 61 6e 20 6f 6e 20 61 20 64  rder scan on a d
264e0 65 73 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c  escending index,
264f0 20 69 6e 74 65 72 63 68 61 6e 67 65 20 74 68 65   interchange the
26500 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 61   .    ** start a
26510 6e 64 20 65 6e 64 20 74 65 72 6d 73 20 28 70 52  nd end terms (pR
26520 61 6e 67 65 53 74 61 72 74 20 61 6e 64 20 70 52  angeStart and pR
26530 61 6e 67 65 45 6e 64 29 2e 0a 20 20 20 20 2a 2f  angeEnd)..    */
26540 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 49 64  .    if( nEq<pId
26550 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 62 52  x->nColumn && bR
26560 65 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74  ev==(pIdx->aSort
26570 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
26580 54 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20  TE_SO_ASC) ){.  
26590 20 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65      SWAP(WhereTe
265a0 72 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c  rm *, pRangeEnd,
265b0 20 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20   pRangeStart);. 
265c0 20 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61     }..    testca
265d0 73 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20  se( pRangeStart 
265e0 26 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e  && pRangeStart->
265f0 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c  eOperator & WO_L
26600 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
26610 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
26620 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
26630 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45  Operator & WO_GE
26640 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
26650 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70  ( pRangeEnd && p
26660 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61  RangeEnd->eOpera
26670 74 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20  tor & WO_LE );. 
26680 20 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61     testcase( pRa
26690 6e 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65  ngeEnd && pRange
266a0 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  End->eOperator &
266b0 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74   WO_GE );.    st
266c0 61 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53  artEq = !pRangeS
266d0 74 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74  tart || pRangeSt
266e0 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  art->eOperator &
266f0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
26700 20 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70      endEq =   !p
26710 52 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e  RangeEnd || pRan
26720 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72  geEnd->eOperator
26730 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29   & (WO_LE|WO_GE)
26740 3b 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73  ;.    start_cons
26750 74 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65  traints = pRange
26760 53 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a  Start || nEq>0;.
26770 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
26780 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f   index cursor to
26790 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
267a0 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20  e range. */.    
267b0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45  nConstraint = nE
267c0 71 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67  q;.    if( pRang
267d0 65 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20  eStart ){.      
267e0 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
267f0 52 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70  RangeStart->pExp
26800 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20  r->pRight;.     
26810 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
26820 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c  (pParse, pRight,
26830 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
26840 20 20 20 20 20 69 66 28 20 28 70 52 61 6e 67 65       if( (pRange
26850 53 74 61 72 74 2d 3e 77 74 46 6c 61 67 73 20 26  Start->wtFlags &
26860 20 54 45 52 4d 5f 56 4e 55 4c 4c 29 3d 3d 30 20   TERM_VNULL)==0 
26870 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
26880 65 33 45 78 70 72 43 6f 64 65 49 73 4e 75 6c 6c  e3ExprCodeIsNull
26890 4a 75 6d 70 28 76 2c 20 70 52 69 67 68 74 2c 20  Jump(v, pRight, 
268a0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64  regBase+nEq, add
268b0 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rNxt);.      }. 
268c0 20 20 20 20 20 69 66 28 20 7a 53 74 61 72 74 41       if( zStartA
268d0 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ff ){.        if
268e0 28 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  ( sqlite3Compare
268f0 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c  Affinity(pRight,
26900 20 7a 53 74 61 72 74 41 66 66 5b 6e 45 71 5d 29   zStartAff[nEq])
26910 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  ==SQLITE_AFF_NON
26920 45 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  E){.          /*
26930 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
26940 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
26950 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
26960 20 63 6f 6e 76 65 72 73 69 6f 6e 73 0a 20 20 20   conversions.   
26970 20 20 20 20 20 20 20 2a 2a 20 61 70 70 6c 69 65         ** applie
26980 64 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64  d to the operand
26990 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e  s, set the affin
269a0 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20  ity to apply to 
269b0 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20  pRight to .     
269c0 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41       ** SQLITE_A
269d0 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20  FF_NONE.  */.   
269e0 20 20 20 20 20 20 20 7a 53 74 61 72 74 41 66 66         zStartAff
269f0 5b 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41  [nEq] = SQLITE_A
26a00 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20  FF_NONE;.       
26a10 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
26a20 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64 73 4e  qlite3ExprNeedsN
26a30 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65 28  oAffinityChange(
26a40 70 52 69 67 68 74 2c 20 7a 53 74 61 72 74 41 66  pRight, zStartAf
26a50 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20 20 20 20  f[nEq]) ){.     
26a60 20 20 20 20 20 7a 53 74 61 72 74 41 66 66 5b 6e       zStartAff[n
26a70 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  Eq] = SQLITE_AFF
26a80 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d  _NONE;.        }
26a90 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20 20  .      }  .     
26aa0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
26ab0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
26ac0 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 77 74 46  pRangeStart->wtF
26ad0 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54  lags & TERM_VIRT
26ae0 55 41 4c 20 29 3b 20 2f 2a 20 45 56 3a 20 52 2d  UAL ); /* EV: R-
26af0 33 30 35 37 35 2d 31 31 36 36 32 20 2a 2f 0a 20  30575-11662 */. 
26b00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d     }else if( isM
26b10 69 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20  inQuery ){.     
26b20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
26b30 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
26b40 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
26b50 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e        nConstrain
26b60 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74  t++;.      start
26b70 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  Eq = 0;.      st
26b80 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
26b90 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  = 1;.    }.    c
26ba0 6f 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  odeApplyAffinity
26bb0 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65  (pParse, regBase
26bc0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a  , nConstraint, z
26bd0 53 74 61 72 74 41 66 66 29 3b 0a 20 20 20 20 6f  StartAff);.    o
26be0 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74  p = aStartOp[(st
26bf0 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c  art_constraints<
26c00 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c  <2) + (startEq<<
26c10 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20  1) + bRev];.    
26c20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b  assert( op!=0 );
26c30 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
26c40 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a  p==OP_Rewind );.
26c50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
26c60 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20  ==OP_Last );.   
26c70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
26c80 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20  P_SeekGt );.    
26c90 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
26ca0 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74  _SeekGe );.    t
26cb0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
26cc0 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65  SeekLe );.    te
26cd0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
26ce0 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c  eekLt );.    sql
26cf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
26d00 74 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  t(v, op, iIdxCur
26d10 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
26d20 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 29  se, nConstraint)
26d30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
26d40 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
26d50 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
26d60 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
26d70 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
26d80 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
26d90 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
26da0 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
26db0 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
26dc0 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
26dd0 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
26de0 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
26df0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
26e00 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
26e10 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
26e20 45 71 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  Eq, 1);.      sq
26e30 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
26e40 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
26e50 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
26e60 20 20 69 66 28 20 28 70 52 61 6e 67 65 45 6e 64    if( (pRangeEnd
26e70 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
26e80 5f 56 4e 55 4c 4c 29 3d 3d 30 20 29 7b 0a 20 20  _VNULL)==0 ){.  
26e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
26ea0 72 43 6f 64 65 49 73 4e 75 6c 6c 4a 75 6d 70 28  rCodeIsNullJump(
26eb0 76 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  v, pRight, regBa
26ec0 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29  se+nEq, addrNxt)
26ed0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26ee0 69 66 28 20 7a 45 6e 64 41 66 66 20 29 7b 0a 20  if( zEndAff ){. 
26ef0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
26f00 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
26f10 79 28 70 52 69 67 68 74 2c 20 7a 45 6e 64 41 66  y(pRight, zEndAf
26f20 66 5b 6e 45 71 5d 29 3d 3d 53 51 4c 49 54 45 5f  f[nEq])==SQLITE_
26f30 41 46 46 5f 4e 4f 4e 45 29 7b 0a 20 20 20 20 20  AFF_NONE){.     
26f40 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68       /* Since th
26f50 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
26f60 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  to be performed 
26f70 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69  with no conversi
26f80 6f 6e 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ons.          **
26f90 20 61 70 70 6c 69 65 64 20 74 6f 20 74 68 65 20   applied to the 
26fa0 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
26fb0 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
26fc0 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
26fd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53   .          ** S
26fe0 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
26ff0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7a 45   */.          zE
27000 6e 64 41 66 66 5b 6e 45 71 5d 20 3d 20 53 51 4c  ndAff[nEq] = SQL
27010 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
27020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27030 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 4e  if( sqlite3ExprN
27040 65 65 64 73 4e 6f 41 66 66 69 6e 69 74 79 43 68  eedsNoAffinityCh
27050 61 6e 67 65 28 70 52 69 67 68 74 2c 20 7a 45 6e  ange(pRight, zEn
27060 64 41 66 66 5b 6e 45 71 5d 29 20 29 7b 0a 20 20  dAff[nEq]) ){.  
27070 20 20 20 20 20 20 20 20 7a 45 6e 64 41 66 66 5b          zEndAff[
27080 6e 45 71 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46  nEq] = SQLITE_AF
27090 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20  F_NONE;.        
270a0 7d 0a 20 20 20 20 20 20 7d 20 20 0a 20 20 20 20  }.      }  .    
270b0 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69 6e    codeApplyAffin
270c0 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67 42  ity(pParse, regB
270d0 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a 45 6e 64  ase, nEq+1, zEnd
270e0 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
270f0 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20  straint++;.     
27100 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
27110 65 45 6e 64 2d 3e 77 74 46 6c 61 67 73 20 26 20  eEnd->wtFlags & 
27120 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 20  TERM_VIRTUAL ); 
27130 2f 2a 20 45 56 3a 20 52 2d 33 30 35 37 35 2d 31  /* EV: R-30575-1
27140 31 36 36 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  1662 */.    }.  
27150 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
27160 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 53 74 61  pParse->db, zSta
27170 72 74 41 66 66 29 3b 0a 20 20 20 20 73 71 6c 69  rtAff);.    sqli
27180 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65  te3DbFree(pParse
27190 2d 3e 64 62 2c 20 7a 45 6e 64 41 66 66 29 3b 0a  ->db, zEndAff);.
271a0 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 74  .    /* Top of t
271b0 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a  he loop body */.
271c0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
271d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
271e0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 20  entAddr(v);..   
271f0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
27200 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69 73   index cursor is
27210 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
27220 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a 20   the range. */. 
27230 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b 28     op = aEndOp[(
27240 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45 71  pRangeEnd || nEq
27250 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d 3b  ) * (1 + bRev)];
27260 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f  .    testcase( o
27270 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20 20  p==OP_Noop );.  
27280 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
27290 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20 20  OP_IdxGE );.    
272a0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
272b0 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69 66  _IdxLT );.    if
272c0 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ( op!=OP_Noop ){
272d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
272e0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 6f  beAddOp4Int(v, o
272f0 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64 64 72  p, iIdxCur, addr
27300 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20 6e 43  Nxt, regBase, nC
27310 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 20 20  onstraint);.    
27320 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
27330 6e 67 65 50 35 28 76 2c 20 65 6e 64 45 71 21 3d  ngeP5(v, endEq!=
27340 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20 20 20 20  bRev ?1:0);.    
27350 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
27360 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
27370 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 63  y constraints, c
27380 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76 61  heck that the va
27390 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  lue.    ** of th
273a0 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 74  e table column t
273b0 68 61 74 20 74 68 65 20 69 6e 65 71 75 61 6c 69  hat the inequali
273c0 74 79 20 63 6f 6e 74 72 61 69 6e 73 20 69 73 20  ty contrains is 
273d0 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
273e0 20 49 66 20 69 74 20 69 73 2c 20 6a 75 6d 70 20   If it is, jump 
273f0 74 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72  to the next iter
27400 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 6f  ation of the loo
27410 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 31  p..    */.    r1
27420 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
27430 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
27440 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
27450 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
27460 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
27470 49 54 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  IT );.    testca
27480 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
27490 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
274a0 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _TOP_LIMIT );.  
274b0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
274c0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
274d0 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 7c 57  HERE_BTM_LIMIT|W
274e0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 29  HERE_TOP_LIMIT))
274f0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
27500 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
27510 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64  , OP_Column, iId
27520 78 43 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a  xCur, nEq, r1);.
27530 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
27540 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
27550 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f  Null, r1, addrCo
27560 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  nt);.    }.    s
27570 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
27580 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 31 29  pReg(pParse, r1)
27590 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74  ;..    /* Seek t
275a0 68 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c  he table cursor,
275b0 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
275c0 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
275d0 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74  pLevel, pRangeSt
275e0 61 72 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c  art);.    disabl
275f0 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
27600 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66  angeEnd);.    if
27610 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
27620 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67 20        iRowidReg 
27630 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20  = iReleaseReg = 
27640 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
27650 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  g(pParse);.     
27660 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
27670 70 32 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  p2(v, OP_IdxRowi
27680 64 2c 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77  d, iIdxCur, iRow
27690 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
276a0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
276b0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
276c0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
276d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
276e0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
276f0 53 65 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77  Seek, iCur, iRow
27700 69 64 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65  idReg);  /* Defe
27710 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20  rred seek */.   
27720 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72   }..    /* Recor
27730 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  d the instructio
27740 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e  n used to termin
27750 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69  ate the loop. Di
27760 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48  sable .    ** WH
27770 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
27780 20 6d 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20   made redundant 
27790 62 79 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e  by the index ran
277a0 67 65 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a  ge scan..    */.
277b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
277c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
277d0 48 45 52 45 5f 55 4e 49 51 55 45 20 29 7b 0a 20  HERE_UNIQUE ){. 
277e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
277f0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 7d  = OP_Noop;.    }
27800 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
27810 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
27820 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20  p = OP_Prev;.   
27830 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
27840 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
27850 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
27860 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43  evel->p1 = iIdxC
27870 75 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  ur;.  }else..#if
27880 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
27890 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
278a0 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  .  if( pLevel->p
278b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
278c0 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a  ERE_MULTI_OR ){.
278d0 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20      /* Case 4:  
278e0 54 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61  Two or more sepa
278f0 72 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74  rately indexed t
27900 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
27910 79 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20  y OR.    **.    
27920 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20  ** Example:.    
27930 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  **.    **   CREA
27940 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c  TE TABLE t1(a,b,
27950 63 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43  c,d);.    **   C
27960 52 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f  REATE INDEX i1 O
27970 4e 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20  N t1(a);.    ** 
27980 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69    CREATE INDEX i
27990 32 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20  2 ON t1(b);.    
279a0 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45  **   CREATE INDE
279b0 58 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20  X i3 ON t1(c);. 
279c0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53     **.    **   S
279d0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
279e0 57 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37  WHERE a=5 OR b=7
279f0 20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d   OR (c=11 AND d=
27a00 31 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  13).    **.    *
27a10 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  * In the example
27a20 2c 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  , there are thre
27a30 65 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20  e indexed terms 
27a40 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e  connected by OR.
27a50 0a 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20  .    ** The top 
27a60 6f 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b  of the loop look
27a70 73 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  s like this:.   
27a80 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
27a90 20 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31      Null       1
27aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ab0 23 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65  # Zero the rowse
27ac0 74 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a  t in reg 1.    *
27ad0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66  *.    ** Then, f
27ae0 6f 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20  or each indexed 
27af0 74 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  term, the follow
27b00 69 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ing. The argumen
27b10 74 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77  ts to.    ** Row
27b20 53 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68  SetTest are such
27b30 20 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20   that the rowid 
27b40 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
27b50 6f 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20  ow is inserted. 
27b60 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52     ** into the R
27b70 6f 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20  owSet. If it is 
27b80 61 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c  already present,
27b90 20 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74   control skips t
27ba0 68 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20  he.    ** Gosub 
27bb0 6f 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73  opcode and jumps
27bc0 20 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65   straight to the
27bd0 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
27be0 62 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20  by WhereEnd().. 
27bf0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27c00 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
27c10 42 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20  Begin(<term>).  
27c20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f    **          Ro
27c30 77 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20  wSetTest        
27c40 20 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65            # Inse
27c50 72 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f  rt rowid into ro
27c60 77 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  wset.    **     
27c70 20 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20       Gosub      
27c80 32 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  2 A.    **      
27c90 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e    sqlite3WhereEn
27ca0 64 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  d().    **.    *
27cb0 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * Following the 
27cc0 61 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74  above, code to t
27cd0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f  erminate the loo
27ce0 70 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20  p. Label A, the 
27cf0 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66  target.    ** of
27d00 20 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65   the Gosub above
27d10 2c 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69  , jumps to the i
27d20 6e 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74  nstruction right
27d30 20 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e   after the Goto.
27d40 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
27d50 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
27d60 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
27d70 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
27d80 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
27d90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47     **          G
27da0 6f 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20  oto       B     
27db0 20 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65             # The
27dc0 20 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65   loop is finishe
27dd0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
27de0 20 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20         A: <loop 
27df0 62 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20  body>           
27e00 20 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64        # Return d
27e10 61 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20  ata, whatever.. 
27e20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
27e30 20 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20        Return    
27e40 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
27e50 20 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f    # Jump back to
27e60 20 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a   the Gosub.    *
27e70 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42  *.    **       B
27e80 3a 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  : <after the loo
27e90 70 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f  p>.    **.    */
27ea0 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65  .    WhereClause
27eb0 20 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54   *pOrWc;    /* T
27ec0 68 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f  he OR-clause bro
27ed0 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62  ken out into sub
27ee0 74 65 72 6d 73 20 2a 2f 0a 20 20 20 20 53 72 63  terms */.    Src
27ef0 4c 69 73 74 20 2a 70 4f 72 54 61 62 3b 20 20 20  List *pOrTab;   
27f00 20 20 20 20 2f 2a 20 53 68 6f 72 74 65 6e 65 64      /* Shortened
27f10 20 74 61 62 6c 65 20 6c 69 73 74 20 6f 72 20 4f   table list or O
27f20 52 2d 63 6c 61 75 73 65 20 67 65 6e 65 72 61 74  R-clause generat
27f30 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  ion */..    int 
27f40 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70 50  regReturn = ++pP
27f50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20  arse->nMem;     
27f60 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
27f70 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f 47  r used with OP_G
27f80 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74 20  osub */.    int 
27f90 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20 20  regRowset = 0;  
27fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27fb0 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
27fc0 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62 6a  r for RowSet obj
27fd0 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  ect */.    int r
27fe0 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20 20  egRowid = 0;    
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28000 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
28010 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20 2a   holding rowid *
28020 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70 42  /.    int iLoopB
28030 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ody = sqlite3Vdb
28040 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20 20  eMakeLabel(v);  
28050 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f 70  /* Start of loop
28060 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e 74   body */.    int
28070 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20 20   iRetInit;      
28080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28090 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
280a0 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20 69  s of regReturn i
280b0 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75  nit */.    int u
280c0 6e 74 65 73 74 65 64 54 65 72 6d 73 20 3d 20 30  ntestedTerms = 0
280d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
280e0 20 53 6f 6d 65 20 74 65 72 6d 73 20 6e 6f 74 20   Some terms not 
280f0 63 6f 6d 70 6c 65 74 65 6c 79 20 74 65 73 74 65  completely teste
28100 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b  d */.    int ii;
28110 0a 20 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d  .   .    pTerm =
28120 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
28130 70 54 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72  pTerm;.    asser
28140 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20  t( pTerm!=0 );. 
28150 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
28160 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
28170 4f 52 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OR );.    assert
28180 28 20 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  ( (pTerm->wtFlag
28190 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29  s & TERM_ORINFO)
281a0 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63  !=0 );.    pOrWc
281b0 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
281c0 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 4c  Info->wc;.    pL
281d0 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52 65  evel->op = OP_Re
281e0 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  turn;.    pLevel
281f0 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72 6e  ->p1 = regReturn
28200 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70  ;..    /* Set up
28210 20 61 20 6e 65 77 20 53 72 63 4c 69 73 74 20 6e   a new SrcList n
28220 69 20 70 4f 72 54 61 62 20 63 6f 6e 74 61 69 6e  i pOrTab contain
28230 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 62 65  ing the table be
28240 69 6e 67 20 73 63 61 6e 6e 65 64 0a 20 20 20 20  ing scanned.    
28250 2a 2a 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 20  ** by this loop 
28260 69 6e 20 74 68 65 20 61 5b 30 5d 20 73 6c 6f 74  in the a[0] slot
28270 20 61 6e 64 20 61 6c 6c 20 6e 6f 74 52 65 61 64   and all notRead
28280 79 20 74 61 62 6c 65 73 20 69 6e 20 61 5b 31 2e  y tables in a[1.
28290 2e 5d 20 73 6c 6f 74 73 2e 0a 20 20 20 20 2a 2a  .] slots..    **
282a0 20 54 68 69 73 20 62 65 63 6f 6d 65 73 20 74 68   This becomes th
282b0 65 20 53 72 63 4c 69 73 74 20 69 6e 20 74 68 65  e SrcList in the
282c0 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 20   recursive call 
282d0 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  to sqlite3WhereB
282e0 65 67 69 6e 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  egin()..    */. 
282f0 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e 6e     if( pWInfo->n
28300 4c 65 76 65 6c 3e 31 20 29 7b 0a 20 20 20 20 20  Level>1 ){.     
28310 20 69 6e 74 20 6e 4e 6f 74 52 65 61 64 79 3b 20   int nNotReady; 
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28330 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
28340 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65 73   notReady tables
28350 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63 74   */.      struct
28360 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 6f   SrcList_item *o
28370 72 69 67 53 72 63 3b 20 20 20 20 20 2f 2a 20 4f  rigSrc;     /* O
28380 72 69 67 69 6e 61 6c 20 6c 69 73 74 20 6f 66 20  riginal list of 
28390 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20 20  tables */.      
283a0 6e 4e 6f 74 52 65 61 64 79 20 3d 20 70 57 49 6e  nNotReady = pWIn
283b0 66 6f 2d 3e 6e 4c 65 76 65 6c 20 2d 20 69 4c 65  fo->nLevel - iLe
283c0 76 65 6c 20 2d 20 31 3b 0a 20 20 20 20 20 20 70  vel - 1;.      p
283d0 4f 72 54 61 62 20 3d 20 73 71 6c 69 74 65 33 53  OrTab = sqlite3S
283e0 74 61 63 6b 41 6c 6c 6f 63 52 61 77 28 70 50 61  tackAllocRaw(pPa
283f0 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 4f 72       sizeof(*pOr
28420 54 61 62 29 2b 20 6e 4e 6f 74 52 65 61 64 79 2a  Tab)+ nNotReady*
28430 73 69 7a 65 6f 66 28 70 4f 72 54 61 62 2d 3e 61  sizeof(pOrTab->a
28440 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28  [0]));.      if(
28450 20 70 4f 72 54 61 62 3d 3d 30 20 29 20 72 65 74   pOrTab==0 ) ret
28460 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 20 20  urn notReady;.  
28470 20 20 20 20 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c      pOrTab->nAll
28480 6f 63 20 3d 20 28 69 31 36 29 28 6e 4e 6f 74 52  oc = (i16)(nNotR
28490 65 61 64 79 20 2b 20 31 29 3b 0a 20 20 20 20 20  eady + 1);.     
284a0 20 70 4f 72 54 61 62 2d 3e 6e 53 72 63 20 3d 20   pOrTab->nSrc = 
284b0 70 4f 72 54 61 62 2d 3e 6e 41 6c 6c 6f 63 3b 0a  pOrTab->nAlloc;.
284c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 72        memcpy(pOr
284d0 54 61 62 2d 3e 61 2c 20 70 54 61 62 49 74 65 6d  Tab->a, pTabItem
284e0 2c 20 73 69 7a 65 6f 66 28 2a 70 54 61 62 49 74  , sizeof(*pTabIt
284f0 65 6d 29 29 3b 0a 20 20 20 20 20 20 6f 72 69 67  em));.      orig
28500 53 72 63 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54  Src = pWInfo->pT
28510 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20  abList->a;.     
28520 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 3d 6e 4e 6f   for(k=1; k<=nNo
28530 74 52 65 61 64 79 3b 20 6b 2b 2b 29 7b 0a 20 20  tReady; k++){.  
28540 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4f        memcpy(&pO
28550 72 54 61 62 2d 3e 61 5b 6b 5d 2c 20 26 6f 72 69  rTab->a[k], &ori
28560 67 53 72 63 5b 70 4c 65 76 65 6c 5b 6b 5d 2e 69  gSrc[pLevel[k].i
28570 46 72 6f 6d 5d 2c 20 73 69 7a 65 6f 66 28 70 4f  From], sizeof(pO
28580 72 54 61 62 2d 3e 61 5b 6b 5d 29 29 3b 0a 20 20  rTab->a[k]));.  
28590 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
285a0 0a 20 20 20 20 20 20 70 4f 72 54 61 62 20 3d 20  .      pOrTab = 
285b0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
285c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
285d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72  Initialize the r
285e0 6f 77 73 65 74 20 72 65 67 69 73 74 65 72 20 74  owset register t
285f0 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 2e 20  o contain NULL. 
28600 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69 73 20 0a  An SQL NULL is .
28610 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
28620 74 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 72 6f  t to an empty ro
28630 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  wset..    **.   
28640 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74 69 61 6c   ** Also initial
28650 69 7a 65 20 72 65 67 52 65 74 75 72 6e 20 74 6f  ize regReturn to
28660 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 61 64 64   contain the add
28670 72 65 73 73 20 6f 66 20 74 68 65 20 69 6e 73 74  ress of the inst
28680 72 75 63 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20  ruction .    ** 
28690 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
286a0 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f 52 65 74  owing the OP_Ret
286b0 75 72 6e 20 61 74 20 74 68 65 20 62 6f 74 74 6f  urn at the botto
286c0 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 54  m of the loop. T
286d0 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 72 65  his.    ** is re
286e0 71 75 69 72 65 64 20 69 6e 20 61 20 66 65 77 20  quired in a few 
286f0 6f 62 73 63 75 72 65 20 4c 45 46 54 20 4a 4f 49  obscure LEFT JOI
28700 4e 20 63 61 73 65 73 20 77 68 65 72 65 20 63 6f  N cases where co
28710 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20 20 20 20  ntrol jumps.    
28720 2a 2a 20 6f 76 65 72 20 74 68 65 20 74 6f 70 20  ** over the top 
28730 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69 6e 74 6f  of the loop into
28740 20 74 68 65 20 62 6f 64 79 20 6f 66 20 69 74 2e   the body of it.
28750 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
28760 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 63  e .    ** correc
28770 74 20 72 65 73 70 6f 6e 73 65 20 66 6f 72 20 74  t response for t
28780 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f 70 20 63  he end-of-loop c
28790 6f 64 65 20 28 74 68 65 20 4f 50 5f 52 65 74 75  ode (the OP_Retu
287a0 72 6e 29 20 69 73 20 74 6f 20 0a 20 20 20 20 2a  rn) is to .    *
287b0 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 74  * fall through t
287c0 6f 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  o the next instr
287d0 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20 61 73 20  uction, just as 
287e0 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f 65 73 20  an OP_Next does 
287f0 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  if.    ** called
28800 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c   on an uninitial
28810 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a 20 20 20  ized cursor..   
28820 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74   */.    if( (wct
28830 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
28840 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
28850 30 20 29 7b 0a 20 20 20 20 20 20 72 65 67 52 6f  0 ){.      regRo
28860 77 73 65 74 20 3d 20 2b 2b 70 50 61 72 73 65 2d  wset = ++pParse-
28870 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 72 65 67  >nMem;.      reg
28880 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61 72 73 65  Rowid = ++pParse
28890 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73 71  ->nMem;.      sq
288a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
288b0 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72  v, OP_Null, 0, r
288c0 65 67 52 6f 77 73 65 74 29 3b 0a 20 20 20 20 7d  egRowset);.    }
288d0 0a 20 20 20 20 69 52 65 74 49 6e 69 74 20 3d 20  .    iRetInit = 
288e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
288f0 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
28900 20 30 2c 20 72 65 67 52 65 74 75 72 6e 29 3b 0a   0, regReturn);.
28910 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  .    for(ii=0; i
28920 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3b 20  i<pOrWc->nTerm; 
28930 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65  ii++){.      Whe
28940 72 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 20  reTerm *pOrTerm 
28950 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69 69 5d 3b  = &pOrWc->a[ii];
28960 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54 65  .      if( pOrTe
28970 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
28980 69 43 75 72 20 7c 7c 20 70 4f 72 54 65 72 6d 2d  iCur || pOrTerm-
28990 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41  >eOperator==WO_A
289a0 4e 44 20 29 7b 0a 20 20 20 20 20 20 20 20 57 68  ND ){.        Wh
289b0 65 72 65 49 6e 66 6f 20 2a 70 53 75 62 57 49 6e  ereInfo *pSubWIn
289c0 66 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  fo;          /* 
289d0 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67 6c 65 20  Info for single 
289e0 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20 2a 2f 0a  OR-term scan */.
289f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
28a00 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
28a10 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
28a20 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
28a30 2f 0a 20 20 20 20 20 20 20 20 70 53 75 62 57 49  /.        pSubWI
28a40 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 57 68 65  nfo = sqlite3Whe
28a50 72 65 42 65 67 69 6e 28 70 50 61 72 73 65 2c 20  reBegin(pParse, 
28a60 70 4f 72 54 61 62 2c 20 70 4f 72 54 65 72 6d 2d  pOrTab, pOrTerm-
28a70 3e 70 45 78 70 72 2c 20 30 2c 20 30 2c 0a 20 20  >pExpr, 0, 0,.  
28a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a90 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49 54        WHERE_OMIT
28aa0 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f 4d  _OPEN | WHERE_OM
28ab0 49 54 5f 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  IT_CLOSE |.     
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54     WHERE_FORCE_T
28ae0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 4e 45  ABLE | WHERE_ONE
28af0 54 41 42 4c 45 5f 4f 4e 4c 59 29 3b 0a 20 20 20  TABLE_ONLY);.   
28b00 20 20 20 20 20 69 66 28 20 70 53 75 62 57 49 6e       if( pSubWIn
28b10 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  fo ){.          
28b20 65 78 70 6c 61 69 6e 4f 6e 65 53 63 61 6e 28 0a  explainOneScan(.
28b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
28b40 61 72 73 65 2c 20 70 4f 72 54 61 62 2c 20 26 70  arse, pOrTab, &p
28b50 53 75 62 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2c 20  SubWInfo->a[0], 
28b60 69 4c 65 76 65 6c 2c 20 70 4c 65 76 65 6c 2d 3e  iLevel, pLevel->
28b70 69 46 72 6f 6d 2c 20 30 0a 20 20 20 20 20 20 20  iFrom, 0.       
28b80 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
28b90 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
28ba0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
28bb0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
28bc0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65           int iSe
28bd0 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72 57 63 2d  t = ((ii==pOrWc-
28be0 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a 69 69 29  >nTerm-1)?-1:ii)
28bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
28c00 74 20 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t r;.           
28c10 20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72   r = sqlite3Expr
28c20 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 28 70 50  CodeGetColumn(pP
28c30 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
28c40 70 54 61 62 2c 20 2d 31 2c 20 69 43 75 72 2c 20  pTab, -1, iCur, 
28c50 0a 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 20 20 20 20 20 20 72 65 67 52 6f 77            regRow
28c80 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
28c90 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28ca0 70 34 49 6e 74 28 76 2c 20 4f 50 5f 52 6f 77 53  p4Int(v, OP_RowS
28cb0 65 74 54 65 73 74 2c 20 72 65 67 52 6f 77 73 65  etTest, regRowse
28cc0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
28cf0 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
28d00 20 72 2c 20 69 53 65 74 29 3b 0a 20 20 20 20 20   r, iSet);.     
28d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
28d20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28d30 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
28d40 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
28d50 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
28d60 20 20 2f 2a 20 54 68 65 20 70 53 75 62 57 49 6e    /* The pSubWIn
28d70 66 6f 2d 3e 75 6e 74 65 73 74 65 64 54 65 72 6d  fo->untestedTerm
28d80 73 20 66 6c 61 67 20 6d 65 61 6e 73 20 74 68 61  s flag means tha
28d90 74 20 74 68 69 73 20 4f 52 20 74 65 72 6d 0a 20  t this OR term. 
28da0 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
28db0 61 69 6e 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72  ained one or mor
28dc0 65 20 41 4e 44 20 74 65 72 6d 20 66 72 6f 6d 20  e AND term from 
28dd0 61 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c 65  a notReady table
28de0 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 20  .  The.         
28df0 20 2a 2a 20 74 65 72 6d 73 20 66 72 6f 6d 20 74   ** terms from t
28e00 68 65 20 6e 6f 74 52 65 61 64 79 20 74 61 62 6c  he notReady tabl
28e10 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 74  e could not be t
28e20 65 73 74 65 64 20 61 6e 64 20 77 69 6c 6c 0a 20  ested and will. 
28e30 20 20 20 20 20 20 20 20 20 2a 2a 20 6e 65 65 64           ** need
28e40 20 74 6f 20 62 65 20 74 65 73 74 65 64 20 6c 61   to be tested la
28e50 74 65 72 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ter..          *
28e60 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
28e70 70 53 75 62 57 49 6e 66 6f 2d 3e 75 6e 74 65 73  pSubWInfo->untes
28e80 74 65 64 54 65 72 6d 73 20 29 20 75 6e 74 65 73  tedTerms ) untes
28e90 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 0a 20  tedTerms = 1;.. 
28ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
28eb0 73 68 20 74 68 65 20 6c 6f 6f 70 20 74 68 72 6f  sh the loop thro
28ec0 75 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65  ugh table entrie
28ed0 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72  s that match ter
28ee0 6d 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20  m pOrTerm. */.  
28ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
28f00 68 65 72 65 45 6e 64 28 70 53 75 62 57 49 6e 66  hereEnd(pSubWInf
28f10 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
28f20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28f30 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
28f40 65 50 31 28 76 2c 20 69 52 65 74 49 6e 69 74 2c  eP1(v, iRetInit,
28f50 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
28f60 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20  entAddr(v));.   
28f70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
28f80 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
28f90 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
28fa0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
28fb0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
28fc0 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
28fd0 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d 3e      if( pWInfo->
28fe0 6e 4c 65 76 65 6c 3e 31 20 29 20 73 71 6c 69 74  nLevel>1 ) sqlit
28ff0 65 33 53 74 61 63 6b 46 72 65 65 28 70 50 61 72  e3StackFree(pPar
29000 73 65 2d 3e 64 62 2c 20 70 4f 72 54 61 62 29 3b  se->db, pOrTab);
29010 0a 20 20 20 20 69 66 28 20 21 75 6e 74 65 73 74  .    if( !untest
29020 65 64 54 65 72 6d 73 20 29 20 64 69 73 61 62 6c  edTerms ) disabl
29030 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54  eTerm(pLevel, pT
29040 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  erm);.  }else.#e
29050 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
29060 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
29070 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20  ION */..  {.    
29080 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
29090 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
290a0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
290b0 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
290c0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61   **          sca
290d0 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  n of the entire 
290e0 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  table..    */.  
290f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
29100 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50  8 aStep[] = { OP
29110 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d  _Next, OP_Prev }
29120 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  ;.    static con
29130 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d 20 3d  st u8 aStart[] =
29140 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50   { OP_Rewind, OP
29150 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61 73 73  _Last };.    ass
29160 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20  ert( bRev==0 || 
29170 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61  bRev==1 );.    a
29180 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
29190 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65 76 65  ==0 );.    pLeve
291a0 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b 62 52  l->op = aStep[bR
291b0 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ev];.    pLevel-
291c0 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
291d0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b  pLevel->p2 = 1 +
291e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
291f0 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62 52 65  p2(v, aStart[bRe
29200 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  v], iCur, addrBr
29210 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  k);.    pLevel->
29220 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54  p5 = SQLITE_STMT
29230 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f  STATUS_FULLSCAN_
29240 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52  STEP;.  }.  notR
29250 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b  eady &= ~getMask
29260 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20  (pWC->pMaskSet, 
29270 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73  iCur);..  /* Ins
29280 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
29290 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
292a0 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
292b0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a   completely.  **
292c0 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e 67 20   computed using 
292d0 74 68 65 20 63 75 72 72 65 6e 74 20 73 65 74 20  the current set 
292e0 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a  of tables..  **.
292f0 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
29300 49 4f 4e 2d 4f 46 3a 20 52 2d 34 39 35 32 35 2d  ION-OF: R-49525-
29310 35 30 39 33 35 20 54 65 72 6d 73 20 74 68 61 74  50935 Terms that
29320 20 63 61 6e 6e 6f 74 20 62 65 20 73 61 74 69 73   cannot be satis
29330 66 69 65 64 20 74 68 72 6f 75 67 68 0a 20 20 2a  fied through.  *
29340 2a 20 74 68 65 20 75 73 65 20 6f 66 20 69 6e 64  * the use of ind
29350 69 63 65 73 20 62 65 63 6f 6d 65 20 74 65 73 74  ices become test
29360 73 20 74 68 61 74 20 61 72 65 20 65 76 61 6c 75  s that are evalu
29370 61 74 65 64 20 61 67 61 69 6e 73 74 20 65 61 63  ated against eac
29380 68 20 72 6f 77 20 6f 66 0a 20 20 2a 2a 20 74 68  h row of.  ** th
29390 65 20 72 65 6c 65 76 61 6e 74 20 69 6e 70 75 74  e relevant input
293a0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
293b0 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
293c0 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
293d0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
293e0 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
293f0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
29400 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
29410 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
29420 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 30 35 37 35   /* IMP: R-30575
29430 2d 31 31 36 36 32 20 2a 2f 0a 20 20 20 20 74 65  -11662 */.    te
29440 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
29450 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
29460 44 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  DED );.    if( p
29470 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
29480 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45  (TERM_VIRTUAL|TE
29490 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74  RM_CODED) ) cont
294a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
294b0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
294c0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
294d0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
294e0 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
294f0 65 64 54 65 72 6d 73 3d 3d 30 0a 20 20 20 20 20  edTerms==0.     
29500 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 57            && (pW
29510 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
29520 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c   & WHERE_ONETABL
29530 45 5f 4f 4e 4c 59 29 21 3d 30 20 29 3b 0a 20 20  E_ONLY)!=0 );.  
29540 20 20 20 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65      pWInfo->unte
29550 73 74 65 64 54 65 72 6d 73 20 3d 20 31 3b 0a 20  stedTerms = 1;. 
29560 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
29570 20 20 20 7d 0a 20 20 20 20 70 45 20 3d 20 70 54     }.    pE = pT
29580 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
29590 61 73 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b  assert( pE!=0 );
295a0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
295b0 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
295c0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
295d0 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
295e0 29 7b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  ){.      continu
295f0 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  e;.    }.    sql
29600 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
29610 70 50 61 72 73 65 2c 20 70 45 2c 20 61 64 64 72  pParse, pE, addr
29620 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  Cont, SQLITE_JUM
29630 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 54  PIFNULL);.    pT
29640 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
29650 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
29660 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
29670 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
29680 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
29690 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
296a0 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
296b0 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
296c0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
296d0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
296e0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
296f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
29700 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
29710 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
29720 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
29730 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
29740 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
29750 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
29760 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
29770 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
29780 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
29790 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
297a0 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
297b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
297c0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
297d0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
297e0 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
297f0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
29800 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
29810 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
29820 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
29830 49 52 54 55 41 4c 20 29 3b 20 20 2f 2a 20 49 4d  IRTUAL );  /* IM
29840 50 3a 20 52 2d 33 30 35 37 35 2d 31 31 36 36 32  P: R-30575-11662
29850 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
29860 73 65 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61  se( pTerm->wtFla
29870 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20  gs & TERM_CODED 
29880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  );.      if( pTe
29890 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54  rm->wtFlags & (T
298a0 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d  ERM_VIRTUAL|TERM
298b0 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e  _CODED) ) contin
298c0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  ue;.      if( (p
298d0 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
298e0 26 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29  & notReady)!=0 )
298f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
29900 28 20 70 57 49 6e 66 6f 2d 3e 75 6e 74 65 73 74  ( pWInfo->untest
29910 65 64 54 65 72 6d 73 20 29 3b 0a 20 20 20 20 20  edTerms );.     
29920 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
29930 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
29940 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20  t( pTerm->pExpr 
29950 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
29960 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
29970 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  se, pTerm->pExpr
29980 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49  , addrCont, SQLI
29990 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
299a0 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
299b0 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
299c0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
299d0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
299e0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69 52  mpReg(pParse, iR
299f0 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20 72  eleaseReg);..  r
29a00 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b 0a  eturn notReady;.
29a10 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
29a20 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
29a30 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
29a40 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
29a50 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
29a60 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
29a70 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
29a80 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
29a90 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
29aa0 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
29ab0 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
29ac0 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
29ad0 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
29ae0 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
29af0 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
29b00 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
29b10 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
29b20 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
29b30 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
29b40 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
29b50 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
29b60 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
29b70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
29b80 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
29b90 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
29ba0 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
29bb0 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
29bc0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
29bd0 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
29be0 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
29bf0 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
29c00 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68 65  sqlite3 *db, Whe
29c10 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29 7b  reInfo *pWInfo){
29c20 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 57  .  if( ALWAYS(pW
29c30 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 69 6e 74  Info) ){.    int
29c40 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
29c50 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65   i<pWInfo->nLeve
29c60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
29c70 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
29c80 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66  o *pInfo = pWInf
29c90 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
29ca0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 66  ;.      if( pInf
29cb0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  o ){.        /* 
29cc0 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 6e  assert( pInfo->n
29cd0 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 3d  eedToFreeIdxStr=
29ce0 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
29cf0 46 61 69 6c 65 64 20 29 3b 20 2a 2f 0a 20 20 20  Failed ); */.   
29d00 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e       if( pInfo->
29d10 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
29d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
29d30 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 66 6f  lite3_free(pInfo
29d40 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
29d50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
29d60 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
29d70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Info);.      }. 
29d80 20 20 20 20 20 69 66 28 20 70 57 49 6e 66 6f 2d       if( pWInfo-
29d90 3e 61 5b 69 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61  >a[i].plan.wsFla
29da0 67 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50 5f  gs & WHERE_TEMP_
29db0 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 20 20 20  INDEX ){.       
29dc0 20 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70   Index *pIdx = p
29dd0 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 6c 61 6e  WInfo->a[i].plan
29de0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 20  .u.pIdx;.       
29df0 20 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20   if( pIdx ){.   
29e00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
29e10 46 72 65 65 28 64 62 2c 20 70 49 64 78 2d 3e 7a  Free(db, pIdx->z
29e20 43 6f 6c 41 66 66 29 3b 0a 20 20 20 20 20 20 20  ColAff);.       
29e30 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
29e40 28 64 62 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  (db, pIdx);.    
29e50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29e60 20 20 7d 0a 20 20 20 20 77 68 65 72 65 43 6c 61    }.    whereCla
29e70 75 73 65 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d  useClear(pWInfo-
29e80 3e 70 57 43 29 3b 0a 20 20 20 20 73 71 6c 69 74  >pWC);.    sqlit
29e90 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 57 49  e3DbFree(db, pWI
29ea0 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  nfo);.  }.}.../*
29eb0 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65  .** Generate the
29ec0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
29ed0 65 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20  e loop used for 
29ee0 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f  WHERE clause pro
29ef0 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20  cessing..** The 
29f00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
29f10 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
29f20 6f 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65  opaque structure
29f30 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
29f40 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65  * information ne
29f50 65 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  eded to terminat
29f60 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74  e the loop.  Lat
29f70 65 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  er, the calling 
29f80 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c  routine.** shoul
29f90 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  d invoke sqlite3
29fa0 57 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20  WhereEnd() with 
29fb0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
29fc0 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
29fd0 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  n.** in order to
29fe0 20 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48   complete the WH
29ff0 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
2a000 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssing..**.** If 
2a010 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2a020 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
2a030 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  turns NULL..**.*
2a040 2a 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61  * The basic idea
2a050 20 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74   is to do a nest
2a060 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f  ed loop, one loo
2a070 70 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65  p for each table
2a080 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20   in.** the FROM 
2a090 63 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65  clause of a sele
2a0a0 63 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64  ct.  (INSERT and
2a0b0 20 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e   UPDATE statemen
2a0c0 74 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61  ts are the.** sa
2a0d0 6d 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77  me as a SELECT w
2a0e0 69 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ith only a singl
2a0f0 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  e table in the F
2a100 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f  ROM clause.)  Fo
2a110 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66  r.** example, if
2a120 20 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73   the SQL is this
2a130 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45  :.**.**       SE
2a140 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
2a150 74 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e  t2, t3 WHERE ...
2a160 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65  ;.**.** Then the
2a170 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
2a180 69 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20  is conceptually 
2a190 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69  like the followi
2a1a0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66  ng:.**.**      f
2a1b0 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
2a1c0 31 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20  1 do       \    
2a1d0 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2a1e0 2a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68  *        foreach
2a1f0 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20   row2 in t2 do  
2a200 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2a210 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a  e3WhereBegin().*
2a220 2a 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61  *          forea
2a230 63 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f  ch row3 in t3 do
2a240 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20     /.**         
2a250 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
2a260 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
2a270 20 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20             \    
2a280 43 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a  Code generated.*
2a290 2a 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20  *        end    
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74      |-- by sqlit
2a2c0 65 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20  e3WhereEnd().** 
2a2d0 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20       end        
2a2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2f0 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68   /.**.** Note th
2a300 61 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67  at the loops mig
2a310 68 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64  ht not be nested
2a320 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e   in the order in
2a330 20 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61   which they.** a
2a340 70 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f  ppear in the FRO
2a350 4d 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69  M clause if a di
2a360 66 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73  fferent order is
2a370 20 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20   better able to 
2a380 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69  make.** use of i
2a390 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c  ndices.  Note al
2a3a0 73 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65  so that when the
2a3b0 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70   IN operator app
2a3c0 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57  ears in.** the W
2a3d0 48 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20  HERE clause, it 
2a3e0 6d 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20  might result in 
2a3f0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65  additional neste
2a400 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73  d loops for.** s
2a410 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20  canning through 
2a420 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68  all values on th
2a430 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
2a440 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a  e of the IN..**.
2a450 2a 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72  ** There are Btr
2a460 65 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63  ee cursors assoc
2a470 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20  iated with each 
2a480 74 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20  table.  t1 uses 
2a490 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
2a4a0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
2a4b0 69 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65  iCursor.  t2 use
2a4c0 73 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61  s the cursor pTa
2a4d0 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72  bList->a[1].iCur
2a4e0 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66  sor..** And so f
2a4f0 6f 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74  orth.  This rout
2a500 69 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ine generates co
2a510 64 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65  de to open those
2a520 20 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a   VDBE cursors.**
2a530 20 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72   and sqlite3Wher
2a540 65 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73  eEnd() generates
2a550 20 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f   the code to clo
2a560 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54  se them..**.** T
2a570 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c  he code that sql
2a580 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29  ite3WhereBegin()
2a590 20 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65   generates leave
2a5a0 73 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61  s the cursors na
2a5b0 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69  med.** in pTabLi
2a5c0 73 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  st pointing at t
2a5d0 68 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65  heir appropriate
2a5e0 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b   entries.  The [
2a5f0 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e  ...] code.** can
2a600 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61   use OP_Column a
2a610 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f  nd OP_Rowid opco
2a620 64 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72  des on these cur
2a630 73 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a  sors to extract.
2a640 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
2a650 20 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20   various tables 
2a660 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  of the loop..**.
2a670 2a 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20  ** If the WHERE 
2a680 63 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c  clause is empty,
2a690 20 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f   the foreach loo
2a6a0 70 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61  ps must each sca
2a6b0 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72  n their.** entir
2a6c0 65 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20  e tables.  Thus 
2a6d0 61 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e  a three-way join
2a6e0 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70   is an O(N^3) op
2a6f0 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66  eration.  But if
2a700 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68  .** the tables h
2a710 61 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20  ave indices and 
2a720 74 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20  there are terms 
2a730 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
2a740 75 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65  use that.** refe
2a750 72 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63  r to those indic
2a760 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74  es, a complete t
2a770 61 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65  able scan can be
2a780 20 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65   avoided and the
2a790 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75  .** code will ru
2a7a0 6e 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20  n much faster.  
2a7b0 4d 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b  Most of the work
2a7c0 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   of this routine
2a7d0 20 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20   is checking.** 
2a7e0 74 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20  to see if there 
2a7f0 61 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74  are indices that
2a800 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
2a810 73 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f  speed up the loo
2a820 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f  p..**.** Terms o
2a830 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2a840 73 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64  se are also used
2a850 20 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20   to limit which 
2a860 72 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a  rows actually.**
2a870 20 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20   make it to the 
2a880 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64  "..." in the mid
2a890 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  dle of the loop.
2a8a0 20 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f    After each "fo
2a8b0 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73  reach",.** terms
2a8c0 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
2a8d0 61 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e  ause that use on
2a8e0 6c 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74  ly terms in that
2a8f0 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a   loop and outer.
2a900 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61  ** loops are eva
2a910 6c 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61  luated and if fa
2a920 6c 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  lse a jump is ma
2a930 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75  de around all su
2a940 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65  bsequent.** inne
2a950 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75  r loops (or arou
2a960 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20  nd the "..." if 
2a970 74 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20  the test occurs 
2a980 77 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72  within the inner
2a990 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a  -.** most loop).
2a9a0 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e  **.** OUTER JOIN
2a9b0 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72  S.**.** An outer
2a9c0 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20   join of tables 
2a9d0 74 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e  t1 and t2 is con
2a9e0 63 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61  ceptally coded a
2a9f0 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2aa00 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
2aa10 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20   in t1 do.**    
2aa20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20    flag = 0.**   
2aa30 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
2aa40 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20  in t2 do.**     
2aa50 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20     start:.**    
2aa60 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
2aa70 20 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a        flag = 1.*
2aa80 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20  *      end.**   
2aa90 20 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68     if flag==0 th
2aaa0 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76  en.**        mov
2aab0 65 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f  e the row2 curso
2aac0 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a  r to a null row.
2aad0 2a 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  **        goto s
2aae0 74 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a  tart.**      fi.
2aaf0 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20  **    end.**.** 
2ab00 4f 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20  ORDER BY CLAUSE 
2ab10 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a  PROCESSING.**.**
2ab20 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61   *ppOrderBy is a
2ab30 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2ab40 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
2ab50 6f 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74  of a SELECT stat
2ab60 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65  ement,.** if the
2ab70 72 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74  re is one.  If t
2ab80 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
2ab90 20 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66   BY clause or if
2aba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
2abb0 20 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20   is called from 
2abc0 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  an UPDATE or DEL
2abd0 45 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  ETE statement, t
2abe0 68 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73  hen ppOrderBy is
2abf0 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
2ac00 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20  an index can be 
2ac10 75 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  used so that the
2ac20 20 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20   natural output 
2ac30 6f 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62  order of the tab
2ac40 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f  le.** scan is co
2ac50 72 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52  rrect for the OR
2ac60 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
2ac70 68 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69  hen that index i
2ac80 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70  s used and.** *p
2ac90 70 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20  pOrderBy is set 
2aca0 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69  to NULL.  This i
2acb0 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
2acc0 6e 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20  n that prevents 
2acd0 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72  an.** unnecessar
2ace0 79 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65  y sort of the re
2acf0 73 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69  sult set if an i
2ad00 6e 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65  ndex appropriate
2ad10 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45   for the.** ORDE
2ad20 52 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65  R BY clause alre
2ad30 61 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a  ady exists..**.*
2ad40 2a 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63  * If the where c
2ad50 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e  lause loops cann
2ad60 6f 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74  ot be arranged t
2ad70 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f  o provide the co
2ad80 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20  rrect.** output 
2ad90 6f 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20  order, then the 
2ada0 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e  *ppOrderBy is un
2adb0 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72  changed..*/.Wher
2adc0 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68  eInfo *sqlite3Wh
2add0 65 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73  ereBegin(.  Pars
2ade0 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
2adf0 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
2ae00 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
2ae10 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20  List *pTabList, 
2ae20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20     /* A list of 
2ae30 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65  all tables to be
2ae40 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78   scanned */.  Ex
2ae50 70 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20  pr *pWhere,     
2ae60 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
2ae70 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
2ae80 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42  rList **ppOrderB
2ae90 79 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42  y, /* An ORDER B
2aea0 59 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c  Y clause, or NUL
2aeb0 4c 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  L */.  ExprList 
2aec0 2a 70 44 69 73 74 69 6e 63 74 2c 20 20 2f 2a 20  *pDistinct,  /* 
2aed0 54 68 65 20 73 65 6c 65 63 74 2d 6c 69 73 74 20  The select-list 
2aee0 66 6f 72 20 44 49 53 54 49 4e 43 54 20 71 75 65  for DISTINCT que
2aef0 72 69 65 73 20 2d 20 6f 72 20 4e 55 4c 4c 20 2a  ries - or NULL *
2af00 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
2af10 67 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs        /* One
2af20 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
2af30 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
2af40 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
2af50 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
2af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af70 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
2af80 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  */.  int nByteWI
2af90 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
2afa0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
2afb0 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
2afc0 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
2afd0 20 20 69 6e 74 20 6e 54 61 62 4c 69 73 74 3b 20    int nTabList; 
2afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aff0 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e  Number of elemen
2b000 74 73 20 69 6e 20 70 54 61 62 4c 69 73 74 20 2a  ts in pTabList *
2b010 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
2b020 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
2b030 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
2b040 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
2b050 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
2b060 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
2b070 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
2b080 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
2b090 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
2b0a0 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
2b0b0 65 61 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f  eady;          /
2b0c0 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74 20 61  * Cursors that a
2b0d0 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74  re not yet posit
2b0e0 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  ioned */.  Where
2b0f0 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2b100 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  t;    /* The exp
2b110 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
2b120 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
2b130 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20  e *pWC;         
2b140 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f        /* Decompo
2b150 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48  sition of the WH
2b160 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
2b170 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2b180 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
2b190 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72  /* A single entr
2b1a0 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20  y from pTabList 
2b1b0 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
2b1c0 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
2b1d0 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
2b1e0 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57   level in the pW
2b1f0 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69  Info list */.  i
2b200 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20  nt iFrom;       
2b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b220 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46  * First unused F
2b230 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
2b240 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46  nt */.  int andF
2b250 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
2b260 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d     /* AND-ed com
2b270 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  bination of all 
2b280 70 57 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73  pWC->a[].wtFlags
2b290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
2b2a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
2b2b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
2b2c0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a  nection */..  /*
2b2d0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   The number of t
2b2e0 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
2b2f0 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
2b300 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
2b310 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
2b320 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
2b330 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 70 54  /.  testcase( pT
2b340 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 42 4d  abList->nSrc==BM
2b350 53 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 4c  S );.  if( pTabL
2b360 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b  ist->nSrc>BMS ){
2b370 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
2b380 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74  rMsg(pParse, "at
2b390 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20   most %d tables 
2b3a0 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29  in a join", BMS)
2b3b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
2b3c0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66    }..  /* This f
2b3d0 75 6e 63 74 69 6f 6e 20 6e 6f 72 6d 61 6c 6c 79  unction normally
2b3e0 20 67 65 6e 65 72 61 74 65 73 20 61 20 6e 65 73   generates a nes
2b3f0 74 65 64 20 6c 6f 6f 70 20 66 6f 72 20 61 6c 6c  ted loop for all
2b400 20 74 61 62 6c 65 73 20 69 6e 20 0a 20 20 2a 2a   tables in .  **
2b410 20 70 54 61 62 4c 69 73 74 2e 20 20 42 75 74 20   pTabList.  But 
2b420 69 66 20 74 68 65 20 57 48 45 52 45 5f 4f 4e 45  if the WHERE_ONE
2b430 54 41 42 4c 45 5f 4f 4e 4c 59 20 66 6c 61 67 20  TABLE_ONLY flag 
2b440 69 73 20 73 65 74 2c 20 74 68 65 6e 20 77 65 20  is set, then we 
2b450 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6f 6e 6c 79  should.  ** only
2b460 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   generate code f
2b470 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 61 62  or the first tab
2b480 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 20 61  le in pTabList a
2b490 6e 64 20 61 73 73 75 6d 65 20 74 68 61 74 0a 20  nd assume that. 
2b4a0 20 2a 2a 20 61 6e 79 20 63 75 72 73 6f 72 73 20   ** any cursors 
2b4b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b4c0 73 75 62 73 65 71 75 65 6e 74 20 74 61 62 6c 65  subsequent table
2b4d0 73 20 61 72 65 20 75 6e 69 6e 69 74 69 61 6c 69  s are uninitiali
2b4e0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 6e 54 61 62  zed..  */.  nTab
2b4f0 4c 69 73 74 20 3d 20 28 77 63 74 72 6c 46 6c 61  List = (wctrlFla
2b500 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 54 41  gs & WHERE_ONETA
2b510 42 4c 45 5f 4f 4e 4c 59 29 20 3f 20 31 20 3a 20  BLE_ONLY) ? 1 : 
2b520 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
2b530 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
2b540 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
2b550 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
2b560 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20  cture that will 
2b570 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20  become the.  ** 
2b580 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20  return value. A 
2b590 73 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f  single allocatio
2b5a0 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f  n is used to sto
2b5b0 72 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  re the WhereInfo
2b5c0 0a 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68  .  ** struct, th
2b5d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68  e contents of Wh
2b5e0 65 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65  ereInfo.a[], the
2b5f0 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
2b600 75 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20  ucture.  ** and 
2b610 74 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74  the WhereMaskSet
2b620 20 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63   structure. Sinc
2b630 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f  e WhereClause co
2b640 6e 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65  ntains an 8-byte
2b650 0a 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70  .  ** field (typ
2b660 65 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75  e Bitmask) it mu
2b670 73 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e  st be aligned on
2b680 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
2b690 61 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65  ary on.  ** some
2b6a0 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20   architectures. 
2b6b0 48 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38  Hence the ROUND8
2b6c0 28 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20  () below..  */. 
2b6d0 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
2b6e0 3b 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d  ;.  nByteWInfo =
2b6f0 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57   ROUND8(sizeof(W
2b700 68 65 72 65 49 6e 66 6f 29 2b 28 6e 54 61 62 4c  hereInfo)+(nTabL
2b710 69 73 74 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68  ist-1)*sizeof(Wh
2b720 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57  ereLevel));.  pW
2b730 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
2b740 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a  MallocZero(db, .
2b750 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e 66 6f        nByteWInfo
2b760 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   + .      sizeof
2b770 28 57 68 65 72 65 43 6c 61 75 73 65 29 20 2b 0a  (WhereClause) +.
2b780 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68 65        sizeof(Whe
2b790 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a  reMaskSet).  );.
2b7a0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
2b7b0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71  Failed ){.    sq
2b7c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
2b7d0 70 57 49 6e 66 6f 29 3b 0a 20 20 20 20 70 57 49  pWInfo);.    pWI
2b7e0 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74  nfo = 0;.    got
2b7f0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
2b800 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  r;.  }.  pWInfo-
2b810 3e 6e 4c 65 76 65 6c 20 3d 20 6e 54 61 62 4c 69  >nLevel = nTabLi
2b820 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50  st;.  pWInfo->pP
2b830 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2b840 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73   pWInfo->pTabLis
2b850 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20  t = pTabList;.  
2b860 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d  pWInfo->iBreak =
2b870 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
2b880 4c 61 62 65 6c 28 76 29 3b 0a 20 20 70 57 49 6e  Label(v);.  pWIn
2b890 66 6f 2d 3e 70 57 43 20 3d 20 70 57 43 20 3d 20  fo->pWC = pWC = 
2b8a0 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 29 26  (WhereClause *)&
2b8b0 28 28 75 38 20 2a 29 70 57 49 6e 66 6f 29 5b 6e  ((u8 *)pWInfo)[n
2b8c0 42 79 74 65 57 49 6e 66 6f 5d 3b 0a 20 20 70 57  ByteWInfo];.  pW
2b8d0 49 6e 66 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73  Info->wctrlFlags
2b8e0 20 3d 20 77 63 74 72 6c 46 6c 61 67 73 3b 0a 20   = wctrlFlags;. 
2b8f0 20 70 57 49 6e 66 6f 2d 3e 73 61 76 65 64 4e 51   pWInfo->savedNQ
2b900 75 65 72 79 4c 6f 6f 70 20 3d 20 70 50 61 72 73  ueryLoop = pPars
2b910 65 2d 3e 6e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20  e->nQueryLoop;. 
2b920 20 70 4d 61 73 6b 53 65 74 20 3d 20 28 57 68 65   pMaskSet = (Whe
2b930 72 65 4d 61 73 6b 53 65 74 2a 29 26 70 57 43 5b  reMaskSet*)&pWC[
2b940 31 5d 3b 0a 0a 20 20 2f 2a 20 44 69 73 61 62 6c  1];..  /* Disabl
2b950 65 20 74 68 65 20 44 49 53 54 49 4e 43 54 20 6f  e the DISTINCT o
2b960 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66 20 53  ptimization if S
2b970 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f 70  QLITE_DistinctOp
2b980 74 20 69 73 20 73 65 74 20 76 69 61 0a 20 20 2a  t is set via.  *
2b990 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2b9a0 74 72 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  trl(SQLITE_TESTC
2b9b0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
2b9c0 53 2c 2e 2e 2e 29 20 2a 2f 0a 20 20 69 66 28 20  S,...) */.  if( 
2b9d0 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
2b9e0 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 29  TE_DistinctOpt )
2b9f0 20 70 44 69 73 74 69 6e 63 74 20 3d 20 30 3b 0a   pDistinct = 0;.
2ba00 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
2ba10 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
2ba20 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
2ba30 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
2ba40 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
2ba50 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
2ba60 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
2ba70 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
2ba80 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
2ba90 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
2baa0 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50  auseInit(pWC, pP
2bab0 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
2bac0 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
2bad0 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  deConstants(pPar
2bae0 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77  se, pWhere);.  w
2baf0 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
2bb00 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 20  Where, TK_AND); 
2bb10 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 31 35 38 34    /* IMP: R-1584
2bb20 32 2d 35 33 32 39 36 20 2a 2f 0a 20 20 20 20 0a  2-53296 */.    .
2bb30 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73    /* Special cas
2bb40 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  e: a WHERE claus
2bb50 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61  e that is consta
2bb60 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68  nt.  Evaluate th
2bb70 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f  e.  ** expressio
2bb80 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d  n and either jum
2bb90 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68  p over all of th
2bba0 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74  e code or fall t
2bbb0 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  hru..  */.  if( 
2bbc0 70 57 68 65 72 65 20 26 26 20 28 6e 54 61 62 4c  pWhere && (nTabL
2bbd0 69 73 74 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ist==0 || sqlite
2bbe0 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
2bbf0 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65 29 29 20  otJoin(pWhere)) 
2bc00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
2bc10 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
2bc20 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f  , pWhere, pWInfo
2bc30 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c 49 54 45  ->iBreak, SQLITE
2bc40 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20  _JUMPIFNULL);.  
2bc50 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20    pWhere = 0;.  
2bc60 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67 6e 20 61  }..  /* Assign a
2bc70 20 62 69 74 20 66 72 6f 6d 20 74 68 65 20 62 69   bit from the bi
2bc80 74 6d 61 73 6b 20 74 6f 20 65 76 65 72 79 20 74  tmask to every t
2bc90 65 72 6d 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  erm in the FROM 
2bca0 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
2bcb0 2a 20 57 68 65 6e 20 61 73 73 69 67 6e 69 6e 67  * When assigning
2bcc0 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
2bcd0 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 63  to FROM clause c
2bce0 75 72 73 6f 72 73 2c 20 69 74 20 6d 75 73 74 20  ursors, it must 
2bcf0 62 65 0a 20 20 2a 2a 20 74 68 65 20 63 61 73 65  be.  ** the case
2bd00 20 74 68 61 74 20 69 66 20 58 20 69 73 20 74 68   that if X is th
2bd10 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
2bd20 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63 6c 61 75  e N-th FROM clau
2bd30 73 65 20 74 65 72 6d 20 74 68 65 6e 0a 20 20 2a  se term then.  *
2bd40 2a 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  * the bitmask fo
2bd50 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c 61 75 73  r all FROM claus
2bd60 65 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 6c  e terms to the l
2bd70 65 66 74 20 6f 66 20 74 68 65 20 4e 2d 74 68 20  eft of the N-th 
2bd80 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20 28 58 2d  term.  ** is (X-
2bd90 31 29 2e 20 20 20 41 6e 20 65 78 70 72 65 73 73  1).   An express
2bda0 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 4f 4e 20  ion from the ON 
2bdb0 63 6c 61 75 73 65 20 6f 66 20 61 20 4c 45 46 54  clause of a LEFT
2bdc0 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65 0a 20 20   JOIN can use.  
2bdd0 2a 2a 20 69 74 73 20 45 78 70 72 2e 69 52 69 67  ** its Expr.iRig
2bde0 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76 61 6c 75  htJoinTable valu
2bdf0 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 62 69  e to find the bi
2be00 74 6d 61 73 6b 20 6f 66 20 74 68 65 20 72 69 67  tmask of the rig
2be10 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 66  ht table.  ** of
2be20 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53 75 62 74   the join.  Subt
2be30 72 61 63 74 69 6e 67 20 6f 6e 65 20 66 72 6f 6d  racting one from
2be40 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
2be50 20 62 69 74 6d 61 73 6b 20 67 69 76 65 73 20 61   bitmask gives a
2be60 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b 20 66 6f  .  ** bitmask fo
2be70 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20  r all tables to 
2be80 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20  the left of the 
2be90 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e 67 20 74  join.  Knowing t
2bea0 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20  he bitmask.  ** 
2beb0 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20 74  for all tables t
2bec0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 61 20  o the left of a 
2bed0 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20 69 6d 70  left join is imp
2bee0 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b 65 74 20  ortant.  Ticket 
2bef0 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  #3015..  **.  **
2bf00 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65 20 57   Configure the W
2bf10 68 65 72 65 43 6c 61 75 73 65 2e 76 6d 61 73 6b  hereClause.vmask
2bf20 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74 68 61   variable so tha
2bf30 74 20 62 69 74 73 20 74 68 61 74 20 63 6f 72 72  t bits that corr
2bf40 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74 6f 20 76  espond.  ** to v
2bf50 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 75 72  irtual table cur
2bf60 73 6f 72 73 20 61 72 65 20 73 65 74 2e 20 54 68  sors are set. Th
2bf70 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  is is used to se
2bf80 6c 65 63 74 69 76 65 6c 79 20 64 69 73 61 62 6c  lectively disabl
2bf90 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f 52 2d 74  e .  ** the OR-t
2bfa0 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72 6d 61 74  o-IN transformat
2bfb0 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e 61 6c 79  ion in exprAnaly
2bfc0 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49 74 20 69  zeOrTerm(). It i
2bfd0 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c 20 0a 20  s not helpful . 
2bfe0 20 2a 2a 20 77 69 74 68 20 76 69 72 74 75 61 6c   ** with virtual
2bff0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2a 0a 20 20   tables..  **.  
2c000 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 62 69 74  ** Note that bit
2c010 6d 61 73 6b 73 20 61 72 65 20 63 72 65 61 74 65  masks are create
2c020 64 20 66 6f 72 20 61 6c 6c 20 70 54 61 62 4c 69  d for all pTabLi
2c030 73 74 2d 3e 6e 53 72 63 20 74 61 62 6c 65 73 20  st->nSrc tables 
2c040 69 6e 0a 20 20 2a 2a 20 70 54 61 62 4c 69 73 74  in.  ** pTabList
2c050 2c 20 6e 6f 74 20 6a 75 73 74 20 74 68 65 20 66  , not just the f
2c060 69 72 73 74 20 6e 54 61 62 4c 69 73 74 20 74 61  irst nTabList ta
2c070 62 6c 65 73 2e 20 20 6e 54 61 62 4c 69 73 74 20  bles.  nTabList 
2c080 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 20 20 2a 2a  is normally.  **
2c090 20 65 71 75 61 6c 20 74 6f 20 70 54 61 62 4c 69   equal to pTabLi
2c0a0 73 74 2d 3e 6e 53 72 63 20 62 75 74 20 6d 69 67  st->nSrc but mig
2c0b0 68 74 20 62 65 20 73 68 6f 72 74 65 6e 65 64 20  ht be shortened 
2c0c0 74 6f 20 31 20 69 66 20 74 68 65 0a 20 20 2a 2a  to 1 if the.  **
2c0d0 20 57 48 45 52 45 5f 4f 4e 45 54 41 42 4c 45 5f   WHERE_ONETABLE_
2c0e0 4f 4e 4c 59 20 66 6c 61 67 20 69 73 20 73 65 74  ONLY flag is set
2c0f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2c100 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26   pWC->vmask==0 &
2c110 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30  & pMaskSet->n==0
2c120 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
2c130 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
2c140 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74   i++){.    creat
2c150 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  eMask(pMaskSet, 
2c160 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
2c170 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66  Cursor);.#ifndef
2c180 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2c190 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2c1a0 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73  ( ALWAYS(pTabLis
2c1b0 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26  t->a[i].pTab) &&
2c1c0 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c   IsVirtual(pTabL
2c1d0 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20  ist->a[i].pTab) 
2c1e0 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d  ){.      pWC->vm
2c1f0 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  ask |= ((Bitmask
2c200 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a  )1 << i);.    }.
2c210 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64  #endif.  }.#ifnd
2c220 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20  ef NDEBUG.  {.  
2c230 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c    Bitmask toTheL
2c240 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  eft = 0;.    for
2c250 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
2c260 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
2c270 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20      Bitmask m = 
2c280 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
2c290 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
2c2a0 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
2c2b0 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d   assert( (m-1)==
2c2c0 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20  toTheLeft );.   
2c2d0 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20     toTheLeft |= 
2c2e0 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  m;.    }.  }.#en
2c2f0 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a  dif..  /* Analyz
2c300 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
2c310 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f  expressions.  No
2c320 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c  te that exprAnal
2c330 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a  yze() might.  **
2c340 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c   add new virtual
2c350 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20   terms onto the 
2c360 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
2c370 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20   clause.  We do 
2c380 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f  not.  ** want to
2c390 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76   analyze these v
2c3a0 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f  irtual terms, so
2c3b0 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67   start analyzing
2c3c0 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a   at the end.  **
2c3d0 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72   and work forwar
2c3e0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64  d so that the ad
2c3f0 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d  ded virtual term
2c400 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63  s are never proc
2c410 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78  essed..  */.  ex
2c420 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61  prAnalyzeAll(pTa
2c430 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69  bList, pWC);.  i
2c440 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
2c450 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
2c460 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
2c470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
2c480 20 69 66 20 74 68 65 20 44 49 53 54 49 4e 43 54   if the DISTINCT
2c490 20 71 75 61 6c 69 66 69 65 72 2c 20 69 66 20 74   qualifier, if t
2c4a0 68 65 72 65 20 69 73 20 6f 6e 65 2c 20 69 73 20  here is one, is 
2c4b0 72 65 64 75 6e 64 61 6e 74 2e 20 0a 20 20 2a 2a  redundant. .  **
2c4c0 20 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20   If it is, then 
2c4d0 73 65 74 20 70 44 69 73 74 69 6e 63 74 20 74 6f  set pDistinct to
2c4e0 20 4e 55 4c 4c 20 61 6e 64 20 57 68 65 72 65 49   NULL and WhereI
2c4f0 6e 66 6f 2e 65 44 69 73 74 69 6e 63 74 20 74 6f  nfo.eDistinct to
2c500 0a 20 20 2a 2a 20 57 48 45 52 45 5f 44 49 53 54  .  ** WHERE_DIST
2c510 49 4e 43 54 5f 55 4e 49 51 55 45 20 74 6f 20 74  INCT_UNIQUE to t
2c520 65 6c 6c 20 74 68 65 20 63 61 6c 6c 65 72 20 74  ell the caller t
2c530 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 44 49 53  o ignore the DIS
2c540 54 49 4e 43 54 2e 0a 20 20 2a 2f 0a 20 20 69 66  TINCT..  */.  if
2c550 28 20 70 44 69 73 74 69 6e 63 74 20 26 26 20 69  ( pDistinct && i
2c560 73 44 69 73 74 69 6e 63 74 52 65 64 75 6e 64 61  sDistinctRedunda
2c570 6e 74 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  nt(pParse, pTabL
2c580 69 73 74 2c 20 70 57 43 2c 20 70 44 69 73 74 69  ist, pWC, pDisti
2c590 6e 63 74 29 20 29 7b 0a 20 20 20 20 70 44 69 73  nct) ){.    pDis
2c5a0 74 69 6e 63 74 20 3d 20 30 3b 0a 20 20 20 20 70  tinct = 0;.    p
2c5b0 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69 6e 63 74  WInfo->eDistinct
2c5c0 20 3d 20 57 48 45 52 45 5f 44 49 53 54 49 4e 43   = WHERE_DISTINC
2c5d0 54 5f 55 4e 49 51 55 45 3b 0a 20 20 7d 0a 0a 20  T_UNIQUE;.  }.. 
2c5e0 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
2c5f0 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
2c600 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
2c610 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2c620 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
2c630 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
2c640 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
2c650 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
2c660 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
2c670 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
2c680 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
2c690 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
2c6a0 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
2c6b0 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73 20  fo->a[].wsFlags 
2c6c0 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
2c6d0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2c6e0 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
2c6f0 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
2c700 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
2c710 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
2c720 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
2c730 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
2c740 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d 20       Which term 
2c750 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
2c760 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65  se is being code
2c770 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  d.  **   pWInfo-
2c780 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54  >a[].iTabCur   T
2c790 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
2c7a0 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2c7b0 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49  table.  **   pWI
2c7c0 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72  nfo->a[].iIdxCur
2c7d0 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
2c7e0 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
2c7f0 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
2c800 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57 68  a[].pTerm     Wh
2c810 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f 4f  en wsFlags==WO_O
2c820 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  R, the OR-clause
2c830 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a 20   term.  **.  ** 
2c840 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66  This loop also f
2c850 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e  igures out the n
2c860 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20  esting order of 
2c870 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2c880 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a  OM.  ** clause..
2c890 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
2c8a0 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
2c8b0 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a   andFlags = ~0;.
2c8c0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
2c8d0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
2c8e0 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
2c8f0 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
2c900 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
2c910 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b 2b 2c  i<nTabList; i++,
2c920 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
2c930 57 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c  WhereCost bestPl
2c940 61 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  an;         /* M
2c950 6f 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c  ost efficient pl
2c960 61 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a  an seen so far *
2c970 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
2c980 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
2c990 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
2c9a0 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
2c9b0 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
2c9c0 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
2c9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
2c9e0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f  looping over FRO
2c9f0 4d 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20  M tables */.    
2ca00 69 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20  int bestJ = -1; 
2ca10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ca20 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f  he value of j */
2ca30 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20  .    Bitmask m; 
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75   /* Bitmask valu
2ca60 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a  e for j or bestJ
2ca70 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70   */.    int isOp
2ca80 74 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20  timal;          
2ca90 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
2caa0 66 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d  for optimal/non-
2cab0 6f 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a  optimal search *
2cac0 2f 0a 20 20 20 20 69 6e 74 20 6e 55 6e 63 6f 6e  /.    int nUncon
2cad0 73 74 72 61 69 6e 65 64 3b 20 20 20 20 20 20 20  strained;       
2cae0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 74 61 62 6c    /* Number tabl
2caf0 65 73 20 77 69 74 68 6f 75 74 20 49 4e 44 45 58  es without INDEX
2cb00 45 44 20 42 59 20 2a 2f 0a 20 20 20 20 42 69 74  ED BY */.    Bit
2cb10 6d 61 73 6b 20 6e 6f 74 49 6e 64 65 78 65 64 3b  mask notIndexed;
2cb20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
2cb30 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
2cb40 63 61 6e 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  cannot use an in
2cb50 64 65 78 20 2a 2f 0a 0a 20 20 20 20 6d 65 6d 73  dex */..    mems
2cb60 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20 30 2c  et(&bestPlan, 0,
2cb70 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c 61 6e   sizeof(bestPlan
2cb80 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c 61 6e  ));.    bestPlan
2cb90 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f  .rCost = SQLITE_
2cba0 42 49 47 5f 44 42 4c 3b 0a 20 20 20 20 57 48 45  BIG_DBL;.    WHE
2cbb0 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 42 65  RETRACE(("*** Be
2cbc0 67 69 6e 20 73 65 61 72 63 68 20 66 6f 72 20 6c  gin search for l
2cbd0 6f 6f 70 20 25 64 20 2a 2a 2a 5c 6e 22 2c 20 69  oop %d ***\n", i
2cbe0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70  ));..    /* Loop
2cbf0 20 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d   through the rem
2cc00 61 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69  aining entries i
2cc10 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
2cc20 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20  e to find the.  
2cc30 20 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64    ** next nested
2cc40 20 6c 6f 6f 70 2e 20 54 68 65 20 6c 6f 6f 70 20   loop. The loop 
2cc50 74 65 73 74 73 20 61 6c 6c 20 46 52 4f 4d 20 63  tests all FROM c
2cc60 6c 61 75 73 65 20 65 6e 74 72 69 65 73 0a 20 20  lause entries.  
2cc70 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65    ** either once
2cc80 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20   or twice. .    
2cc90 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  **.    ** The fi
2cca0 72 73 74 20 74 65 73 74 20 69 73 20 61 6c 77 61  rst test is alwa
2ccb0 79 73 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20  ys performed if 
2ccc0 74 68 65 72 65 20 61 72 65 20 74 77 6f 20 6f 72  there are two or
2ccd0 20 6d 6f 72 65 20 65 6e 74 72 69 65 73 0a 20 20   more entries.  
2cce0 20 20 2a 2a 20 72 65 6d 61 69 6e 69 6e 67 20 61    ** remaining a
2ccf0 6e 64 20 6e 65 76 65 72 20 70 65 72 66 6f 72 6d  nd never perform
2cd00 65 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ed if there is o
2cd10 6e 6c 79 20 6f 6e 65 20 46 52 4f 4d 20 63 6c 61  nly one FROM cla
2cd20 75 73 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  use entry.    **
2cd30 20 74 6f 20 63 68 6f 6f 73 65 20 66 72 6f 6d 2e   to choose from.
2cd40 20 20 54 68 65 20 66 69 72 73 74 20 74 65 73 74    The first test
2cd50 20 6c 6f 6f 6b 73 20 66 6f 72 20 61 6e 20 22 6f   looks for an "o
2cd60 70 74 69 6d 61 6c 22 20 73 63 61 6e 2e 20 20 49  ptimal" scan.  I
2cd70 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f  n.    ** this co
2cd80 6e 74 65 78 74 20 61 6e 20 6f 70 74 69 6d 61 6c  ntext an optimal
2cd90 20 73 63 61 6e 20 69 73 20 6f 6e 65 20 74 68 61   scan is one tha
2cda0 74 20 75 73 65 73 20 74 68 65 20 73 61 6d 65 20  t uses the same 
2cdb0 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20  strategy.    ** 
2cdc0 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 46 52  for the given FR
2cdd0 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74 72 79 20  OM clause entry 
2cde0 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6c 65  as would be sele
2cdf0 63 74 65 64 20 69 66 20 74 68 65 20 65 6e 74 72  cted if the entr
2ce00 79 0a 20 20 20 20 2a 2a 20 77 65 72 65 20 75 73  y.    ** were us
2ce10 65 64 20 61 73 20 74 68 65 20 69 6e 6e 65 72 6d  ed as the innerm
2ce20 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e  ost nested loop.
2ce30 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2ce40 2c 20 61 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a  , a table.    **
2ce50 20 69 73 20 63 68 6f 73 65 6e 20 73 75 63 68 20   is chosen such 
2ce60 74 68 61 74 20 74 68 65 20 63 6f 73 74 20 6f 66  that the cost of
2ce70 20 72 75 6e 6e 69 6e 67 20 74 68 61 74 20 74 61   running that ta
2ce80 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ble cannot be re
2ce90 64 75 63 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  duced.    ** by 
2cea0 77 61 69 74 69 6e 67 20 66 6f 72 20 6f 74 68 65  waiting for othe
2ceb0 72 20 74 61 62 6c 65 73 20 74 6f 20 72 75 6e 20  r tables to run 
2cec0 66 69 72 73 74 2e 20 20 54 68 69 73 20 22 6f 70  first.  This "op
2ced0 74 69 6d 61 6c 22 20 74 65 73 74 20 77 6f 72 6b  timal" test work
2cee0 73 0a 20 20 20 20 2a 2a 20 62 79 20 66 69 72 73  s.    ** by firs
2cef0 74 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  t assuming that 
2cf00 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
2cf10 69 73 20 6f 6e 20 74 68 65 20 69 6e 6e 65 72 20  is on the inner 
2cf20 6c 6f 6f 70 20 61 6e 64 20 66 69 6e 64 69 6e 67  loop and finding
2cf30 0a 20 20 20 20 2a 2a 20 69 74 73 20 71 75 65 72  .    ** its quer
2cf40 79 20 70 6c 61 6e 2c 20 74 68 65 6e 20 63 68 65  y plan, then che
2cf50 63 6b 69 6e 67 20 74 6f 20 73 65 65 20 69 66 20  cking to see if 
2cf60 74 68 61 74 20 71 75 65 72 79 20 70 6c 61 6e 20  that query plan 
2cf70 75 73 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20  uses any.    ** 
2cf80 6f 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73  other FROM claus
2cf90 65 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  e terms that are
2cfa0 20 6e 6f 74 52 65 61 64 79 2e 20 20 49 66 20 6e   notReady.  If n
2cfb0 6f 20 6e 6f 74 52 65 61 64 79 20 74 65 72 6d 73  o notReady terms
2cfc0 20 61 72 65 0a 20 20 20 20 2a 2a 20 75 73 65 64   are.    ** used
2cfd0 20 74 68 65 6e 20 74 68 65 20 22 6f 70 74 69 6d   then the "optim
2cfe0 61 6c 22 20 71 75 65 72 79 20 70 6c 61 6e 20 77  al" query plan w
2cff0 6f 72 6b 73 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  orks..    **.   
2d000 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
2d010 65 20 57 68 65 72 65 43 6f 73 74 2e 6e 52 6f 77  e WhereCost.nRow
2d020 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
2d030 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 6d  n optimal scan m
2d040 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 6f 74 20  ight.    ** not 
2d050 62 65 20 61 73 20 73 6d 61 6c 6c 20 61 73 20 69  be as small as i
2d060 74 20 77 6f 75 6c 64 20 62 65 20 69 66 20 74 68  t would be if th
2d070 65 20 74 61 62 6c 65 20 72 65 61 6c 6c 79 20 77  e table really w
2d080 65 72 65 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73  ere the innermos
2d090 74 0a 20 20 20 20 2a 2a 20 6a 6f 69 6e 2e 20 20  t.    ** join.  
2d0a0 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 63  The nRow value c
2d0b0 61 6e 20 62 65 20 72 65 64 75 63 65 64 20 62 79  an be reduced by
2d0c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
2d0d0 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a  nstraints.    **
2d0e0 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 75 73 65   that do not use
2d0f0 20 69 6e 64 69 63 65 73 2e 20 20 42 75 74 20 74   indices.  But t
2d100 68 69 73 20 6e 52 6f 77 20 72 65 64 75 63 74 69  his nRow reducti
2d110 6f 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  on only happens 
2d120 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 61  if the.    ** ta
2d130 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
2d140 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6a 6f 69 6e  e innermost join
2d150 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  .  .    **.    *
2d160 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 6c 6f 6f  * The second loo
2d170 70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f  p iteration is o
2d180 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66  nly performed if
2d190 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   no optimal scan
2d1a0 0a 20 20 20 20 2a 2a 20 73 74 72 61 74 65 67 69  .    ** strategi
2d1b0 65 73 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79  es were found by
2d1c0 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
2d1d0 74 69 6f 6e 2e 20 54 68 69 73 20 73 65 63 6f 6e  tion. This secon
2d1e0 64 20 69 74 65 72 61 74 69 6f 6e 0a 20 20 20 20  d iteration.    
2d1f0 2a 2a 20 69 73 20 75 73 65 64 20 74 6f 20 73 65  ** is used to se
2d200 61 72 63 68 20 66 6f 72 20 74 68 65 20 6c 6f 77  arch for the low
2d210 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76  est cost scan ov
2d220 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  erall..    **.  
2d230 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65    ** Previous ve
2d240 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
2d250 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20   performed only 
2d260 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
2d270 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68  tion -.    ** th
2d280 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74  e next outermost
2d290 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73   loop was always
2d2a0 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c   that with the l
2d2b0 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20  owest overall.  
2d2c0 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76    ** cost. Howev
2d2d0 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74  er, this meant t
2d2e0 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64  hat SQLite could
2d2f0 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e   select the wron
2d300 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f  g plan.    ** fo
2d310 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61  r scripts such a
2d320 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
2d330 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a  .    **   .    *
2d340 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
2d350 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20   t1(a, b); .    
2d360 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
2d370 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20  E t2(c, d);.    
2d380 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
2d390 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  OM t2, t1 WHERE 
2d3a0 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b  t2.rowid = t1.a;
2d3b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
2d3c0 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79  he best strategy
2d3d0 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74   is to iterate t
2d3e0 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20  hrough table t1 
2d3f0 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69  first. However i
2d400 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
2d410 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
2d420 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20  rmine this with 
2d430 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
2d440 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
2d450 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 73 74  * Since the cost
2d460 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63 61   of a linear sca
2d470 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20  n through table 
2d480 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20 0a  t2 is the same .
2d490 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63 6f      ** as the co
2d4a0 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73  st of a linear s
2d4b0 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c  can through tabl
2d4c0 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20 67  e t1, a simple g
2d4d0 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61 6c  reedy .    ** al
2d4e0 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f 6f  gorithm may choo
2d4f0 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f 72  se to use t2 for
2d500 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2c   the outer loop,
2d510 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63 68   which is a much
2d520 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65 72  .    ** costlier
2d530 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20 2a   approach..    *
2d540 2f 0a 20 20 20 20 6e 55 6e 63 6f 6e 73 74 72 61  /.    nUnconstra
2d550 69 6e 65 64 20 3d 20 30 3b 0a 20 20 20 20 6e 6f  ined = 0;.    no
2d560 74 49 6e 64 65 78 65 64 20 3d 20 30 3b 0a 20 20  tIndexed = 0;.  
2d570 20 20 66 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d    for(isOptimal=
2d580 28 69 46 72 6f 6d 3c 6e 54 61 62 4c 69 73 74 2d  (iFrom<nTabList-
2d590 31 29 3b 20 69 73 4f 70 74 69 6d 61 6c 3e 3d 30  1); isOptimal>=0
2d5a0 20 26 26 20 62 65 73 74 4a 3c 30 3b 20 69 73 4f   && bestJ<0; isO
2d5b0 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20 20 20 20 20  ptimal--){.     
2d5c0 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 20 20   Bitmask mask;  
2d5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
2d5e0 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 6e 6f 74  sk of tables not
2d5f0 20 79 65 74 20 72 65 61 64 79 20 2a 2f 0a 20 20   yet ready */.  
2d600 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
2d610 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
2d620 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 6e 54 61  ist->a[j]; j<nTa
2d630 62 4c 69 73 74 3b 20 6a 2b 2b 2c 20 70 54 61 62  bList; j++, pTab
2d640 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
2d650 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65   int doNotReorde
2d660 72 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  r;    /* True if
2d670 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75   this table shou
2d680 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65  ld not be reorde
2d690 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 57  red */.        W
2d6a0 68 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20  hereCost sCost; 
2d6b0 20 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f      /* Cost info
2d6c0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73  rmation from bes
2d6d0 74 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78 28  t[Virtual]Index(
2d6e0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70  ) */.        Exp
2d6f0 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b  rList *pOrderBy;
2d700 20 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c    /* ORDER BY cl
2d710 61 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20 74  ause for index t
2d720 6f 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20  o optimize */.  
2d730 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
2d740 70 44 69 73 74 3b 20 20 20 20 20 2f 2a 20 44 49  pDist;     /* DI
2d750 53 54 49 4e 43 54 20 63 6c 61 75 73 65 20 66 6f  STINCT clause fo
2d760 72 20 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d  r index to optim
2d770 69 7a 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20  ize */.  .      
2d780 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d    doNotReorder =
2d790 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69    (pTabItem->joi
2d7a0 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
2d7b0 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a  |JT_CROSS))!=0;.
2d7c0 20 20 20 20 20 20 20 20 69 66 28 20 6a 21 3d 69          if( j!=i
2d7d0 46 72 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f  From && doNotReo
2d7e0 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20  rder ) break;.  
2d7f0 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73        m = getMas
2d800 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
2d810 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
2d820 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 20 26          if( (m &
2d830 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
2d840 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6a  .          if( j
2d850 3d 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b  ==iFrom ) iFrom+
2d860 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  +;.          con
2d870 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
2d880 0a 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20  .        mask = 
2d890 28 69 73 4f 70 74 69 6d 61 6c 20 3f 20 6d 20 3a  (isOptimal ? m :
2d8a0 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20 20   notReady);.    
2d8b0 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d 20 28      pOrderBy = (
2d8c0 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72  (i==0 && ppOrder
2d8d0 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42 79 3a  By )?*ppOrderBy:
2d8e0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 44 69 73  0);.        pDis
2d8f0 74 20 3d 20 28 69 3d 3d 30 20 3f 20 70 44 69 73  t = (i==0 ? pDis
2d900 74 69 6e 63 74 20 3a 20 30 29 3b 0a 20 20 20 20  tinct : 0);.    
2d910 20 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d      if( pTabItem
2d920 2d 3e 70 49 6e 64 65 78 3d 3d 30 20 29 20 6e 55  ->pIndex==0 ) nU
2d930 6e 63 6f 6e 73 74 72 61 69 6e 65 64 2b 2b 3b 0a  nconstrained++;.
2d940 20 20 0a 20 20 20 20 20 20 20 20 57 48 45 52 45    .        WHERE
2d950 54 52 41 43 45 28 28 22 3d 3d 3d 20 74 72 79 69  TRACE(("=== tryi
2d960 6e 67 20 74 61 62 6c 65 20 25 64 20 77 69 74 68  ng table %d with
2d970 20 69 73 4f 70 74 69 6d 61 6c 3d 25 64 20 3d 3d   isOptimal=%d ==
2d980 3d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  =\n",.          
2d990 20 20 20 20 20 20 20 20 20 20 6a 2c 20 69 73 4f            j, isO
2d9a0 70 74 69 6d 61 6c 29 29 3b 0a 20 20 20 20 20 20  ptimal));.      
2d9b0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
2d9c0 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e  em->pTab );.#ifn
2d9d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2d9e0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
2d9f0 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
2da00 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  al(pTabItem->pTa
2da10 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
2da20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
2da30 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66  fo **pp = &pWInf
2da40 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
2da50 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
2da60 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
2da70 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
2da80 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52 65 61  em, mask, notRea
2da90 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a 20 20  dy, pOrderBy,.  
2daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dab0 20 20 20 20 20 20 20 20 20 26 73 43 6f 73 74 2c           &sCost,
2dac0 20 70 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 65   pp);.        }e
2dad0 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
2dae0 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
2daf0 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28 70  bestBtreeIndex(p
2db00 50 61 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62  Parse, pWC, pTab
2db10 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 6e 6f 74 52  Item, mask, notR
2db20 65 61 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 0a  eady, pOrderBy,.
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44                pD
2db40 69 73 74 2c 20 26 73 43 6f 73 74 29 3b 0a 20 20  ist, &sCost);.  
2db50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2db60 61 73 73 65 72 74 28 20 69 73 4f 70 74 69 6d 61  assert( isOptima
2db70 6c 20 7c 7c 20 28 73 43 6f 73 74 2e 75 73 65 64  l || (sCost.used
2db80 26 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 3b  &notReady)==0 );
2db90 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
2dba0 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
2dbb0 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
2dbc0 20 74 68 65 6e 20 74 68 65 20 70 6c 61 6e 20 6d   then the plan m
2dbd0 75 73 74 20 75 73 65 20 74 68 61 74 0a 20 20 20  ust use that.   
2dbe0 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 69 66       ** index if
2dbf0 20 69 74 20 75 73 65 73 20 61 6e 79 20 69 6e 64   it uses any ind
2dc00 65 78 20 61 74 20 61 6c 6c 20 2a 2f 0a 20 20 20  ex at all */.   
2dc10 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
2dc20 62 49 74 65 6d 2d 3e 70 49 6e 64 65 78 3d 3d 30  bItem->pIndex==0
2dc30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2dc40 20 20 20 20 7c 7c 20 28 73 43 6f 73 74 2e 70 6c      || (sCost.pl
2dc50 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
2dc60 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43 41 4e 29  RE_NOT_FULLSCAN)
2dc70 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  ==0.            
2dc80 20 20 20 20 20 20 7c 7c 20 73 43 6f 73 74 2e 70        || sCost.p
2dc90 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 54 61 62  lan.u.pIdx==pTab
2dca0 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20 29 3b 0a  Item->pIndex );.
2dcb0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4f  .        if( isO
2dcc0 70 74 69 6d 61 6c 20 26 26 20 28 73 43 6f 73 74  ptimal && (sCost
2dcd0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2dce0 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c 53 43  WHERE_NOT_FULLSC
2dcf0 41 4e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  AN)==0 ){.      
2dd00 20 20 20 20 6e 6f 74 49 6e 64 65 78 65 64 20 7c      notIndexed |
2dd10 3d 20 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  = m;.        }..
2dd20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69          /* Condi
2dd30 74 69 6f 6e 73 20 75 6e 64 65 72 20 77 68 69 63  tions under whic
2dd40 68 20 74 68 69 73 20 74 61 62 6c 65 20 62 65 63  h this table bec
2dd50 6f 6d 65 73 20 74 68 65 20 62 65 73 74 20 73 6f  omes the best so
2dd60 20 66 61 72 3a 0a 20 20 20 20 20 20 20 20 2a 2a   far:.        **
2dd70 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 28 31  .        **   (1
2dd80 29 20 54 68 65 20 74 61 62 6c 65 20 6d 75 73 74  ) The table must
2dd90 20 6e 6f 74 20 64 65 70 65 6e 64 20 6f 6e 20 6f   not depend on o
2dda0 74 68 65 72 20 74 61 62 6c 65 73 20 74 68 61 74  ther tables that
2ddb0 20 68 61 76 65 20 6e 6f 74 0a 20 20 20 20 20 20   have not.      
2ddc0 20 20 2a 2a 20 20 20 20 20 20 20 79 65 74 20 72    **       yet r
2ddd0 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  un..        **. 
2dde0 20 20 20 20 20 20 20 2a 2a 20 20 20 28 32 29 20         **   (2) 
2ddf0 41 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61  A full-table-sca
2de00 6e 20 70 6c 61 6e 20 63 61 6e 6e 6f 74 20 73 75  n plan cannot su
2de10 70 65 72 63 65 64 65 20 69 6e 64 65 78 65 64 20  percede indexed 
2de20 70 6c 61 6e 20 75 6e 6c 65 73 73 0a 20 20 20 20  plan unless.    
2de30 20 20 20 20 2a 2a 20 20 20 20 20 20 20 74 68 65      **       the
2de40 20 66 75 6c 6c 2d 74 61 62 6c 65 2d 73 63 61 6e   full-table-scan
2de50 20 69 73 20 61 6e 20 22 6f 70 74 69 6d 61 6c 22   is an "optimal"
2de60 20 70 6c 61 6e 20 61 73 20 64 65 66 69 6e 65 64   plan as defined
2de70 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
2de80 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  **.        **   
2de90 28 33 29 20 41 6c 6c 20 74 61 62 6c 65 73 20 68  (3) All tables h
2dea0 61 76 65 20 61 6e 20 49 4e 44 45 58 45 44 20 42  ave an INDEXED B
2deb0 59 20 63 6c 61 75 73 65 20 6f 72 20 74 68 69 73  Y clause or this
2dec0 20 74 61 62 6c 65 20 6c 61 63 6b 73 20 61 6e 0a   table lacks an.
2ded0 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20          **      
2dee0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
2def0 73 65 20 6f 72 20 74 68 69 73 20 74 61 62 6c 65  se or this table
2df00 20 75 73 65 73 20 74 68 65 20 73 70 65 63 69 66   uses the specif
2df10 69 63 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20  ic.        **   
2df20 20 20 20 20 69 6e 64 65 78 20 73 70 65 63 69 66      index specif
2df30 69 65 64 20 62 79 20 69 74 73 20 49 4e 44 45 58  ied by its INDEX
2df40 45 44 20 42 59 20 63 6c 61 75 73 65 2e 20 20 54  ED BY clause.  T
2df50 68 69 73 20 72 75 6c 65 20 65 6e 73 75 72 65 73  his rule ensures
2df60 0a 20 20 20 20 20 20 20 20 2a 2a 20 20 20 20 20  .        **     
2df70 20 20 74 68 61 74 20 61 20 62 65 73 74 2d 73 6f    that a best-so
2df80 2d 66 61 72 20 69 73 20 61 6c 77 61 79 73 20 73  -far is always s
2df90 65 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20  elected even if 
2dfa0 61 6e 20 69 6d 70 6f 73 73 69 62 6c 65 0a 20 20  an impossible.  
2dfb0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 63        **       c
2dfc0 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 49 4e  ombination of IN
2dfd0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 73  DEXED BY clauses
2dfe0 20 61 72 65 20 67 69 76 65 6e 2e 20 20 54 68 65   are given.  The
2dff0 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 2a   error.        *
2e000 2a 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20  *       will be 
2e010 64 65 74 65 63 74 65 64 20 61 6e 64 20 72 65 6c  detected and rel
2e020 61 79 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ayed back to the
2e030 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6c 61 74   application lat
2e040 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 20  er..        **  
2e050 20 20 20 20 20 54 68 65 20 4e 45 56 45 52 28 29       The NEVER()
2e060 20 63 6f 6d 65 73 20 61 62 6f 75 74 20 62 65 63   comes about bec
2e070 61 75 73 65 20 72 75 6c 65 20 28 32 29 20 61 62  ause rule (2) ab
2e080 6f 76 65 20 70 72 65 76 65 6e 74 73 0a 20 20 20  ove prevents.   
2e090 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 6e       **       An
2e0a0 20 69 6e 64 65 78 61 62 6c 65 20 66 75 6c 6c 2d   indexable full-
2e0b0 74 61 62 6c 65 2d 73 63 61 6e 20 66 72 6f 6d 20  table-scan from 
2e0c0 72 65 61 63 68 69 6e 67 20 72 75 6c 65 20 28 33  reaching rule (3
2e0d0 29 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  )..        **.  
2e0e0 20 20 20 20 20 20 2a 2a 20 20 20 28 34 29 20 54        **   (4) T
2e0f0 68 65 20 70 6c 61 6e 20 63 6f 73 74 20 6d 75 73  he plan cost mus
2e100 74 20 62 65 20 6c 6f 77 65 72 20 74 68 61 6e 20  t be lower than 
2e110 70 72 69 6f 72 20 70 6c 61 6e 73 20 6f 72 20 65  prior plans or e
2e120 6c 73 65 20 74 68 65 0a 20 20 20 20 20 20 20 20  lse the.        
2e130 2a 2a 20 20 20 20 20 20 20 63 6f 73 74 20 6d 75  **       cost mu
2e140 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
2e150 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
2e160 20 72 6f 77 73 20 6d 75 73 74 20 62 65 20 6c 6f   rows must be lo
2e170 77 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  wer..        */.
2e180 20 20 20 20 20 20 20 20 69 66 28 20 28 73 43 6f          if( (sCo
2e190 73 74 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79  st.used&notReady
2e1a0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20  )==0            
2e1b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 31             /* (1
2e1c0 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  ) */.           
2e1d0 20 26 26 20 28 62 65 73 74 4a 3c 30 20 7c 7c 20   && (bestJ<0 || 
2e1e0 28 6e 6f 74 49 6e 64 65 78 65 64 26 6d 29 21 3d  (notIndexed&m)!=
2e1f0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2e200 2f 2a 20 28 32 29 20 2a 2f 0a 20 20 20 20 20 20  /* (2) */.      
2e210 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 62 65            || (be
2e220 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
2e230 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2e240 46 55 4c 4c 53 43 41 4e 29 3d 3d 30 0a 20 20 20  FULLSCAN)==0.   
2e250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2e260 28 73 43 6f 73 74 2e 70 6c 61 6e 2e 77 73 46 6c  (sCost.plan.wsFl
2e270 61 67 73 20 26 20 57 48 45 52 45 5f 4e 4f 54 5f  ags & WHERE_NOT_
2e280 46 55 4c 4c 53 43 41 4e 29 21 3d 30 29 0a 20 20  FULLSCAN)!=0).  
2e290 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 55            && (nU
2e2a0 6e 63 6f 6e 73 74 72 61 69 6e 65 64 3d 3d 30 20  nconstrained==0 
2e2b0 7c 7c 20 70 54 61 62 49 74 65 6d 2d 3e 70 49 6e  || pTabItem->pIn
2e2c0 64 65 78 3d 3d 30 20 20 20 2f 2a 20 28 33 29 20  dex==0   /* (3) 
2e2d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
2e2e0 20 20 20 7c 7c 20 4e 45 56 45 52 28 28 73 43 6f     || NEVER((sCo
2e2f0 73 74 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  st.plan.wsFlags 
2e300 26 20 57 48 45 52 45 5f 4e 4f 54 5f 46 55 4c 4c  & WHERE_NOT_FULL
2e310 53 43 41 4e 29 21 3d 30 29 29 0a 20 20 20 20 20  SCAN)!=0)).     
2e320 20 20 20 20 20 20 20 26 26 20 28 62 65 73 74 4a         && (bestJ
2e330 3c 30 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73  <0 || sCost.rCos
2e340 74 3c 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74  t<bestPlan.rCost
2e350 20 20 20 20 20 20 2f 2a 20 28 34 29 20 2a 2f 0a        /* (4) */.
2e360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e370 7c 7c 20 28 73 43 6f 73 74 2e 72 43 6f 73 74 3c  || (sCost.rCost<
2e380 3d 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20  =bestPlan.rCost 
2e390 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e3a0 20 20 26 26 20 73 43 6f 73 74 2e 70 6c 61 6e 2e    && sCost.plan.
2e3b0 6e 52 6f 77 3c 62 65 73 74 50 6c 61 6e 2e 70 6c  nRow<bestPlan.pl
2e3c0 61 6e 2e 6e 52 6f 77 29 29 0a 20 20 20 20 20 20  an.nRow)).      
2e3d0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57    ){.          W
2e3e0 48 45 52 45 54 52 41 43 45 28 28 22 3d 3d 3d 20  HERETRACE(("=== 
2e3f0 74 61 62 6c 65 20 25 64 20 69 73 20 62 65 73 74  table %d is best
2e400 20 73 6f 20 66 61 72 22 0a 20 20 20 20 20 20 20   so far".       
2e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e420 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e   with cost=%g an
2e430 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20  d nRow=%g\n",.  
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 20 20 20 20 6a 2c 20 73 43 6f 73 74 2e 72 43 6f      j, sCost.rCo
2e460 73 74 2c 20 73 43 6f 73 74 2e 70 6c 61 6e 2e 6e  st, sCost.plan.n
2e470 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Row));.         
2e480 20 62 65 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73   bestPlan = sCos
2e490 74 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  t;.          bes
2e4a0 74 4a 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  tJ = j;.        
2e4b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 6f  }.        if( do
2e4c0 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
2e4d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2e4e0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 62 65  }.    assert( be
2e4f0 73 74 4a 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73  stJ>=0 );.    as
2e500 73 65 72 74 28 20 6e 6f 74 52 65 61 64 79 20 26  sert( notReady &
2e510 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
2e520 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62  t, pTabList->a[b
2e530 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29  estJ].iCursor) )
2e540 3b 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45  ;.    WHERETRACE
2e550 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
2e560 20 73 65 6c 65 63 74 73 20 74 61 62 6c 65 20 25   selects table %
2e570 64 20 66 6f 72 20 6c 6f 6f 70 20 25 64 22 0a 20  d for loop %d". 
2e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e590 20 77 69 74 68 20 63 6f 73 74 3d 25 67 20 61 6e   with cost=%g an
2e5a0 64 20 6e 52 6f 77 3d 25 67 5c 6e 22 2c 0a 20 20  d nRow=%g\n",.  
2e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 65                be
2e5c0 73 74 4a 2c 20 70 4c 65 76 65 6c 2d 70 57 49 6e  stJ, pLevel-pWIn
2e5d0 66 6f 2d 3e 61 2c 20 62 65 73 74 50 6c 61 6e 2e  fo->a, bestPlan.
2e5e0 72 43 6f 73 74 2c 20 62 65 73 74 50 6c 61 6e 2e  rCost, bestPlan.
2e5f0 70 6c 61 6e 2e 6e 52 6f 77 29 29 3b 0a 20 20 20  plan.nRow));.   
2e600 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
2e610 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2e620 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20  ERE_ORDERBY)!=0 
2e630 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65  ){.      *ppOrde
2e640 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
2e650 20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e     if( (bestPlan
2e660 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
2e670 57 48 45 52 45 5f 44 49 53 54 49 4e 43 54 29 21  WHERE_DISTINCT)!
2e680 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
2e690 72 74 28 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73  rt( pWInfo->eDis
2e6a0 74 69 6e 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20  tinct==0 );.    
2e6b0 20 20 70 57 49 6e 66 6f 2d 3e 65 44 69 73 74 69    pWInfo->eDisti
2e6c0 6e 63 74 20 3d 20 57 48 45 52 45 5f 44 49 53 54  nct = WHERE_DIST
2e6d0 49 4e 43 54 5f 4f 52 44 45 52 45 44 3b 0a 20 20  INCT_ORDERED;.  
2e6e0 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
2e6f0 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61   &= bestPlan.pla
2e700 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20 70  n.wsFlags;.    p
2e710 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20 62 65  Level->plan = be
2e720 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20 20 20  stPlan.plan;.   
2e730 20 74 65 73 74 63 61 73 65 28 20 62 65 73 74 50   testcase( bestP
2e740 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  lan.plan.wsFlags
2e750 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
2e760 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2e770 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
2e780 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2e790 54 45 4d 50 5f 49 4e 44 45 58 20 29 3b 0a 20 20  TEMP_INDEX );.  
2e7a0 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e 70    if( bestPlan.p
2e7b0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57  lan.wsFlags & (W
2e7c0 48 45 52 45 5f 49 4e 44 45 58 45 44 7c 57 48 45  HERE_INDEXED|WHE
2e7d0 52 45 5f 54 45 4d 50 5f 49 4e 44 45 58 29 20 29  RE_TEMP_INDEX) )
2e7e0 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
2e7f0 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
2e800 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
2e810 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
2e820 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
2e830 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
2e840 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
2e850 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
2e860 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
2e870 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
2e880 6c 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62  l->iFrom = (u8)b
2e890 65 73 74 4a 3b 0a 20 20 20 20 69 66 28 20 62 65  estJ;.    if( be
2e8a0 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77  stPlan.plan.nRow
2e8b0 3e 3d 28 64 6f 75 62 6c 65 29 31 20 29 7b 0a 20  >=(double)1 ){. 
2e8c0 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 51 75       pParse->nQu
2e8d0 65 72 79 4c 6f 6f 70 20 2a 3d 20 62 65 73 74 50  eryLoop *= bestP
2e8e0 6c 61 6e 2e 70 6c 61 6e 2e 6e 52 6f 77 3b 0a 20  lan.plan.nRow;. 
2e8f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
2e900 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74  ck that if the t
2e910 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20  able scanned by 
2e920 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
2e930 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a  ion had an.    *
2e940 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
2e950 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
2e960 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d  it, that the nam
2e970 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  ed index is bein
2e980 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f  g.    ** used fo
2e990 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e  r the scan. If n
2e9a0 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63  ot, then query c
2e9b0 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66  ompilation has f
2e9c0 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65  ailed..    ** Re
2e9d0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
2e9e0 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d     */.    pIdx =
2e9f0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
2ea00 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  tJ].pIndex;.    
2ea10 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
2ea20 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
2ea30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2ea40 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
2ea50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ea60 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
2ea70 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
2ea80 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78  index: %s", pIdx
2ea90 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2eaa0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
2eab0 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  nError;.      }e
2eac0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
2ead0 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
2eae0 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c   clause is used,
2eaf0 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
2eb00 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20   function is.   
2eb10 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
2eb20 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  ed to find the i
2eb30 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69  ndex specified i
2eb40 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  n the INDEXED BY
2eb50 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
2eb60 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e  ** if it find an
2eb70 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a   index at all. *
2eb80 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
2eb90 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
2eba0 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a  u.pIdx==pIdx );.
2ebb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ebc0 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  }.  WHERETRACE((
2ebd0 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
2ebe0 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
2ebf0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
2ec00 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
2ec10 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
2ec20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
2ec30 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
2ec40 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
2ec50 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
2ec60 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
2ec70 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
2ec80 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
2ec90 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
2eca0 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
2ecb0 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
2ecc0 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
2ecd0 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
2ece0 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
2ecf0 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
2ed00 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
2ed10 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
2ed20 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
2ed30 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
2ed40 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
2ed50 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
2ed60 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
2ed70 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
2ed80 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
2ed90 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
2eda0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2edb0 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
2edc0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
2edd0 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
2ede0 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
2edf0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
2ee00 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
2ee10 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
2ee20 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
2ee30 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
2ee40 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2ee50 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
2ee60 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61  D)!=0 && (andFla
2ee70 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
2ee80 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  E)!=0 ){.    pWI
2ee90 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
2eea0 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   1;.    pWInfo->
2eeb0 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  a[0].plan.wsFlag
2eec0 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
2eed0 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
2eee0 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
2eef0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
2ef00 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
2ef10 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
2ef20 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
2ef30 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
2ef40 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
2ef50 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
2ef60 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
2ef70 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
2ef80 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 6e 6f  ier Goto */.  no
2ef90 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
2efa0 73 6b 29 30 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  sk)0;.  pWInfo->
2efb0 6e 52 6f 77 4f 75 74 20 3d 20 28 64 6f 75 62 6c  nRowOut = (doubl
2efc0 65 29 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  e)1;.  for(i=0, 
2efd0 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61  pLevel=pWInfo->a
2efe0 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20 69 2b  ; i<nTabList; i+
2eff0 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
2f000 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
2f010 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
2f020 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  pen */.    int i
2f030 44 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  Db;         /* I
2f040 6e 64 65 78 20 6f 66 20 64 61 74 61 62 61 73 65  ndex of database
2f050 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c   containing tabl
2f060 65 2f 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20  e/index */..    
2f070 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62  pTabItem = &pTab
2f080 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e  List->a[pLevel->
2f090 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62  iFrom];.    pTab
2f0a0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
2f0b0 62 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  b;.    pLevel->i
2f0c0 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
2f0d0 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2f0e0 70 57 49 6e 66 6f 2d 3e 6e 52 6f 77 4f 75 74 20  pWInfo->nRowOut 
2f0f0 2a 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  *= pLevel->plan.
2f100 6e 52 6f 77 3b 0a 20 20 20 20 69 44 62 20 3d 20  nRow;.    iDb = 
2f110 73 71 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49  sqlite3SchemaToI
2f120 6e 64 65 78 28 64 62 2c 20 70 54 61 62 2d 3e 70  ndex(db, pTab->p
2f130 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
2f140 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
2f150 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
2f160 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
2f170 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a  lect ){.      /*
2f180 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20   Do nothing */. 
2f190 20 20 20 7d 65 6c 73 65 0a 23 69 66 6e 64 65 66     }else.#ifndef
2f1a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
2f1b0 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66  TUALTABLE.    if
2f1c0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
2f1d0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
2f1e0 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
2f1f0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
2f200 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20 28 63  char *pVTab = (c
2f210 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
2f220 74 65 33 47 65 74 56 54 61 62 6c 65 28 64 62 2c  te3GetVTable(db,
2f230 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 69 6e   pTab);.      in
2f240 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
2f250 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
2f260 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
2f270 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
2f280 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70 56 54   iCur, 0, 0, pVT
2f290 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a 20 20  ab, P4_VTAB);.  
2f2a0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
2f2b0 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
2f2c0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
2f2d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
2f2e0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 77  0.         && (w
2f2f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
2f300 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d 30 20  E_OMIT_OPEN)==0 
2f310 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 20  ){.      int op 
2f320 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50  = pWInfo->okOneP
2f330 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57 72 69  ass ? OP_OpenWri
2f340 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65 61 64  te : OP_OpenRead
2f350 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
2f360 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
2f370 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
2f380 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 6f  or, iDb, pTab, o
2f390 70 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  p);.      testca
2f3a0 73 65 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3d 3d  se( pTab->nCol==
2f3b0 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20 74  BMS-1 );.      t
2f3c0 65 73 74 63 61 73 65 28 20 70 54 61 62 2d 3e 6e  estcase( pTab->n
2f3d0 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20  Col==BMS );.    
2f3e0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
2f3f0 6b 4f 6e 65 50 61 73 73 20 26 26 20 70 54 61 62  kOnePass && pTab
2f400 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b 0a 20 20  ->nCol<BMS ){.  
2f410 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
2f420 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
2f430 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
2f440 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
2f450 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
2f460 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
2f470 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2f480 65 50 34 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP4(v, sqlite3Vd
2f490 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
2f4a0 2d 31 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  -1, .           
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
2f4d0 54 52 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29  TR(n), P4_INT32)
2f4e0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f4f0 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20  ( n<=pTab->nCol 
2f500 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f510 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2f520 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61  te3TableLock(pPa
2f530 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e  rse, iDb, pTab->
2f540 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a  tnum, 0, pTab->z
2f550 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Name);.    }.#if
2f560 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f570 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
2f580 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
2f590 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2f5a0 20 57 48 45 52 45 5f 54 45 4d 50 5f 49 4e 44 45   WHERE_TEMP_INDE
2f5b0 58 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  X)!=0 ){.      c
2f5c0 6f 6e 73 74 72 75 63 74 41 75 74 6f 6d 61 74 69  onstructAutomati
2f5d0 63 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  cIndex(pParse, p
2f5e0 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  WC, pTabItem, no
2f5f0 74 52 65 61 64 79 2c 20 70 4c 65 76 65 6c 29 3b  tReady, pLevel);
2f600 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
2f610 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
2f620 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
2f630 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29  & WHERE_INDEXED)
2f640 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e 64  !=0 ){.      Ind
2f650 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65 6c  ex *pIx = pLevel
2f660 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20  ->plan.u.pIdx;. 
2f670 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
2f680 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
2f690 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
2f6a0 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e 74   pIx);.      int
2f6b0 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
2f6c0 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
2f6d0 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
2f6e0 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
2f6f0 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 61  chema );.      a
2f700 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e 3d  ssert( iIdxCur>=
2f710 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
2f720 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
2f730 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64  OP_OpenRead, iId
2f740 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c  xCur, pIx->tnum,
2f750 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20   iDb,.          
2f760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
2f770 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b 45  har*)pKey, P4_KE
2f780 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a  YINFO_HANDOFF);.
2f790 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
2f7a0 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78 2d  t((v, "%s", pIx-
2f7b0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a  >zName));.    }.
2f7c0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
2f7d0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
2f7e0 73 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 6e 6f  se, iDb);.    no
2f7f0 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
2f800 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
2f810 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
2f820 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  sor);.  }.  pWIn
2f830 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74  fo->iTop = sqlit
2f840 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
2f850 72 28 76 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  r(v);.  if( db->
2f860 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 67  mallocFailed ) g
2f870 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
2f880 72 6f 72 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ror;..  /* Gener
2f890 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
2f8a0 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
2f8b0 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
2f8c0 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
2f8d0 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
2f8e0 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
2f8f0 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
2f900 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
2f910 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
2f920 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
2f930 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
2f940 3d 30 3b 20 69 3c 6e 54 61 62 4c 69 73 74 3b 20  =0; i<nTabList; 
2f950 69 2b 2b 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  i++){.    pLevel
2f960 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
2f970 3b 0a 20 20 20 20 65 78 70 6c 61 69 6e 4f 6e 65  ;.    explainOne
2f980 53 63 61 6e 28 70 50 61 72 73 65 2c 20 70 54 61  Scan(pParse, pTa
2f990 62 4c 69 73 74 2c 20 70 4c 65 76 65 6c 2c 20 69  bList, pLevel, i
2f9a0 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
2f9b0 20 77 63 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20   wctrlFlags);.  
2f9c0 20 20 6e 6f 74 52 65 61 64 79 20 3d 20 63 6f 64    notReady = cod
2f9d0 65 4f 6e 65 4c 6f 6f 70 53 74 61 72 74 28 70 57  eOneLoopStart(pW
2f9e0 49 6e 66 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c  Info, i, wctrlFl
2f9f0 61 67 73 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a  ags, notReady);.
2fa00 20 20 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e      pWInfo->iCon
2fa10 74 69 6e 75 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  tinue = pLevel->
2fa20 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a 0a 23  addrCont;.  }..#
2fa30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2fa40 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e  T  /* For testin
2fa50 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
2fa60 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a  use only */.  /*
2fa70 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
2fa80 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
2fa90 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
2faa0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
2fab0 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78  ** and the index
2fac0 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
2fad0 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20 49 66  it (if any).  If
2fae0 20 74 68 65 20 74 61 62 6c 65 20 69 74 73 65 6c   the table itsel
2faf0 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73  f.  ** is not us
2fb00 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69 73 20  ed, its name is 
2fb10 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e  just '{}'.  If n
2fb20 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65 64 0a  o index is used.
2fb30 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
2fb40 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b 7d 22  s listed as "{}"
2fb50 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d 61 72  .  If the primar
2fb60 79 20 6b 65 79 20 69 73 20 75 73 65 64 20 74 68  y key is used th
2fb70 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d  e.  ** index nam
2fb80 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20  e is '*'..  */. 
2fb90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 61 62   for(i=0; i<nTab
2fba0 4c 69 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  List; i++){.    
2fbb0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
2fbc0 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
2fbd0 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
2fbe0 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
2fbf0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
2fc00 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
2fc10 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
2fc20 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
2fc30 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
2fc40 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
2fc50 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
2fc60 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
2fc70 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
2fc80 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
2fc90 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
2fca0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
2fcb0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
2fcc0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
2fcd0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
2fce0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
2fcf0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
2fd00 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
2fd10 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
2fd20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fd30 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
2fd40 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
2fd50 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
2fd60 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
2fd70 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
2fd80 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
2fd90 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
2fda0 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
2fdb0 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
2fdc0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
2fdd0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
2fde0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
2fdf0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
2fe00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
2fe10 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
2fe20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
2fe30 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
2fe40 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
2fe50 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
2fe60 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
2fe70 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2fe80 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
2fe90 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
2fea0 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
2feb0 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
2fec0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
2fed0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
2fee0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
2fef0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
2ff00 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
2ff10 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
2ff20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
2ff30 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
2ff40 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
2ff50 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
2ff60 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
2ff70 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
2ff80 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
2ff90 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
2ffa0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
2ffb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ffc0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
2ffd0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
2ffe0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2fff0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
30000 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
30010 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
30020 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
30030 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
30040 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
30050 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
30060 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
30070 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
30080 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
30090 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
300a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
300b0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
300c0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
300d0 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
300e0 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
300f0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
30100 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
30110 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
30120 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
30130 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
30140 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
30150 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
30160 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
30170 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
30180 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
30190 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
301a0 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
301b0 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 69 66  BeginError:.  if
301c0 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
301d0 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c 6f  pParse->nQueryLo
301e0 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 73 61 76  op = pWInfo->sav
301f0 65 64 4e 51 75 65 72 79 4c 6f 6f 70 3b 0a 20 20  edNQueryLoop;.  
30200 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28    whereInfoFree(
30210 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d  db, pWInfo);.  }
30220 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
30230 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
30240 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
30250 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
30260 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
30270 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
30280 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
30290 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
302a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
302b0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
302c0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
302d0 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
302e0 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
302f0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
30300 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
30310 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
30320 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
30330 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
30340 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
30350 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
30360 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
30370 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
30380 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
30390 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
303a0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
303b0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
303c0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  WInfo->nLevel-1;
303d0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
303e0 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
303f0 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
30400 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30410 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
30420 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
30430 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
30440 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
30450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30460 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
30470 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
30480 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
30490 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
304a0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
304b0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
304c0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
304d0 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
304e0 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
304f0 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
30500 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
30510 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
30520 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
30530 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
30540 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
30550 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
30560 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
30570 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
30580 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
30590 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
305a0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
305b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
305c0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
305d0 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
305e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
305f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
30600 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
30610 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
30620 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30630 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
30640 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
30650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
30660 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30670 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
30680 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
30690 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
306a0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
306b0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
306c0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
306d0 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
306e0 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
306f0 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
30700 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
30710 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
30720 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
30730 20 61 73 73 65 72 74 28 20 28 70 4c 65 76 65 6c   assert( (pLevel
30740 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
30750 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
30760 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
30770 7c 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  | (pLevel->plan.
30780 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
30790 49 4e 44 45 58 45 44 29 21 3d 30 20 29 3b 0a 20  INDEXED)!=0 );. 
307a0 20 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c       if( (pLevel
307b0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
307c0 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
307d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
307e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
307f0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
30800 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
30810 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
30820 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
30830 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29 7b  l->iIdxCur>=0 ){
30840 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
30850 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
30860 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65 6c  _NullRow, pLevel
30870 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20  ->iIdxCur);.    
30880 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
30890 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65 74  evel->op==OP_Ret
308a0 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 73  urn ){.        s
308b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
308c0 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70 4c  (v, OP_Gosub, pL
308d0 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c  evel->p1, pLevel
308e0 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20 20  ->addrFirst);.  
308f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30900 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
30910 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  dOp2(v, OP_Goto,
30920 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72   0, pLevel->addr
30930 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  First);.      }.
30940 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30950 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64  eJumpHere(v, add
30960 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
30970 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20   /* The "break" 
30980 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a  point is here, j
30990 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64  ust past the end
309a0 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f   of the outer lo
309b0 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e  op..  ** Set it.
309c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  .  */.  sqlite3V
309d0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
309e0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61  v, pWInfo->iBrea
309f0 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  k);..  /* Close 
30a00 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f  all of the curso
30a10 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65  rs that were ope
30a20 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  ned by sqlite3Wh
30a30 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
30a40 20 61 73 73 65 72 74 28 20 70 57 49 6e 66 6f 2d   assert( pWInfo-
30a50 3e 6e 4c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 57  >nLevel==1 || pW
30a60 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54  Info->nLevel==pT
30a70 61 62 4c 69 73 74 2d 3e 6e 53 72 63 20 29 3b 0a  abList->nSrc );.
30a80 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
30a90 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
30aa0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
30ab0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
30ac0 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
30ad0 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
30ae0 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
30af0 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
30b00 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
30b10 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
30b20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
30b30 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
30b40 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
30b50 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
30b60 3d 3d 30 0a 20 20 20 20 20 26 26 20 70 54 61 62  ==0.     && pTab
30b70 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 0a 20 20 20  ->pSelect==0.   
30b80 20 20 26 26 20 28 70 57 49 6e 66 6f 2d 3e 77 63    && (pWInfo->wc
30b90 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
30ba0 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 0a  _OMIT_CLOSE)==0.
30bb0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74      ){.      int
30bc0 20 77 73 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c   ws = pLevel->pl
30bd0 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20 20  an.wsFlags;.    
30be0 20 20 69 66 28 20 21 70 57 49 6e 66 6f 2d 3e 6f    if( !pWInfo->o
30bf0 6b 4f 6e 65 50 61 73 73 20 26 26 20 28 77 73 20  kOnePass && (ws 
30c00 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
30c10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
30c20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
30c30 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
30c40 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
30c50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30c60 20 69 66 28 20 28 77 73 20 26 20 57 48 45 52 45   if( (ws & WHERE
30c70 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26 20  _INDEXED)!=0 && 
30c80 28 77 73 20 26 20 57 48 45 52 45 5f 54 45 4d 50  (ws & WHERE_TEMP
30c90 5f 49 4e 44 45 58 29 3d 3d 30 20 29 7b 0a 20 20  _INDEX)==0 ){.  
30ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
30cb0 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
30cc0 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ose, pLevel->iId
30cd0 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  xCur);.      }. 
30ce0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
30cf0 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20 61  this scan uses a
30d00 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63 6f  n index, make co
30d10 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e 73  de substitutions
30d20 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20 20   to read data.  
30d30 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69 6e    ** from the in
30d40 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e 63  dex in preferenc
30d50 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e 20  e to the table. 
30d60 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73 20  Sometimes, this 
30d70 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68 65  means.    ** the
30d80 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76 65   table need neve
30d90 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e 20  r be read from. 
30da0 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f 72  This is a perfor
30db0 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20 20  mance boost,.   
30dc0 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65 20   ** as the vdbe 
30dd0 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74 69  level waits unti
30de0 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 72  l the table is r
30df0 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75 61  ead before actua
30e00 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b 69  lly.    ** seeki
30e10 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75 72  ng the table cur
30e20 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f 72  sor to the recor
30e30 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  d corresponding 
30e40 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20  to the current. 
30e50 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 69     ** position i
30e60 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  n the index..   
30e70 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c   ** .    ** Call
30e80 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65  s to the code ge
30e90 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65  nerator in betwe
30ea0 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  en sqlite3WhereB
30eb0 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20  egin and.    ** 
30ec0 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20  sqlite3WhereEnd 
30ed0 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65  will have create
30ee0 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66 65  d code that refe
30ef0 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65  rences the table
30f00 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
30f10 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61  .  This loop sca
30f20 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65  ns all that code
30f30 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63   looking for opc
30f40 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74  odes.    ** that
30f50 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 74   reference the t
30f60 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74  able and convert
30f70 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f  s them into opco
30f80 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  des that.    ** 
30f90 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e  reference the in
30fa0 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
30fb0 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
30fc0 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
30fd0 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26 26  E_INDEXED)!=0 &&
30fe0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
30ff0 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b  ed){.      int k
31000 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
31010 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
31020 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
31030 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  = pLevel->plan.u
31040 2e 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73  .pIdx;..      as
31050 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b  sert( pIdx!=0 );
31060 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c  .      pOp = sql
31070 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
31080 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a   pWInfo->iTop);.
31090 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c        last = sql
310a0 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
310b0 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f  ddr(v);.      fo
310c0 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70  r(k=pWInfo->iTop
310d0 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70  ; k<last; k++, p
310e0 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  Op++){.        i
310f0 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76  f( pOp->p1!=pLev
31100 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f  el->iTabCur ) co
31110 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
31120 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
31130 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  =OP_Column ){.  
31140 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
31150 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
31160 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
31170 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
31180 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
31190 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
311a0 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
311b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
311c0 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
311d0 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
311e0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
311f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
31200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31210 20 20 20 61 73 73 65 72 74 28 20 28 70 4c 65 76     assert( (pLev
31220 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
31230 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
31240 59 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  Y)==0.          
31250 20 20 20 20 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e       || j<pIdx->
31260 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20 20  nColumn );.     
31270 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70     }else if( pOp
31280 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77  ->opcode==OP_Row
31290 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
312a0 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
312b0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
312c0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
312d0 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a   = OP_IdxRowid;.
312e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
312f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
31300 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a  * Final cleanup.
31310 20 20 2a 2f 0a 20 20 70 50 61 72 73 65 2d 3e 6e    */.  pParse->n
31320 51 75 65 72 79 4c 6f 6f 70 20 3d 20 70 57 49 6e  QueryLoop = pWIn
31330 66 6f 2d 3e 73 61 76 65 64 4e 51 75 65 72 79 4c  fo->savedNQueryL
31340 6f 6f 70 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  oop;.  whereInfo
31350 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29  Free(db, pWInfo)
31360 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.