/ Hex Artifact Content
Login

Artifact acf24024bc00d84bfb83c82daa1d72a907cc8456:


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 2a 0a 2a 2a 20 24 49 64  izer"..**.** $Id
0330: 3a 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 34 31  : where.c,v 1.41
0340: 31 20 32 30 30 39 2f 30 37 2f 33 31 20 30 36 3a  1 2009/07/31 06:
0350: 31 34 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37  14:52 danielk197
0360: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0370: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0380: 22 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f  "../*.** Trace o
0390: 75 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a  utput macros.*/.
03a0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
03b0: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
03c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
03d0: 29 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  ).int sqlite3Whe
03e0: 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
03f0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
0400: 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
0410: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
0420: 45 42 55 47 29 0a 23 20 64 65 66 69 6e 65 20 57  EBUG).# define W
0430: 48 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66  HERETRACE(X)  if
0440: 28 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61  (sqlite3WhereTra
0450: 63 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67  ce) sqlite3Debug
0460: 50 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23  Printf X.#else.#
0470: 20 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41   define WHERETRA
0480: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0490: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
04a0: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
04b0: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
04c0: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79   WhereClause;.ty
04d0: 70 65 64 65 66 20 73 74 72 75 63 74 20 57 68 65  pedef struct Whe
04e0: 72 65 4d 61 73 6b 53 65 74 20 57 68 65 72 65 4d  reMaskSet WhereM
04f0: 61 73 6b 53 65 74 3b 0a 74 79 70 65 64 65 66 20  askSet;.typedef 
0500: 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49 6e  struct WhereOrIn
0510: 66 6f 20 57 68 65 72 65 4f 72 49 6e 66 6f 3b 0a  fo WhereOrInfo;.
0520: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
0530: 68 65 72 65 41 6e 64 49 6e 66 6f 20 57 68 65 72  hereAndInfo Wher
0540: 65 41 6e 64 49 6e 66 6f 3b 0a 74 79 70 65 64 65  eAndInfo;.typede
0550: 66 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6f  f struct WhereCo
0560: 73 74 20 57 68 65 72 65 43 6f 73 74 3b 0a 0a 2f  st WhereCost;../
0570: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0580: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0590: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
05a0: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
05b0: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
05c0: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
05d0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05e0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05f0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
0600: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
0610: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
0620: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
0630: 68 65 72 73 20 62 79 20 41 4e 44 20 6f 70 65 72  hers by AND oper
0640: 61 74 6f 72 73 2c 0a 2a 2a 20 75 73 75 61 6c 6c  ators,.** usuall
0650: 79 2c 20 6f 72 20 73 6f 6d 65 74 69 6d 65 73 20  y, or sometimes 
0660: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 73  subexpressions s
0670: 65 70 61 72 61 74 65 64 20 62 79 20 4f 52 2e 0a  eparated by OR..
0680: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0690: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
06a0: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
06b0: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
06c0: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
06d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
06e0: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
06f0: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
0700: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
0710: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
0720: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
0730: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
0740: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
0750: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
0760: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
0770: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0780: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0790: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
07a0: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
07b0: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
07c0: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
07d0: 65 72 65 54 65 72 6d 2e 75 2e 6c 65 66 74 43 6f  ereTerm.u.leftCo
07e0: 6c 75 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a  lumn record the.
07f0: 2a 2a 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  ** cursor number
0800: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   and column numb
0810: 65 72 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65  er for X.  Where
0820: 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72 20 72  Term.eOperator r
0830: 65 63 6f 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f  ecords.** the <o
0840: 70 3e 20 75 73 69 6e 67 20 61 20 62 69 74 6d 61  p> using a bitma
0850: 73 6b 20 65 6e 63 6f 64 69 6e 67 20 64 65 66 69  sk encoding defi
0860: 6e 65 64 20 62 79 20 57 4f 5f 78 78 78 20 62 65  ned by WO_xxx be
0870: 6c 6f 77 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65  low.  The.** use
0880: 20 6f 66 20 61 20 62 69 74 6d 61 73 6b 20 65 6e   of a bitmask en
0890: 63 6f 64 69 6e 67 20 66 6f 72 20 74 68 65 20 6f  coding for the o
08a0: 70 65 72 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75  perator allows u
08b0: 73 20 74 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71  s to search.** q
08c0: 75 69 63 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73  uickly for terms
08d0: 20 74 68 61 74 20 6d 61 74 63 68 20 61 6e 79 20   that match any 
08e0: 6f 66 20 73 65 76 65 72 61 6c 20 64 69 66 66 65  of several diffe
08f0: 72 65 6e 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a  rent operators..
0900: 2a 2a 0a 2a 2a 20 41 20 57 68 65 72 65 54 65 72  **.** A WhereTer
0910: 6d 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20  m might also be 
0920: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
0930: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
0940: 79 20 4f 52 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  y OR:.**.**     
0950: 20 20 20 20 28 74 31 2e 58 20 3c 6f 70 3e 20 3c      (t1.X <op> <
0960: 65 78 70 72 3e 29 20 4f 52 20 28 74 31 2e 59 20  expr>) OR (t1.Y 
0970: 3c 6f 70 3e 20 3c 65 78 70 72 3e 29 20 4f 52 20  <op> <expr>) OR 
0980: 2e 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  .....**.** In th
0990: 69 73 20 73 65 63 6f 6e 64 20 63 61 73 65 2c 20  is second case, 
09a0: 77 74 46 6c 61 67 20 61 73 20 74 68 65 20 54 45  wtFlag as the TE
09b0: 52 4d 5f 4f 52 49 4e 46 4f 20 73 65 74 20 61 6e  RM_ORINFO set an
09c0: 64 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  d eOperator==WO_
09d0: 4f 52 0a 2a 2a 20 61 6e 64 20 74 68 65 20 57 68  OR.** and the Wh
09e0: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
09f0: 6f 20 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74  o field points t
0a00: 6f 20 61 75 78 69 6c 69 61 72 79 20 69 6e 66 6f  o auxiliary info
0a10: 72 6d 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  rmation that.** 
0a20: 69 73 20 63 6f 6c 6c 65 63 74 65 64 20 61 62 6f  is collected abo
0a30: 75 74 20 74 68 65 0a 2a 2a 0a 2a 2a 20 49 66 20  ut the.**.** If 
0a40: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
0a50: 45 52 45 20 63 6c 61 75 73 65 20 64 6f 65 73 20  ERE clause does 
0a60: 6e 6f 74 20 6d 61 74 63 68 20 65 69 74 68 65 72  not match either
0a70: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 65 76   of the two prev
0a80: 69 6f 75 73 0a 2a 2a 20 63 61 74 65 67 6f 72 69  ious.** categori
0a90: 65 73 2c 20 74 68 65 6e 20 65 4f 70 65 72 61 74  es, then eOperat
0aa0: 6f 72 3d 3d 30 2e 20 20 54 68 65 20 57 68 65 72  or==0.  The Wher
0ab0: 65 54 65 72 6d 2e 70 45 78 70 72 20 66 69 65 6c  eTerm.pExpr fiel
0ac0: 64 20 69 73 20 73 74 69 6c 6c 20 73 65 74 0a 2a  d is still set.*
0ad0: 2a 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  * to the origina
0ae0: 6c 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  l subexpression 
0af0: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 77 74 46 6c  content and wtFl
0b00: 61 67 73 20 69 73 20 73 65 74 20 75 70 20 61 70  ags is set up ap
0b10: 70 72 6f 70 72 69 61 74 65 6c 79 0a 2a 2a 20 62  propriately.** b
0b20: 75 74 20 6e 6f 20 6f 74 68 65 72 20 66 69 65 6c  ut no other fiel
0b30: 64 73 20 69 6e 20 74 68 65 20 57 68 65 72 65 54  ds in the WhereT
0b40: 65 72 6d 20 6f 62 6a 65 63 74 20 61 72 65 20 6d  erm object are m
0b50: 65 61 6e 69 6e 67 66 75 6c 2e 0a 2a 2a 0a 2a 2a  eaningful..**.**
0b60: 20 57 68 65 6e 20 65 4f 70 65 72 61 74 6f 72 21   When eOperator!
0b70: 3d 30 2c 20 70 72 65 72 65 71 52 69 67 68 74 20  =0, prereqRight 
0b80: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0b90: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0ba0: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0bb0: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0bc0: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0bd0: 6e 67 6c 65 20 57 68 65 72 65 4d 61 73 6b 53 65  ngle WhereMaskSe
0be0: 74 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e  t structure tran
0bf0: 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72  slates.** cursor
0c00: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74   number into bit
0c10: 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c  s and the transl
0c20: 61 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72  ated bit is stor
0c30: 65 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71  ed in the prereq
0c40: 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65  .** fields.  The
0c50: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20   translation is 
0c60: 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f  used in order to
0c70: 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75   maximize the nu
0c80: 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20  mber of.** bits 
0c90: 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e  that will fit in
0ca0: 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65   a Bitmask.  The
0cb0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0cc0: 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  bers might be.**
0cd0: 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72   spread out over
0ce0: 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76   the non-negativ
0cf0: 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72  e integers.  For
0d00: 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75   example, the cu
0d10: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
0d20: 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39  might be 3, 8, 9
0d30: 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31  , 10, 20, 23, 41
0d40: 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 57  , and 45.  The W
0d50: 68 65 72 65 4d 61 73 6b 53 65 74 0a 2a 2a 20 74  hereMaskSet.** t
0d60: 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20  ranslates these 
0d70: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
0d80: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
0d90: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a  cutive integers.
0da0: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
0db0: 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  h 0 in order to 
0dc0: 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f  make the best po
0dd0: 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68  ssible use of th
0de0: 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62  e available.** b
0df0: 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61  its in the Bitma
0e00: 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20  sk.  So, in the 
0e10: 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74  example above, t
0e20: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
0e30: 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61  s.** would be ma
0e40: 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65  pped into intege
0e50: 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a  rs 0 through 7..
0e60: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72  **.** The number
0e70: 20 6f 66 20 74 65 72 6d 73 20 69 6e 20 61 20 6a   of terms in a j
0e80: 6f 69 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 62  oin is limited b
0e90: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  y the number of 
0ea0: 62 69 74 73 0a 2a 2a 20 69 6e 20 70 72 65 72 65  bits.** in prere
0eb0: 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72 65  qRight and prere
0ec0: 71 41 6c 6c 2e 20 20 54 68 65 20 64 65 66 61 75  qAll.  The defau
0ed0: 6c 74 20 69 73 20 36 34 20 62 69 74 73 2c 20 68  lt is 64 bits, h
0ee0: 65 6e 63 65 20 53 51 4c 69 74 65 0a 2a 2a 20 69  ence SQLite.** i
0ef0: 73 20 6f 6e 6c 79 20 61 62 6c 65 20 74 6f 20 70  s only able to p
0f00: 72 6f 63 65 73 73 20 6a 6f 69 6e 73 20 77 69 74  rocess joins wit
0f10: 68 20 36 34 20 6f 72 20 66 65 77 65 72 20 74 61  h 64 or fewer ta
0f20: 62 6c 65 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  bles..*/.typedef
0f30: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0f40: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0f50: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0f60: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0f80: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0f90: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 69  xpression that i
0fa0: 73 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  s this term */. 
0fb0: 20 69 6e 74 20 69 50 61 72 65 6e 74 3b 20 20 20   int iParent;   
0fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61           /* Disa
0fd0: 62 6c 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65  ble pWC->a[iPare
0fe0: 6e 74 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65  nt] when this te
0ff0: 72 6d 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  rm disabled */. 
1000: 20 69 6e 74 20 6c 65 66 74 43 75 72 73 6f 72 3b   int leftCursor;
1010: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
1020: 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69  or number of X i
1030: 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e  n "X <op> <expr>
1040: 22 20 2a 2f 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  " */.  union {. 
1050: 20 20 20 69 6e 74 20 6c 65 66 74 43 6f 6c 75 6d     int leftColum
1060: 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  n;         /* Co
1070: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58  lumn number of X
1080: 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70   in "X <op> <exp
1090: 72 3e 22 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  r>" */.    Where
10a0: 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e 66 6f 3b  OrInfo *pOrInfo;
10b0: 20 20 20 2f 2a 20 45 78 74 72 61 20 69 6e 66 6f     /* Extra info
10c0: 72 6d 61 74 69 6f 6e 20 69 66 20 65 4f 70 65 72  rmation if eOper
10d0: 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 2a 2f 0a 20  ator==WO_OR */. 
10e0: 20 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20     WhereAndInfo 
10f0: 2a 70 41 6e 64 49 6e 66 6f 3b 20 2f 2a 20 45 78  *pAndInfo; /* Ex
1100: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1110: 69 66 20 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  if eOperator==WO
1120: 5f 41 4e 44 20 2a 2f 0a 20 20 7d 20 75 3b 0a 20  _AND */.  } u;. 
1130: 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b 20   u16 eOperator; 
1140: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57 4f           /* A WO
1150: 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72 69  _xx value descri
1160: 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20 75  bing <op> */.  u
1170: 38 20 77 74 46 6c 61 67 73 3b 20 20 20 20 20 20  8 wtFlags;      
1180: 20 20 20 20 20 20 20 2f 2a 20 54 45 52 4d 5f 78         /* TERM_x
1190: 78 78 20 62 69 74 20 66 6c 61 67 73 2e 20 20 53  xx bit flags.  S
11a0: 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75 38  ee below */.  u8
11b0: 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20   nChild;        
11c0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
11d0: 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61 74  of children that
11e0: 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75 73   must disable us
11f0: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
1200: 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f 2a  e *pWC;       /*
1210: 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69 73   The clause this
1220: 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f 66   term is part of
1230: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72   */.  Bitmask pr
1240: 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f 2a  ereqRight;    /*
1250: 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c   Bitmask of tabl
1260: 65 73 20 75 73 65 64 20 62 79 20 70 45 78 70 72  es used by pExpr
1270: 2d 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69  ->pRight */.  Bi
1280: 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b  tmask prereqAll;
1290: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
12a0: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
12b0: 65 6e 63 65 64 20 62 79 20 70 45 78 70 72 20 2a  enced by pExpr *
12c0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  /.};../*.** Allo
12d0: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 57 68  wed values of Wh
12e0: 65 72 65 54 65 72 6d 2e 77 74 46 6c 61 67 73 0a  ereTerm.wtFlags.
12f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
1300: 44 59 4e 41 4d 49 43 20 20 20 20 30 78 30 31 20  DYNAMIC    0x01 
1310: 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 63 61 6c    /* Need to cal
1320: 6c 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  l sqlite3ExprDel
1330: 65 74 65 28 64 62 2c 20 70 45 78 70 72 29 20 2a  ete(db, pExpr) *
1340: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
1350: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
1360: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
1370: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
1380: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
1390: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
13a0: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
13b0: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
13c0: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
13d0: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
13e0: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
13f0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
1400: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 49 4e 46 4f  fine TERM_ORINFO
1410: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 4e       0x10   /* N
1420: 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65 20  eed to free the 
1430: 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49  WhereTerm.u.pOrI
1440: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 23 64  nfo object */.#d
1450: 65 66 69 6e 65 20 54 45 52 4d 5f 41 4e 44 49 4e  efine TERM_ANDIN
1460: 46 4f 20 20 20 20 30 78 32 30 20 20 20 2f 2a 20  FO    0x20   /* 
1470: 4e 65 65 64 20 74 6f 20 66 72 65 65 20 74 68 65  Need to free the
1480: 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 41 6e   WhereTerm.u.pAn
1490: 64 49 6e 66 6f 20 6f 62 6a 20 2a 2f 0a 23 64 65  dInfo obj */.#de
14a0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
14b0: 20 20 20 20 20 30 78 34 30 20 20 20 2f 2a 20 55       0x40   /* U
14c0: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
14d0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
14e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
14f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1500: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1510: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
1520: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
1530: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
1540: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1550: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1560: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1570: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63  eTerms..*/.struc
1580: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a  t WhereClause {.
1590: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
15a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15b0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
15c0: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
15d0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 2f  et *pMaskSet;  /
15e0: 2a 20 4d 61 70 70 69 6e 67 20 6f 66 20 74 61 62  * Mapping of tab
15f0: 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  le cursor number
1600: 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f  s to bitmasks */
1610: 0a 20 20 42 69 74 6d 61 73 6b 20 76 6d 61 73 6b  .  Bitmask vmask
1620: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
1630: 69 74 6d 61 73 6b 20 69 64 65 6e 74 69 66 79 69  itmask identifyi
1640: 6e 67 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  ng virtual table
1650: 20 63 75 72 73 6f 72 73 20 2a 2f 0a 20 20 75 38   cursors */.  u8
1660: 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   op;            
1670: 20 20 20 20 20 20 20 2f 2a 20 53 70 6c 69 74 20         /* Split 
1680: 6f 70 65 72 61 74 6f 72 2e 20 20 54 4b 5f 41 4e  operator.  TK_AN
1690: 44 20 6f 72 20 54 4b 5f 4f 52 20 2a 2f 0a 20 20  D or TK_OR */.  
16a0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
16b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16c0: 65 72 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  er of terms */. 
16d0: 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
16f0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
1700: 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65  n a[] */.  Where
1710: 54 65 72 6d 20 2a 61 3b 20 20 20 20 20 20 20 20  Term *a;        
1720: 20 20 20 20 2f 2a 20 45 61 63 68 20 61 5b 5d 20      /* Each a[] 
1730: 64 65 73 63 72 69 62 65 73 20 61 20 74 65 72 6d  describes a term
1740: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
1750: 75 61 73 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  uase */.#if defi
1760: 6e 65 64 28 53 51 4c 49 54 45 5f 53 4d 41 4c 4c  ned(SQLITE_SMALL
1770: 5f 53 54 41 43 4b 29 0a 20 20 57 68 65 72 65 54  _STACK).  WhereT
1780: 65 72 6d 20 61 53 74 61 74 69 63 5b 31 5d 3b 20  erm aStatic[1]; 
1790: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 73 74     /* Initial st
17a0: 61 74 69 63 20 73 70 61 63 65 20 66 6f 72 20 61  atic space for a
17b0: 5b 5d 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 57 68  [] */.#else.  Wh
17c0: 65 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b  ereTerm aStatic[
17d0: 38 5d 3b 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  8];    /* Initia
17e0: 6c 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66  l static space f
17f0: 6f 72 20 61 5b 5d 20 2a 2f 0a 23 65 6e 64 69 66  or a[] */.#endif
1800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68 65  .};../*.** A Whe
1810: 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70 65  reTerm with eOpe
1820: 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 68 61 73  rator==WO_OR has
1830: 20 69 74 73 20 75 2e 70 4f 72 49 6e 66 6f 20 70   its u.pOrInfo p
1840: 6f 69 6e 74 65 72 20 73 65 74 20 74 6f 0a 2a 2a  ointer set to.**
1850: 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61   a dynamically a
1860: 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74 61 6e 63  llocated instanc
1870: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1880: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ng structure..*/
1890: 0a 73 74 72 75 63 74 20 57 68 65 72 65 4f 72 49  .struct WhereOrI
18a0: 6e 66 6f 20 7b 0a 20 20 57 68 65 72 65 43 6c 61  nfo {.  WhereCla
18b0: 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20 20  use wc;         
18c0: 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
18d0: 6e 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73 20  n into subterms 
18e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e 64  */.  Bitmask ind
18f0: 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  exable;       /*
1900: 20 42 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   Bitmask of all 
1910: 69 6e 64 65 78 61 62 6c 65 20 74 61 62 6c 65 73  indexable tables
1920: 20 69 6e 20 74 68 65 20 63 6c 61 75 73 65 20 2a   in the clause *
1930: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 57 68  /.};../*.** A Wh
1940: 65 72 65 54 65 72 6d 20 77 69 74 68 20 65 4f 70  ereTerm with eOp
1950: 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 68  erator==WO_AND h
1960: 61 73 20 69 74 73 20 75 2e 70 41 6e 64 49 6e 66  as its u.pAndInf
1970: 6f 20 70 6f 69 6e 74 65 72 20 73 65 74 20 74 6f  o pointer set to
1980: 0a 2a 2a 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c  .** a dynamicall
1990: 79 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 73 74  y allocated inst
19a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
19b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
19c0: 0a 2a 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65  .*/.struct Where
19d0: 41 6e 64 49 6e 66 6f 20 7b 0a 20 20 57 68 65 72  AndInfo {.  Wher
19e0: 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20  eClause wc;     
19f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 75 62 65       /* The sube
1a00: 78 70 72 65 73 73 69 6f 6e 20 62 72 6f 6b 65 6e  xpression broken
1a10: 20 6f 75 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a   out */.};../*.*
1a20: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
1a30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
1a40: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
1a50: 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e  rack of a mappin
1a60: 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42  g.** between VDB
1a70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
1a80: 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65   and bits of the
1a90: 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68 65   bitmasks in Whe
1aa0: 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  reTerm..**.** Th
1ab0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
1ac0: 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20  mbers are small 
1ad0: 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e  integers contain
1ae0: 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73  ed in .** SrcLis
1af0: 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61  t_item.iCursor a
1b00: 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66  nd Expr.iTable f
1b10: 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20  ields.  For any 
1b20: 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20  given WHERE .** 
1b30: 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73  clause, the curs
1b40: 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74  or numbers might
1b50: 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20   not begin with 
1b60: 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74  0 and they might
1b70: 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73  .** contain gaps
1b80: 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e   in the numberin
1b90: 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74  g sequence.  But
1ba0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
1bb0: 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20   maximum.** use 
1bc0: 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f  of the bits in o
1bd0: 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68  ur bitmasks.  Th
1be0: 69 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f  is structure pro
1bf0: 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a  vides a mapping.
1c00: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72  ** from the spar
1c10: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1c20: 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69  s into consecuti
1c30: 76 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69  ve integers begi
1c40: 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e  nning.** with 0.
1c50: 0a 2a 2a 0a 2a 2a 20 49 66 20 57 68 65 72 65 4d  .**.** If WhereM
1c60: 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20  askSet.ix[A]==B 
1c70: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68  it means that Th
1c80: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1c90: 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  Bitmask.** corre
1ca0: 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73  sponds VDBE curs
1cb0: 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68  or number B.  Th
1cc0: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1cd0: 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e  bitmask is 1<<A.
1ce0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
1cf0: 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45  le, if the WHERE
1d00: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
1d10: 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44  on used these VD
1d20: 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20  BE.** cursors:  
1d30: 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c  4, 5, 8, 29, 57,
1d40: 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20   73.  Then the  
1d50: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
1d60: 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20  ucture.** would 
1d70: 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72  map those cursor
1d80: 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69   numbers into bi
1d90: 74 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a  ts 0 through 5..
1da0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1db0: 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e  the mapping is n
1dc0: 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f  ot necessarily o
1dd0: 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20  rdered.  In the 
1de0: 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65  example.** above
1df0: 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69  , the mapping mi
1e00: 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73  ght go like this
1e10: 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38  :  4->3, 5->1, 8
1e20: 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35  ->2, 29->0,.** 5
1e30: 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72  7->5, 73->4.  Or
1e40: 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65   one of 719 othe
1e50: 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d  r combinations m
1e60: 69 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74  ight be used. It
1e70: 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  .** does not rea
1e80: 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61  lly matter.  Wha
1e90: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  t is important i
1ea0: 73 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75  s that sparse cu
1eb0: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20  rsor.** numbers 
1ec0: 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69  all get mapped i
1ed0: 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20  nto bit numbers 
1ee0: 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
1ef0: 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a  0 and contain.**
1f00: 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72   no gaps..*/.str
1f10: 75 63 74 20 57 68 65 72 65 4d 61 73 6b 53 65 74  uct WhereMaskSet
1f20: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f50: 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20  assigned cursor 
1f60: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1f70: 69 78 5b 42 4d 53 5d 3b 20 20 20 20 20 20 20 20  ix[BMS];        
1f80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1f90: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1fa0: 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a  each bit */.};..
1fb0: 2f 2a 0a 2a 2a 20 41 20 57 68 65 72 65 43 6f 73  /*.** A WhereCos
1fc0: 74 20 6f 62 6a 65 63 74 20 72 65 63 6f 72 64 73  t object records
1fd0: 20 61 20 6c 6f 6f 6b 75 70 20 73 74 72 61 74 65   a lookup strate
1fe0: 67 79 20 61 6e 64 20 74 68 65 20 65 73 74 69 6d  gy and the estim
1ff0: 61 74 65 64 0a 2a 2a 20 63 6f 73 74 20 6f 66 20  ated.** cost of 
2000: 70 75 72 73 75 69 6e 67 20 74 68 61 74 20 73 74  pursuing that st
2010: 72 61 74 65 67 79 2e 0a 2a 2f 0a 73 74 72 75 63  rategy..*/.struc
2020: 74 20 57 68 65 72 65 43 6f 73 74 20 7b 0a 20 20  t WhereCost {.  
2030: 57 68 65 72 65 50 6c 61 6e 20 70 6c 61 6e 3b 20  WherePlan plan; 
2040: 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70     /* The lookup
2050: 20 73 74 72 61 74 65 67 79 20 2a 2f 0a 20 20 64   strategy */.  d
2060: 6f 75 62 6c 65 20 72 43 6f 73 74 3b 20 20 20 20  ouble rCost;    
2070: 20 20 2f 2a 20 4f 76 65 72 61 6c 6c 20 63 6f 73    /* Overall cos
2080: 74 20 6f 66 20 70 75 72 73 75 69 6e 67 20 74 68  t of pursuing th
2090: 69 73 20 73 65 61 72 63 68 20 73 74 72 61 74 65  is search strate
20a0: 67 79 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 6e  gy */.  double n
20b0: 52 6f 77 3b 20 20 20 20 20 20 20 2f 2a 20 45 73  Row;       /* Es
20c0: 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
20d0: 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f  f output rows */
20e0: 0a 20 20 42 69 74 6d 61 73 6b 20 75 73 65 64 3b  .  Bitmask used;
20f0: 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b        /* Bitmask
2100: 20 6f 66 20 63 75 72 73 6f 72 73 20 75 73 65 64   of cursors used
2110: 20 62 79 20 74 68 69 73 20 70 6c 61 6e 20 2a 2f   by this plan */
2120: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 69 74 6d 61  .};../*.** Bitma
2130: 73 6b 73 20 66 6f 72 20 74 68 65 20 6f 70 65 72  sks for the oper
2140: 61 74 6f 72 73 20 74 68 61 74 20 69 6e 64 69 63  ators that indic
2150: 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 65  es are able to e
2160: 78 70 6c 6f 69 74 2e 20 20 41 6e 0a 2a 2a 20 4f  xploit.  An.** O
2170: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  R-ed combination
2180: 20 6f 66 20 74 68 65 73 65 20 76 61 6c 75 65 73   of these values
2190: 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68 65   can be used whe
21a0: 6e 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 0a  n searching for.
21b0: 2a 2a 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  ** terms in the 
21c0: 77 68 65 72 65 20 63 6c 61 75 73 65 2e 0a 2a 2f  where clause..*/
21d0: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 49 4e 20 20  .#define WO_IN  
21e0: 20 20 20 30 78 30 30 31 0a 23 64 65 66 69 6e 65     0x001.#define
21f0: 20 57 4f 5f 45 51 20 20 20 20 20 30 78 30 30 32   WO_EQ     0x002
2200: 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20  .#define WO_LT  
2210: 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c     (WO_EQ<<(TK_L
2220: 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e  T-TK_EQ)).#defin
2230: 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f  e WO_LE     (WO_
2240: 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51  EQ<<(TK_LE-TK_EQ
2250: 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 47 54  )).#define WO_GT
2260: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
2270: 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _GT-TK_EQ)).#def
2280: 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20 28 57  ine WO_GE     (W
2290: 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f  O_EQ<<(TK_GE-TK_
22a0: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
22b0: 4d 41 54 43 48 20 20 30 78 30 34 30 0a 23 64 65  MATCH  0x040.#de
22c0: 66 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 30  fine WO_ISNULL 0
22d0: 78 30 38 30 0a 23 64 65 66 69 6e 65 20 57 4f 5f  x080.#define WO_
22e0: 4f 52 20 20 20 20 20 30 78 31 30 30 20 20 20 20  OR     0x100    
22f0: 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20 6d 6f 72     /* Two or mor
2300: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74  e OR-connected t
2310: 65 72 6d 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  erms */.#define 
2320: 57 4f 5f 41 4e 44 20 20 20 20 30 78 32 30 30 20  WO_AND    0x200 
2330: 20 20 20 20 20 20 2f 2a 20 54 77 6f 20 6f 72 20        /* Two or 
2340: 6d 6f 72 65 20 41 4e 44 2d 63 6f 6e 6e 65 63 74  more AND-connect
2350: 65 64 20 74 65 72 6d 73 20 2a 2f 0a 0a 23 64 65  ed terms */..#de
2360: 66 69 6e 65 20 57 4f 5f 41 4c 4c 20 20 20 20 30  fine WO_ALL    0
2370: 78 66 66 66 20 20 20 20 20 20 20 2f 2a 20 4d 61  xfff       /* Ma
2380: 73 6b 20 6f 66 20 61 6c 6c 20 70 6f 73 73 69 62  sk of all possib
2390: 6c 65 20 57 4f 5f 2a 20 76 61 6c 75 65 73 20 2a  le WO_* values *
23a0: 2f 0a 23 64 65 66 69 6e 65 20 57 4f 5f 53 49 4e  /.#define WO_SIN
23b0: 47 4c 45 20 30 78 30 66 66 20 20 20 20 20 20 20  GLE 0x0ff       
23c0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 61 6c 6c 20 6e  /* Mask of all n
23d0: 6f 6e 2d 63 6f 6d 70 6f 75 6e 64 20 57 4f 5f 2a  on-compound WO_*
23e0: 20 76 61 6c 75 65 73 20 2a 2f 0a 0a 2f 2a 0a 2a   values */../*.*
23f0: 2a 20 56 61 6c 75 65 20 66 6f 72 20 77 73 46 6c  * Value for wsFl
2400: 61 67 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  ags returned by 
2410: 62 65 73 74 49 6e 64 65 78 28 29 20 61 6e 64 20  bestIndex() and 
2420: 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 57 68 65  stored in.** Whe
2430: 72 65 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 2e  reLevel.wsFlags.
2440: 20 20 54 68 65 73 65 20 66 6c 61 67 73 20 64 65    These flags de
2450: 74 65 72 6d 69 6e 65 20 77 68 69 63 68 20 73 65  termine which se
2460: 61 72 63 68 0a 2a 2a 20 73 74 72 61 74 65 67 69  arch.** strategi
2470: 65 73 20 61 72 65 20 61 70 70 72 6f 70 72 69 61  es are appropria
2480: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  te..**.** The le
2490: 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20  ast significant 
24a0: 31 32 20 62 69 74 73 20 69 73 20 72 65 73 65 72  12 bits is reser
24b0: 76 65 64 20 61 73 20 61 20 6d 61 73 6b 20 66 6f  ved as a mask fo
24c0: 72 20 57 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f  r WO_ values abo
24d0: 76 65 2e 0a 2a 2a 20 54 68 65 20 57 68 65 72 65  ve..** The Where
24e0: 4c 65 76 65 6c 2e 77 73 46 6c 61 67 73 20 66 69  Level.wsFlags fi
24f0: 65 6c 64 20 69 73 20 75 73 75 61 6c 6c 79 20 73  eld is usually s
2500: 65 74 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45  et to WO_IN|WO_E
2510: 51 7c 57 4f 5f 49 53 4e 55 4c 4c 2e 0a 2a 2a 20  Q|WO_ISNULL..** 
2520: 42 75 74 20 69 66 20 74 68 65 20 74 61 62 6c 65  But if the table
2530: 20 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61   is the right ta
2540: 62 6c 65 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f  ble of a left jo
2550: 69 6e 2c 20 57 68 65 72 65 4c 65 76 65 6c 2e 77  in, WhereLevel.w
2560: 73 46 6c 61 67 73 0a 2a 2a 20 69 73 20 73 65 74  sFlags.** is set
2570: 20 74 6f 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 2e   to WO_IN|WO_EQ.
2580: 20 20 54 68 65 20 57 68 65 72 65 4c 65 76 65 6c    The WhereLevel
2590: 2e 77 73 46 6c 61 67 73 20 66 69 65 6c 64 20 63  .wsFlags field c
25a0: 61 6e 20 74 68 65 6e 20 62 65 20 75 73 65 64 20  an then be used 
25b0: 61 73 0a 2a 2a 20 74 68 65 20 22 6f 70 22 20 70  as.** the "op" p
25c0: 61 72 61 6d 65 74 65 72 20 74 6f 20 66 69 6e 64  arameter to find
25d0: 54 65 72 6d 20 77 68 65 6e 20 77 65 20 61 72 65  Term when we are
25e0: 20 72 65 73 6f 6c 76 69 6e 67 20 65 71 75 61 6c   resolving equal
25f0: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  ity constraints.
2600: 0a 2a 2a 20 49 53 4e 55 4c 4c 20 63 6f 6e 73 74  .** ISNULL const
2610: 72 61 69 6e 74 73 20 77 69 6c 6c 20 74 68 65 6e  raints will then
2620: 20 6e 6f 74 20 62 65 20 75 73 65 64 20 6f 6e 20   not be used on 
2630: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
2640: 6f 66 20 61 20 6c 65 66 74 0a 2a 2a 20 6a 6f 69  of a left.** joi
2650: 6e 2e 20 20 54 69 63 6b 65 74 73 20 23 32 31 37  n.  Tickets #217
2660: 37 20 61 6e 64 20 23 32 31 38 39 2e 0a 2a 2f 0a  7 and #2189..*/.
2670: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
2680: 57 49 44 5f 45 51 20 20 20 20 20 30 78 30 30 30  WID_EQ     0x000
2690: 30 31 30 30 30 20 20 2f 2a 20 72 6f 77 69 64 3d  01000  /* rowid=
26a0: 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e  EXPR or rowid IN
26b0: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
26c0: 65 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  e WHERE_ROWID_RA
26d0: 4e 47 45 20 20 30 78 30 30 30 30 32 30 30 30 20  NGE  0x00002000 
26e0: 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52 20 61   /* rowid<EXPR a
26f0: 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58 50 52  nd/or rowid>EXPR
2700: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2710: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20 20 30  E_COLUMN_EQ    0
2720: 78 30 30 30 31 30 30 30 30 20 20 2f 2a 20 78 3d  x00010000  /* x=
2730: 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e 2e  EXPR or x IN (..
2740: 2e 29 20 6f 72 20 78 20 49 53 20 4e 55 4c 4c 20  .) or x IS NULL 
2750: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
2760: 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 30 78  _COLUMN_RANGE 0x
2770: 30 30 30 32 30 30 30 30 20 20 2f 2a 20 78 3c 45  00020000  /* x<E
2780: 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e 45 58 50  XPR and/or x>EXP
2790: 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45  R */.#define WHE
27a0: 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 20 20 20  RE_COLUMN_IN    
27b0: 30 78 30 30 30 34 30 30 30 30 20 20 2f 2a 20 78  0x00040000  /* x
27c0: 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65   IN (...) */.#de
27d0: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
27e0: 4e 5f 4e 55 4c 4c 20 20 30 78 30 30 30 38 30 30  N_NULL  0x000800
27f0: 30 30 20 20 2f 2a 20 78 20 49 53 20 4e 55 4c 4c  00  /* x IS NULL
2800: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2810: 45 5f 49 4e 44 45 58 45 44 20 20 20 20 20 20 30  E_INDEXED      0
2820: 78 30 30 30 66 30 30 30 30 20 20 2f 2a 20 41 6e  x000f0000  /* An
2830: 79 74 68 69 6e 67 20 74 68 61 74 20 75 73 65 73  ything that uses
2840: 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 23 64 65   an index */.#de
2850: 66 69 6e 65 20 57 48 45 52 45 5f 49 4e 5f 41 42  fine WHERE_IN_AB
2860: 4c 45 20 20 20 20 20 20 30 78 30 30 30 66 31 30  LE      0x000f10
2870: 30 30 20 20 2f 2a 20 41 62 6c 65 20 74 6f 20 73  00  /* Able to s
2880: 75 70 70 6f 72 74 20 61 6e 20 49 4e 20 6f 70 65  upport an IN ope
2890: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
28a0: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
28b0: 20 20 20 20 30 78 30 30 31 30 30 30 30 30 20 20      0x00100000  
28c0: 2f 2a 20 78 3c 45 58 50 52 20 6f 72 20 78 3c 3d  /* x<EXPR or x<=
28d0: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20  EXPR constraint 
28e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45  */.#define WHERE
28f0: 5f 42 54 4d 5f 4c 49 4d 49 54 20 20 20 20 30 78  _BTM_LIMIT    0x
2900: 30 30 32 30 30 30 30 30 20 20 2f 2a 20 78 3e 45  00200000  /* x>E
2910: 58 50 52 20 6f 72 20 78 3e 3d 45 58 50 52 20 63  XPR or x>=EXPR c
2920: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
2930: 66 69 6e 65 20 57 48 45 52 45 5f 49 44 58 5f 4f  fine WHERE_IDX_O
2940: 4e 4c 59 20 20 20 20 20 30 78 30 30 38 30 30 30  NLY     0x008000
2950: 30 30 20 20 2f 2a 20 55 73 65 20 69 6e 64 65 78  00  /* Use index
2960: 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20 74 61 62   only - omit tab
2970: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  le */.#define WH
2980: 45 52 45 5f 4f 52 44 45 52 42 59 20 20 20 20 20  ERE_ORDERBY     
2990: 20 30 78 30 31 30 30 30 30 30 30 20 20 2f 2a 20   0x01000000  /* 
29a0: 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70 70 65  Output will appe
29b0: 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20 6f 72  ar in correct or
29c0: 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  der */.#define W
29d0: 48 45 52 45 5f 52 45 56 45 52 53 45 20 20 20 20  HERE_REVERSE    
29e0: 20 20 30 78 30 32 30 30 30 30 30 30 20 20 2f 2a    0x02000000  /*
29f0: 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   Scan in reverse
2a00: 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e   order */.#defin
2a10: 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20 20  e WHERE_UNIQUE  
2a20: 20 20 20 20 20 30 78 30 34 30 30 30 30 30 30 20       0x04000000 
2a30: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
2a40: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
2a50: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
2a60: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 30  E_VIRTUALTABLE 0
2a70: 78 30 38 30 30 30 30 30 30 20 20 2f 2a 20 55 73  x08000000  /* Us
2a80: 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20  e virtual-table 
2a90: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 23 64  processing */.#d
2aa0: 65 66 69 6e 65 20 57 48 45 52 45 5f 4d 55 4c 54  efine WHERE_MULT
2ab0: 49 5f 4f 52 20 20 20 20 20 30 78 31 30 30 30 30  I_OR     0x10000
2ac0: 30 30 30 20 20 2f 2a 20 4f 52 20 75 73 69 6e 67  000  /* OR using
2ad0: 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 69 63 65   multiple indice
2ae0: 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  s */../*.** Init
2af0: 69 61 6c 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f  ialize a preallo
2b00: 63 61 74 65 64 20 57 68 65 72 65 43 6c 61 75 73  cated WhereClaus
2b10: 65 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  e structure..*/.
2b20: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
2b30: 65 43 6c 61 75 73 65 49 6e 69 74 28 0a 20 20 57  eClauseInit(.  W
2b40: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
2b50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
2b60: 68 65 72 65 43 6c 61 75 73 65 20 74 6f 20 62 65  hereClause to be
2b70: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 2a 2f 0a   initialized */.
2b80: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
2b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2ba0: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
2bb0: 74 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  t */.  WhereMask
2bc0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 20 20  Set *pMaskSet   
2bd0: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
2be0: 74 61 62 6c 65 20 63 75 72 73 6f 72 20 6e 75 6d  table cursor num
2bf0: 62 65 72 73 20 74 6f 20 62 69 74 6d 61 73 6b 73  bers to bitmasks
2c00: 20 2a 2f 0a 29 7b 0a 20 20 70 57 43 2d 3e 70 50   */.){.  pWC->pP
2c10: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
2c20: 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 20 3d   pWC->pMaskSet =
2c30: 20 70 4d 61 73 6b 53 65 74 3b 0a 20 20 70 57 43   pMaskSet;.  pWC
2c40: 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70  ->nTerm = 0;.  p
2c50: 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 72 72 61  WC->nSlot = Arra
2c60: 79 53 69 7a 65 28 70 57 43 2d 3e 61 53 74 61 74  ySize(pWC->aStat
2c70: 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20  ic);.  pWC->a = 
2c80: 70 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 20 20  pWC->aStatic;.  
2c90: 70 57 43 2d 3e 76 6d 61 73 6b 20 3d 20 30 3b 0a  pWC->vmask = 0;.
2ca0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  }../* Forward re
2cb0: 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
2cc0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
2cd0: 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c 61  seClear(WhereCla
2ce0: 75 73 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65  use*);../*.** De
2cf0: 61 6c 6c 6f 63 61 74 65 20 61 6c 6c 20 6d 65 6d  allocate all mem
2d00: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2d10: 69 74 68 20 61 20 57 68 65 72 65 4f 72 49 6e 66  ith a WhereOrInf
2d20: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61  o object..*/.sta
2d30: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 4f 72  tic void whereOr
2d40: 49 6e 66 6f 44 65 6c 65 74 65 28 73 71 6c 69 74  InfoDelete(sqlit
2d50: 65 33 20 2a 64 62 2c 20 57 68 65 72 65 4f 72 49  e3 *db, WhereOrI
2d60: 6e 66 6f 20 2a 70 29 7b 0a 20 20 77 68 65 72 65  nfo *p){.  where
2d70: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 70 2d 3e  ClauseClear(&p->
2d80: 77 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  wc);.  sqlite3Db
2d90: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
2da0: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
2db0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
2dc0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 57 68  ciated with a Wh
2dd0: 65 72 65 41 6e 64 49 6e 66 6f 20 6f 62 6a 65 63  ereAndInfo objec
2de0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
2df0: 64 20 77 68 65 72 65 41 6e 64 49 6e 66 6f 44 65  d whereAndInfoDe
2e00: 6c 65 74 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lete(sqlite3 *db
2e10: 2c 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a  , WhereAndInfo *
2e20: 70 29 7b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  p){.  whereClaus
2e30: 65 43 6c 65 61 72 28 26 70 2d 3e 77 63 29 3b 0a  eClear(&p->wc);.
2e40: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2e50: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  db, p);.}../*.**
2e60: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68   Deallocate a Wh
2e70: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
2e80: 75 72 65 2e 20 20 54 68 65 20 57 68 65 72 65 43  ure.  The WhereC
2e90: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 0a  lause structure.
2ea0: 2a 2a 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74  ** itself is not
2eb0: 20 66 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f   freed.  This ro
2ec0: 75 74 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76  utine is the inv
2ed0: 65 72 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61  erse of whereCla
2ee0: 75 73 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  useInit()..*/.st
2ef0: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
2f00: 6c 61 75 73 65 43 6c 65 61 72 28 57 68 65 72 65  lauseClear(Where
2f10: 43 6c 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20  Clause *pWC){.  
2f20: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65  int i;.  WhereTe
2f30: 72 6d 20 2a 61 3b 0a 20 20 73 71 6c 69 74 65 33  rm *a;.  sqlite3
2f40: 20 2a 64 62 20 3d 20 70 57 43 2d 3e 70 50 61 72   *db = pWC->pPar
2f50: 73 65 2d 3e 64 62 3b 0a 20 20 66 6f 72 28 69 3d  se->db;.  for(i=
2f60: 70 57 43 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d  pWC->nTerm-1, a=
2f70: 70 57 43 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d  pWC->a; i>=0; i-
2f80: 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28  -, a++){.    if(
2f90: 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45   a->wtFlags & TE
2fa0: 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a 20 20  RM_DYNAMIC ){.  
2fb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
2fc0: 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 70 45 78  elete(db, a->pEx
2fd0: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pr);.    }.    i
2fe0: 66 28 20 61 2d 3e 77 74 46 6c 61 67 73 20 26 20  f( a->wtFlags & 
2ff0: 54 45 52 4d 5f 4f 52 49 4e 46 4f 20 29 7b 0a 20  TERM_ORINFO ){. 
3000: 20 20 20 20 20 77 68 65 72 65 4f 72 49 6e 66 6f       whereOrInfo
3010: 44 65 6c 65 74 65 28 64 62 2c 20 61 2d 3e 75 2e  Delete(db, a->u.
3020: 70 4f 72 49 6e 66 6f 29 3b 0a 20 20 20 20 7d 65  pOrInfo);.    }e
3030: 6c 73 65 20 69 66 28 20 61 2d 3e 77 74 46 6c 61  lse if( a->wtFla
3040: 67 73 20 26 20 54 45 52 4d 5f 41 4e 44 49 4e 46  gs & TERM_ANDINF
3050: 4f 20 29 7b 0a 20 20 20 20 20 20 77 68 65 72 65  O ){.      where
3060: 41 6e 64 49 6e 66 6f 44 65 6c 65 74 65 28 64 62  AndInfoDelete(db
3070: 2c 20 61 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 29  , a->u.pAndInfo)
3080: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
3090: 28 20 70 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61  ( pWC->a!=pWC->a
30a0: 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 73 71  Static ){.    sq
30b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
30c0: 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWC->a);.  }.}..
30d0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 73 69 6e 67  /*.** Add a sing
30e0: 6c 65 20 6e 65 77 20 57 68 65 72 65 54 65 72 6d  le new WhereTerm
30f0: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 57 68   entry to the Wh
3100: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
3110: 20 70 57 43 2e 0a 2a 2a 20 54 68 65 20 6e 65 77   pWC..** The new
3120: 20 57 68 65 72 65 54 65 72 6d 20 6f 62 6a 65 63   WhereTerm objec
3130: 74 20 69 73 20 63 6f 6e 73 74 72 75 63 74 65 64  t is constructed
3140: 20 66 72 6f 6d 20 45 78 70 72 20 70 20 61 6e 64   from Expr p and
3150: 20 77 69 74 68 20 77 74 46 6c 61 67 73 2e 0a 2a   with wtFlags..*
3160: 2a 20 54 68 65 20 69 6e 64 65 78 20 69 6e 20 70  * The index in p
3170: 57 43 2d 3e 61 5b 5d 20 6f 66 20 74 68 65 20 6e  WC->a[] of the n
3180: 65 77 20 57 68 65 72 65 54 65 72 6d 20 69 73 20  ew WhereTerm is 
3190: 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
31a0: 65 73 73 2e 0a 2a 2a 20 30 20 69 73 20 72 65 74  ess..** 0 is ret
31b0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6e 65 77  urned if the new
31c0: 20 57 68 65 72 65 54 65 72 6d 20 63 6f 75 6c 64   WhereTerm could
31d0: 20 6e 6f 74 20 62 65 20 61 64 64 65 64 20 64 75   not be added du
31e0: 65 20 74 6f 20 61 20 6d 65 6d 6f 72 79 0a 2a 2a  e to a memory.**
31f0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
3200: 72 2e 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61  r.  The memory a
3210: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 75 72  llocation failur
3220: 65 20 77 69 6c 6c 20 62 65 20 72 65 63 6f 72 64  e will be record
3230: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 62 2d  ed in.** the db-
3240: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
3250: 61 67 20 73 6f 20 74 68 61 74 20 68 69 67 68 65  ag so that highe
3260: 72 2d 6c 65 76 65 6c 20 66 75 6e 63 74 69 6f 6e  r-level function
3270: 73 20 63 61 6e 20 64 65 74 65 63 74 20 69 74 2e  s can detect it.
3280: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3290: 69 6e 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  ine will increas
32a0: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
32b0: 65 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79  e pWC->a[] array
32c0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
32d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 74 46 6c  *.** If the wtFl
32e0: 61 67 73 20 61 72 67 75 6d 65 6e 74 20 69 6e 63  ags argument inc
32f0: 6c 75 64 65 73 20 54 45 52 4d 5f 44 59 4e 41 4d  ludes TERM_DYNAM
3300: 49 43 2c 20 74 68 65 6e 20 72 65 73 70 6f 6e 73  IC, then respons
3310: 69 62 69 6c 69 74 79 0a 2a 2a 20 66 6f 72 20 66  ibility.** for f
3320: 72 65 65 69 6e 67 20 74 68 65 20 65 78 70 72 65  reeing the expre
3330: 73 73 69 6f 6e 20 70 20 69 73 20 61 73 73 75 6d  ssion p is assum
3340: 65 64 20 62 79 20 74 68 65 20 57 68 65 72 65 43  ed by the WhereC
3350: 6c 61 75 73 65 20 6f 62 6a 65 63 74 20 70 57 43  lause object pWC
3360: 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 72 75  ..** This is tru
3370: 65 20 65 76 65 6e 20 69 66 20 74 68 69 73 20 72  e even if this r
3380: 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 74 6f 20  outine fails to 
3390: 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 57  allocate a new W
33a0: 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20  hereTerm..**.** 
33b0: 57 41 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72  WARNING:  This r
33c0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61  outine might rea
33d0: 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 70 61 63  llocate the spac
33e0: 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a  e used to store.
33f0: 2a 2a 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20  ** WhereTerms.  
3400: 41 6c 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  All pointers to 
3410: 57 68 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c  WhereTerms shoul
3420: 64 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  d be invalidated
3430: 20 61 66 74 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e   after.** callin
3440: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
3450: 20 53 75 63 68 20 70 6f 69 6e 74 65 72 73 20 6d   Such pointers m
3460: 61 79 20 62 65 20 72 65 69 6e 69 74 69 61 6c 69  ay be reinitiali
3470: 7a 65 64 20 62 79 20 72 65 66 65 72 65 6e 63 69  zed by referenci
3480: 6e 67 0a 2a 2a 20 74 68 65 20 70 57 43 2d 3e 61  ng.** the pWC->a
3490: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  [] array..*/.sta
34a0: 74 69 63 20 69 6e 74 20 77 68 65 72 65 43 6c 61  tic int whereCla
34b0: 75 73 65 49 6e 73 65 72 74 28 57 68 65 72 65 43  useInsert(WhereC
34c0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78 70 72  lause *pWC, Expr
34d0: 20 2a 70 2c 20 75 38 20 77 74 46 6c 61 67 73 29   *p, u8 wtFlags)
34e0: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
34f0: 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Term;.  int idx;
3500: 0a 20 20 69 66 28 20 70 57 43 2d 3e 6e 54 65 72  .  if( pWC->nTer
3510: 6d 3e 3d 70 57 43 2d 3e 6e 53 6c 6f 74 20 29 7b  m>=pWC->nSlot ){
3520: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
3530: 70 4f 6c 64 20 3d 20 70 57 43 2d 3e 61 3b 0a 20  pOld = pWC->a;. 
3540: 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
3550: 20 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62   pWC->pParse->db
3560: 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20 3d 20 73  ;.    pWC->a = s
3570: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
3580: 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 70 57 43  w(db, sizeof(pWC
3590: 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c  ->a[0])*pWC->nSl
35a0: 6f 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20  ot*2 );.    if( 
35b0: 70 57 43 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  pWC->a==0 ){.   
35c0: 20 20 20 69 66 28 20 77 74 46 6c 61 67 73 20 26     if( wtFlags &
35d0: 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b   TERM_DYNAMIC ){
35e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35f0: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
3600: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
3610: 20 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a   pWC->a = pOld;.
3620: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3630: 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79      }.    memcpy
3640: 28 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73  (pWC->a, pOld, s
3650: 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29  izeof(pWC->a[0])
3660: 2a 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20  *pWC->nTerm);.  
3670: 20 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d    if( pOld!=pWC-
3680: 3e 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20  >aStatic ){.    
3690: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
36a0: 64 62 2c 20 70 4f 6c 64 29 3b 0a 20 20 20 20 7d  db, pOld);.    }
36b0: 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20  .    pWC->nSlot 
36c0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
36d0: 63 53 69 7a 65 28 64 62 2c 20 70 57 43 2d 3e 61  cSize(db, pWC->a
36e0: 29 2f 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  )/sizeof(pWC->a[
36f0: 30 5d 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d  0]);.  }.  pTerm
3700: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 20 3d   = &pWC->a[idx =
3710: 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a   pWC->nTerm++];.
3720: 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 3d    pTerm->pExpr =
3730: 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46   p;.  pTerm->wtF
3740: 6c 61 67 73 20 3d 20 77 74 46 6c 61 67 73 3b 0a  lags = wtFlags;.
3750: 20 20 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70    pTerm->pWC = p
3760: 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61  WC;.  pTerm->iPa
3770: 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74  rent = -1;.  ret
3780: 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn idx;.}../*.*
3790: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
37a0: 64 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70  dentifies subexp
37b0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
37c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65  WHERE clause whe
37d0: 72 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78  re.** each subex
37e0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61  pression is sepa
37f0: 72 61 74 65 64 20 62 79 20 74 68 65 20 41 4e 44  rated by the AND
3800: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d   operator or som
3810: 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61  e other.** opera
3820: 74 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  tor specified in
3830: 20 74 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65   the op paramete
3840: 72 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  r.  The WhereCla
3850: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
3860: 20 69 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20   is filled with 
3870: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65  pointers to sube
3880: 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72  xpressions.  For
3890: 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20   example:.**.** 
38a0: 20 20 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65     WHERE  a=='he
38b0: 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63  llo' AND coalesc
38c0: 65 28 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28  e(b,11)<10 AND (
38d0: 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32  c+12!=d OR c==22
38e0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c  ).**           \
38f0: 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f  ________/     \_
3900: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20  ______________/ 
3910: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f      \___________
3920: 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20  _____/.**       
3930: 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20       slot[0]    
3940: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20          slot[1] 
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 6c                sl
3960: 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ot[2].**.** The 
3970: 6f 72 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63  original WHERE c
3980: 6c 61 75 73 65 20 69 6e 20 70 45 78 70 72 20 69  lause in pExpr i
3990: 73 20 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c  s unaltered.  Al
39a0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  l this routine.*
39b0: 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73  * does is make s
39c0: 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f  lot[] entries po
39d0: 69 6e 74 20 74 6f 20 73 75 62 73 74 72 75 63 74  int to substruct
39e0: 75 72 65 20 77 69 74 68 69 6e 20 70 45 78 70 72  ure within pExpr
39f0: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70  ..**.** In the p
3a00: 72 65 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65  revious sentence
3a10: 20 61 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67   and in the diag
3a20: 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65  ram, "slot[]" re
3a30: 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57  fers to.** the W
3a40: 68 65 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61  hereClause.a[] a
3a50: 72 72 61 79 2e 20 20 54 68 65 20 73 6c 6f 74 5b  rray.  The slot[
3a60: 5d 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73  ] array grows as
3a70: 20 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61   needed to conta
3a80: 69 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20  in.** all terms 
3a90: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
3aa0: 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  use..*/.static v
3ab0: 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57  oid whereSplit(W
3ac0: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c  hereClause *pWC,
3ad0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
3ae0: 74 20 6f 70 29 7b 0a 20 20 70 57 43 2d 3e 6f 70  t op){.  pWC->op
3af0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 69 66 28   = (u8)op;.  if(
3b00: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
3b10: 72 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  rn;.  if( pExpr-
3b20: 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20 20 20 20 77  >op!=op ){.    w
3b30: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
3b40: 28 70 57 43 2c 20 70 45 78 70 72 2c 20 30 29 3b  (pWC, pExpr, 0);
3b50: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
3b60: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
3b70: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 6f 70 29 3b  xpr->pLeft, op);
3b80: 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74 28  .    whereSplit(
3b90: 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  pWC, pExpr->pRig
3ba0: 68 74 2c 20 6f 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  ht, op);.  }.}..
3bb0: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
3bc0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
3bd0: 61 73 6b 20 73 65 74 20 28 61 20 57 68 65 72 65  ask set (a Where
3be0: 4d 61 73 6b 53 65 74 20 6f 62 6a 65 63 74 29 0a  MaskSet object).
3bf0: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
3c00: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
3c10: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
3c20: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
3c30: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
3c40: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
3c50: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
3c60: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
3c70: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
3c80: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
3c90: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
3ca0: 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d  WhereMaskSet *pM
3cb0: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
3cc0: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
3cd0: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
3ce0: 74 2d 3e 6e 3c 3d 73 69 7a 65 6f 66 28 42 69 74  t->n<=sizeof(Bit
3cf0: 6d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 66 6f 72  mask)*8 );.  for
3d00: 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74  (i=0; i<pMaskSet
3d10: 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ->n; i++){.    i
3d20: 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  f( pMaskSet->ix[
3d30: 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20  i]==iCursor ){. 
3d40: 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69       return ((Bi
3d50: 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20  tmask)1)<<i;.   
3d60: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
3d70: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
3d80: 74 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f  te a new mask fo
3d90: 72 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72  r cursor iCursor
3da0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ..**.** There is
3db0: 20 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20   one cursor per 
3dc0: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
3dd0: 4d 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e  M clause.  The n
3de0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c  umber of.** tabl
3df0: 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  es in the FROM c
3e00: 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64  lause is limited
3e10: 20 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79   by a test early
3e20: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   in the.** sqlit
3e30: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72  e3WhereBegin() r
3e40: 6f 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b  outine.  So we k
3e50: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61  now that the pMa
3e60: 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61  skSet->ix[].** a
3e70: 72 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20  rray will never 
3e80: 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61  overflow..*/.sta
3e90: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d  tic void createM
3ea0: 61 73 6b 28 57 68 65 72 65 4d 61 73 6b 53 65 74  ask(WhereMaskSet
3eb0: 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20   *pMaskSet, int 
3ec0: 69 43 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65  iCursor){.  asse
3ed0: 72 74 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20  rt( pMaskSet->n 
3ee0: 3c 20 41 72 72 61 79 53 69 7a 65 28 70 4d 61 73  < ArraySize(pMas
3ef0: 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70  kSet->ix) );.  p
3f00: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
3f10: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
3f20: 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rsor;.}../*.** T
3f30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
3f40: 73 20 28 72 65 63 75 72 73 69 76 65 6c 79 29 20  s (recursively) 
3f50: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
3f60: 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73  ee and generates
3f70: 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e  .** a bitmask in
3f80: 64 69 63 61 74 69 6e 67 20 77 68 69 63 68 20 74  dicating which t
3f90: 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 69  ables are used i
3fa0: 6e 20 74 68 61 74 20 65 78 70 72 65 73 73 69 6f  n that expressio
3fb0: 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  n.** tree..**.**
3fc0: 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68   In order for th
3fd0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f  is routine to wo
3fe0: 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  rk, the calling 
3ff0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
4000: 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  ve.** previously
4010: 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33   invoked sqlite3
4020: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
4030: 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  () on the expres
4040: 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68  sion.  See.** th
4050: 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74  e header comment
4060: 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65   on that routine
4070: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
4080: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20  information..** 
4090: 54 68 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  The sqlite3Resol
40a0: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 72 6f  veExprNames() ro
40b0: 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72  utines looks for
40c0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e   column names an
40d0: 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20  d.** sets their 
40e0: 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f  opcodes to TK_CO
40f0: 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45  LUMN and their E
4100: 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64  xpr.iTable field
4110: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45  s to.** the VDBE
4120: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   cursor number o
4130: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
4140: 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20  is routine just 
4150: 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c  has to.** transl
4160: 61 74 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e  ate the cursor n
4170: 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d  umbers into bitm
4180: 61 73 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f  ask values and O
4190: 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74  R all.** the bit
41a0: 6d 61 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a  masks together..
41b0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
41c0: 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  k exprListTableU
41d0: 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65  sage(WhereMaskSe
41e0: 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a  t*, ExprList*);.
41f0: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
4200: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
4210: 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53 65 74  age(WhereMaskSet
4220: 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74 61  *, Select*);.sta
4230: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
4240: 54 61 62 6c 65 55 73 61 67 65 28 57 68 65 72 65  TableUsage(Where
4250: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
4260: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
4270: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
4280: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
4290: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
42a0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
42b0: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
42c0: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
42d0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
42e0: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
42f0: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
4300: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4310: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
4320: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
4330: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
4340: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66   p->pLeft);.  if
4350: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
4360: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
4370: 74 29 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 7c  t) ){.    mask |
4380: 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c  = exprSelectTabl
4390: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
43a0: 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a   p->x.pSelect);.
43b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 61 73    }else{.    mas
43c0: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
43d0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
43e0: 2c 20 70 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20  , p->x.pList);. 
43f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b   }.  return mask
4400: 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d 61  ;.}.static Bitma
4410: 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  sk exprListTable
4420: 55 73 61 67 65 28 57 68 65 72 65 4d 61 73 6b 53  Usage(WhereMaskS
4430: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
4440: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
4450: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
4460: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
4470: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
4480: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
4490: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
44a0: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
44b0: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
44c0: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
44d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
44e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
44f0: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
4500: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
4510: 62 6c 65 55 73 61 67 65 28 57 68 65 72 65 4d 61  bleUsage(WhereMa
4520: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
4530: 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20   Select *pS){.  
4540: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30  Bitmask mask = 0
4550: 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29 7b  ;.  while( pS ){
4560: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
4570: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
4580: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
4590: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
45a0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
45b0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
45c0: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
45d0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
45e0: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
45f0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
4600: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
4610: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
4620: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
4630: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
4640: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
4650: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
4660: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20 20  ->pHaving);.    
4670: 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72 3b  pS = pS->pPrior;
4680: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61  .  }.  return ma
4690: 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  sk;.}../*.** Ret
46a0: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
46b0: 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20 69  given operator i
46c0: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70 65  s one of the ope
46d0: 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a 2a  rators that is.*
46e0: 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61 6e  * allowed for an
46f0: 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52 45   indexable WHERE
4700: 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20 54   clause term.  T
4710: 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72 61  he allowed opera
4720: 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22 2c  tors are.** "=",
4730: 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c   "<", ">", "<=",
4740: 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22 2e   ">=", and "IN".
4750: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
4760: 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70 29  llowedOp(int op)
4770: 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47  {.  assert( TK_G
4780: 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47 54  T>TK_EQ && TK_GT
4790: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
47a0: 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20  rt( TK_LT>TK_EQ 
47b0: 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29  && TK_LT<TK_GE )
47c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c  ;.  assert( TK_L
47d0: 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 45  E>TK_EQ && TK_LE
47e0: 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65  <TK_GE );.  asse
47f0: 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51  rt( TK_GE==TK_EQ
4800: 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  +4 );.  return o
4810: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e  p==TK_IN || (op>
4820: 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b  =TK_EQ && op<=TK
4830: 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49  _GE) || op==TK_I
4840: 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  SNULL;.}../*.** 
4850: 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74 73  Swap two objects
4860: 20 6f 66 20 74 79 70 65 20 54 59 50 45 2e 0a 2a   of type TYPE..*
4870: 2f 0a 23 64 65 66 69 6e 65 20 53 57 41 50 28 54  /.#define SWAP(T
4880: 59 50 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74  YPE,A,B) {TYPE t
4890: 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a  =A; A=B; B=t;}..
48a0: 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20  /*.** Commute a 
48b0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
48c0: 74 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e  tor.  Expression
48d0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58  s of the form "X
48e0: 20 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f   op Y".** are co
48f0: 6e 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20  nverted into "Y 
4900: 6f 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  op X"..**.** If 
4910: 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
4920: 65 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74  ence is associat
4930: 65 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74  ed with either t
4940: 68 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74  he left or right
4950: 0a 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20  .** side of the 
4960: 63 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72  comparison, it r
4970: 65 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65  emains associate
4980: 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
4990: 73 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  side after.** th
49a0: 65 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53  e commutation. S
49b0: 6f 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43  o "Y collate NOC
49c0: 41 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65  ASE op X" become
49d0: 73 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65  s .** "X collate
49e0: 20 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54   NOCASE op Y". T
49f0: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61  his is because a
4a00: 6e 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ny collation seq
4a10: 75 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20  uence on.** the 
4a20: 6c 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f  left hand side o
4a30: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
4a40: 76 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c  verrides any col
4a50: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
4a60: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20  .** attached to 
4a70: 74 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74  the right. For t
4a80: 68 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74  he same reason t
4a90: 68 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65  he EP_ExpCollate
4aa0: 20 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20   flag.** is not 
4ab0: 63 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61  commuted..*/.sta
4ac0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d  tic void exprCom
4ad0: 6d 75 74 65 28 50 61 72 73 65 20 2a 70 50 61 72  mute(Parse *pPar
4ae0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
4af0: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
4b00: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
4b10: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
4b20: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
4b30: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
4b40: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
4b50: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
4b60: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
4b70: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
4b80: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
4b90: 4b 5f 49 4e 20 29 3b 0a 20 20 70 45 78 70 72 2d  K_IN );.  pExpr-
4ba0: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 20 3d  >pRight->pColl =
4bb0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
4bc0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
4bd0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4be0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c  xpr->pLeft->pCol
4bf0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
4c00: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
4c10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4c20: 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45  SWAP(CollSeq*,pE
4c30: 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f  xpr->pRight->pCo
4c40: 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  ll,pExpr->pLeft-
4c50: 3e 70 43 6f 6c 6c 29 3b 0a 20 20 70 45 78 70 72  >pColl);.  pExpr
4c60: 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67 73 20  ->pRight->flags 
4c70: 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  = (pExpr->pRight
4c80: 2d 3e 66 6c 61 67 73 20 26 20 7e 45 50 5f 45 78  ->flags & ~EP_Ex
4c90: 70 43 6f 6c 6c 61 74 65 29 20 7c 20 65 78 70 4c  pCollate) | expL
4ca0: 65 66 74 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  eft;.  pExpr->pL
4cb0: 65 66 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45  eft->flags = (pE
4cc0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67  xpr->pLeft->flag
4cd0: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
4ce0: 74 65 29 20 7c 20 65 78 70 52 69 67 68 74 3b 0a  te) | expRight;.
4cf0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
4d00: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
4d10: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  ->pLeft);.  if( 
4d20: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
4d30: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
4d40: 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
4d50: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 54 4b  ;.    assert( TK
4d60: 5f 47 45 3d 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a  _GE==TK_LE+2 );.
4d70: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
4d80: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 61  T>TK_EQ );.    a
4d90: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
4da0: 4c 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  LE );.    assert
4db0: 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f  ( pExpr->op>=TK_
4dc0: 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 3c  GT && pExpr->op<
4dd0: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 70 45  =TK_GE );.    pE
4de0: 78 70 72 2d 3e 6f 70 20 3d 20 28 28 70 45 78 70  xpr->op = ((pExp
4df0: 72 2d 3e 6f 70 2d 54 4b 5f 47 54 29 5e 32 29 2b  r->op-TK_GT)^2)+
4e00: 54 4b 5f 47 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TK_GT;.  }.}../*
4e10: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 66 72  .** Translate fr
4e20: 6f 6d 20 54 4b 5f 78 78 20 6f 70 65 72 61 74 6f  om TK_xx operato
4e30: 72 20 74 6f 20 57 4f 5f 78 78 20 62 69 74 6d 61  r to WO_xx bitma
4e40: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 31  sk..*/.static u1
4e50: 36 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b 28 69  6 operatorMask(i
4e60: 6e 74 20 6f 70 29 7b 0a 20 20 75 31 36 20 63 3b  nt op){.  u16 c;
4e70: 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f 77  .  assert( allow
4e80: 65 64 4f 70 28 6f 70 29 20 29 3b 0a 20 20 69 66  edOp(op) );.  if
4e90: 28 20 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20  ( op==TK_IN ){. 
4ea0: 20 20 20 63 20 3d 20 57 4f 5f 49 4e 3b 0a 20 20     c = WO_IN;.  
4eb0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
4ec0: 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 63  _ISNULL ){.    c
4ed0: 20 3d 20 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20   = WO_ISNULL;.  
4ee0: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
4ef0: 74 28 20 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  t( (WO_EQ<<(op-T
4f00: 4b 5f 45 51 29 29 20 3c 20 30 78 37 66 66 66 20  K_EQ)) < 0x7fff 
4f10: 29 3b 0a 20 20 20 20 63 20 3d 20 28 75 31 36 29  );.    c = (u16)
4f20: 28 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54 4b 5f 45  (WO_EQ<<(op-TK_E
4f30: 51 29 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Q));.  }.  asser
4f40: 74 28 20 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  t( op!=TK_ISNULL
4f50: 20 7c 7c 20 63 3d 3d 57 4f 5f 49 53 4e 55 4c 4c   || c==WO_ISNULL
4f60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
4f70: 21 3d 54 4b 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f  !=TK_IN || c==WO
4f80: 5f 49 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _IN );.  assert(
4f90: 20 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d   op!=TK_EQ || c=
4fa0: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 61 73 73 65  =WO_EQ );.  asse
4fb0: 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  rt( op!=TK_LT ||
4fc0: 20 63 3d 3d 57 4f 5f 4c 54 20 29 3b 0a 20 20 61   c==WO_LT );.  a
4fd0: 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 4c 45  ssert( op!=TK_LE
4fe0: 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a   || c==WO_LE );.
4ff0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
5000: 5f 47 54 20 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20  _GT || c==WO_GT 
5010: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
5020: 3d 54 4b 5f 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_GE || c==WO_
5030: 47 45 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 63  GE );.  return c
5040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63  ;.}../*.** Searc
5050: 68 20 66 6f 72 20 61 20 74 65 72 6d 20 69 6e 20  h for a term in 
5060: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5070: 20 74 68 61 74 20 69 73 20 6f 66 20 74 68 65 20   that is of the 
5080: 66 6f 72 6d 20 22 58 20 3c 6f 70 3e 20 3c 65 78  form "X <op> <ex
5090: 70 72 3e 22 0a 2a 2a 20 77 68 65 72 65 20 58 20  pr>".** where X 
50a0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
50b0: 6f 20 74 68 65 20 69 43 6f 6c 75 6d 6e 20 6f 66  o the iColumn of
50c0: 20 74 61 62 6c 65 20 69 43 75 72 20 61 6e 64 20   table iCur and 
50d0: 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66 0a 2a  <op> is one of.*
50e0: 2a 20 74 68 65 20 57 4f 5f 78 78 20 6f 70 65 72  * the WO_xx oper
50f0: 61 74 6f 72 20 63 6f 64 65 73 20 73 70 65 63 69  ator codes speci
5100: 66 69 65 64 20 62 79 20 74 68 65 20 6f 70 20 70  fied by the op p
5110: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 52 65 74  arameter..** Ret
5120: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5130: 20 74 68 65 20 74 65 72 6d 2e 20 20 52 65 74 75   the term.  Retu
5140: 72 6e 20 30 20 69 66 20 6e 6f 74 20 66 6f 75 6e  rn 0 if not foun
5150: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 57 68 65  d..*/.static Whe
5160: 72 65 54 65 72 6d 20 2a 66 69 6e 64 54 65 72 6d  reTerm *findTerm
5170: 28 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  (.  WhereClause 
5180: 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54 68 65  *pWC,     /* The
5190: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 6f   WHERE clause to
51a0: 20 62 65 20 73 65 61 72 63 68 65 64 20 2a 2f 0a   be searched */.
51b0: 20 20 69 6e 74 20 69 43 75 72 2c 20 20 20 20 20    int iCur,     
51c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
51d0: 72 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20  r number of LHS 
51e0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e  */.  int iColumn
51f0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
5200: 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66 20 4c  lumn number of L
5210: 48 53 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  HS */.  Bitmask 
5220: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
5230: 20 52 48 53 20 6d 75 73 74 20 6e 6f 74 20 6f 76   RHS must not ov
5240: 65 72 6c 61 70 20 77 69 74 68 20 74 68 69 73 20  erlap with this 
5250: 6d 61 73 6b 20 2a 2f 0a 20 20 75 33 32 20 6f 70  mask */.  u32 op
5260: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5270: 2f 2a 20 4d 61 73 6b 20 6f 66 20 57 4f 5f 78 78  /* Mask of WO_xx
5280: 20 76 61 6c 75 65 73 20 64 65 73 63 72 69 62 69   values describi
5290: 6e 67 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  ng operator */. 
52a0: 20 49 6e 64 65 78 20 2a 70 49 64 78 20 20 20 20   Index *pIdx    
52b0: 20 20 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62         /* Must b
52c0: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
52d0: 68 20 74 68 69 73 20 69 6e 64 65 78 2c 20 69 66  h this index, if
52e0: 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a   not NULL */.){.
52f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
5300: 72 6d 3b 0a 20 20 69 6e 74 20 6b 3b 0a 20 20 61  rm;.  int k;.  a
5310: 73 73 65 72 74 28 20 69 43 75 72 3e 3d 30 20 29  ssert( iCur>=0 )
5320: 3b 0a 20 20 6f 70 20 26 3d 20 57 4f 5f 41 4c 4c  ;.  op &= WO_ALL
5330: 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70 57  ;.  for(pTerm=pW
5340: 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e 54 65  C->a, k=pWC->nTe
5350: 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54 65 72  rm; k; k--, pTer
5360: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 54  m++){.    if( pT
5370: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
5380: 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26 26 20  =iCur.       && 
5390: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
53a0: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
53b0: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70 54 65  =0.       && pTe
53c0: 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e  rm->u.leftColumn
53d0: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
53e0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
53f0: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
5400: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
5410: 70 49 64 78 20 26 26 20 70 54 65 72 6d 2d 3e 65  pIdx && pTerm->e
5420: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 49 53 4e  Operator!=WO_ISN
5430: 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ULL ){.        E
5440: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
5450: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
5460: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
5470: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
5480: 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  aff;.        int
5490: 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72 73   j;.        Pars
54a0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
54b0: 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20 20  >pParse;..      
54c0: 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78 2d    idxaff = pIdx-
54d0: 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43  >pTable->aCol[iC
54e0: 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 3b  olumn].affinity;
54f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71  .        if( !sq
5500: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
5510: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
5520: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
5530: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
5540: 6f 75 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  out the collatio
5550: 6e 20 73 65 71 75 65 6e 63 65 20 72 65 71 75 69  n sequence requi
5560: 72 65 64 20 66 72 6f 6d 20 61 6e 20 69 6e 64 65  red from an inde
5570: 78 20 66 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a  x for.        **
5580: 20 69 74 20 74 6f 20 62 65 20 75 73 65 66 75 6c   it to be useful
5590: 20 66 6f 72 20 6f 70 74 69 6d 69 73 69 6e 67 20   for optimising 
55a0: 65 78 70 72 65 73 73 69 6f 6e 20 70 58 2e 20 53  expression pX. S
55b0: 74 6f 72 65 20 74 68 69 73 0a 20 20 20 20 20 20  tore this.      
55c0: 20 20 2a 2a 20 76 61 6c 75 65 20 69 6e 20 76 61    ** value in va
55d0: 72 69 61 62 6c 65 20 70 43 6f 6c 6c 2e 0a 20 20  riable pColl..  
55e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
55f0: 20 61 73 73 65 72 74 28 70 58 2d 3e 70 4c 65 66   assert(pX->pLef
5600: 74 29 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  t);.        pCol
5610: 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  l = sqlite3Binar
5620: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
5630: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66  pParse, pX->pLef
5640: 74 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  t, pX->pRight);.
5650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
5660: 43 6f 6c 6c 20 7c 7c 20 70 50 61 72 73 65 2d 3e  Coll || pParse->
5670: 6e 45 72 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  nErr);..        
5680: 66 6f 72 28 6a 3d 30 3b 20 70 49 64 78 2d 3e 61  for(j=0; pIdx->a
5690: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
56a0: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
56b0: 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 6a       if( NEVER(j
56c0: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29  >=pIdx->nColumn)
56d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
56e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
56f0: 66 28 20 70 43 6f 6c 6c 20 26 26 20 73 71 6c 69  f( pColl && sqli
5700: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c  te3StrICmp(pColl
5710: 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61  ->zName, pIdx->a
5720: 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74  zColl[j]) ) cont
5730: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
5740: 20 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d      return pTerm
5750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5760: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
5770: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5780: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
5790: 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69  xprAnalyze(SrcLi
57a0: 73 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  st*, WhereClause
57b0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
57c0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
57d0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
57e0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
57f0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
5800: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
5810: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
5820: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
5830: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
5840: 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
5850: 43 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20  Clause *pWC     
5860: 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45      /* the WHERE
5870: 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e   clause to be an
5880: 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69  alyzed */.){.  i
5890: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57  nt i;.  for(i=pW
58a0: 43 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30  C->nTerm-1; i>=0
58b0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72  ; i--){.    expr
58c0: 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74  Analyze(pTabList
58d0: 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d  , pWC, i);.  }.}
58e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
58f0: 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d  _OMIT_LIKE_OPTIM
5900: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68  IZATION./*.** Ch
5910: 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
5920: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
5930: 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20  on is a LIKE or 
5940: 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68  GLOB operator th
5950: 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74  at.** can be opt
5960: 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65  imized using ine
5970: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
5980: 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55  nts.  Return TRU
5990: 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f  E if it is.** so
59a0: 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f   and false if no
59b0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  t..**.** In orde
59c0: 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74  r for the operat
59d0: 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a  or to be optimiz
59e0: 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75  ible, the RHS mu
59f0: 73 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a  st be a string.*
5a00: 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64  * literal that d
5a10: 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69  oes not begin wi
5a20: 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20  th a wildcard.  
5a30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
5a40: 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 50  sLikeOrGlob(.  P
5a50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5a60: 20 2f 2a 20 50 61 72 73 69 6e 67 20 61 6e 64 20   /* Parsing and 
5a70: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e 67 20  code generating 
5a80: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
5a90: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
5aa0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
5ab0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 45 78 70 72  ession */.  Expr
5ac0: 20 2a 2a 70 70 50 72 65 66 69 78 2c 20 20 2f 2a   **ppPrefix,  /*
5ad0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 54 4b 5f 53   Pointer to TK_S
5ae0: 54 52 49 4e 47 20 65 78 70 72 65 73 73 69 6f 6e  TRING expression
5af0: 20 77 69 74 68 20 70 61 74 74 65 72 6e 20 70 72   with pattern pr
5b00: 65 66 69 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  efix */.  int *p
5b10: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54  isComplete, /* T
5b20: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
5b30: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
5b40: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
5b50: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ter */.  int *pn
5b60: 6f 43 61 73 65 20 20 20 20 20 20 2f 2a 20 54 72  oCase      /* Tr
5b70: 75 65 20 69 66 20 75 70 70 65 72 63 61 73 65 20  ue if uppercase 
5b80: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
5b90: 20 6c 6f 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b   lowercase */.){
5ba0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5bb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
5bc0: 20 53 74 72 69 6e 67 20 6f 6e 20 52 48 53 20 6f   String on RHS o
5bd0: 66 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 20  f LIKE operator 
5be0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68  */.  Expr *pRigh
5bf0: 74 2c 20 2a 70 4c 65 66 74 3b 20 20 20 20 20 20  t, *pLeft;      
5c00: 2f 2a 20 52 69 67 68 74 20 61 6e 64 20 6c 65 66  /* Right and lef
5c10: 74 20 73 69 7a 65 20 6f 66 20 4c 49 4b 45 20 6f  t size of LIKE o
5c20: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70  perator */.  Exp
5c30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 20 20 20  rList *pList;   
5c40: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
5c50: 6f 66 20 6f 70 65 72 61 6e 64 73 20 74 6f 20 74  of operands to t
5c60: 68 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72  he LIKE operator
5c70: 20 2a 2f 0a 20 20 69 6e 74 20 63 3b 20 20 20 20   */.  int c;    
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c90: 20 2f 2a 20 4f 6e 65 20 63 68 61 72 61 63 74 65   /* One characte
5ca0: 72 20 69 6e 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e  r in z[] */.  in
5cb0: 74 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20  t cnt;          
5cc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5cd0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
5ce0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
5cf0: 74 65 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 77  ters */.  char w
5d00: 63 5b 33 5d 3b 20 20 20 20 20 20 20 20 20 20 20  c[3];           
5d10: 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64       /* Wildcard
5d20: 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20   characters */. 
5d30: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
5d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
5d50: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
5d60: 65 20 66 6f 72 20 4c 48 53 20 2a 2f 0a 20 20 73  e for LHS */.  s
5d70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
5d80: 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 44 61 74  rse->db;  /* Dat
5d90: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
5da0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
5db0: 6c 75 65 20 2a 70 56 61 6c 20 3d 20 30 3b 0a 20  lue *pVal = 0;. 
5dc0: 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20   int op;        
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5de0: 70 63 6f 64 65 20 6f 66 20 70 52 69 67 68 74 20  pcode of pRight 
5df0: 2a 2f 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74  */..  if( !sqlit
5e00: 65 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e  e3IsLikeFunction
5e10: 28 64 62 2c 20 70 45 78 70 72 2c 20 70 6e 6f 43  (db, pExpr, pnoC
5e20: 61 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20  ase, wc) ){.    
5e30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 69  return 0;.  }.#i
5e40: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 42 43 44  fdef SQLITE_EBCD
5e50: 49 43 0a 20 20 69 66 28 20 2a 70 6e 6f 43 61 73  IC.  if( *pnoCas
5e60: 65 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e ) return 0;.#e
5e70: 6e 64 69 66 0a 20 20 70 4c 69 73 74 20 3d 20 70  ndif.  pList = p
5e80: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20  Expr->x.pList;. 
5e90: 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74 2d 3e   pLeft = pList->
5ea0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66  a[1].pExpr;.  if
5eb0: 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f  ( pLeft->op!=TK_
5ec0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65  COLUMN ){.    re
5ed0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 43  turn 0;.  }.  pC
5ee0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
5ef0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
5f00: 20 70 4c 65 66 74 29 3b 0a 20 20 61 73 73 65 72   pLeft);.  asser
5f10: 74 28 20 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70  t( pColl!=0 || p
5f20: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d  Left->iColumn==-
5f30: 31 20 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c  1 );.  if( pColl
5f40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
5f50: 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79    if( (pColl->ty
5f60: 70 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f  pe!=SQLITE_COLL_
5f70: 42 49 4e 41 52 59 20 7c 7c 20 2a 70 6e 6f 43 61  BINARY || *pnoCa
5f80: 73 65 29 20 26 26 0a 20 20 20 20 20 20 28 70 43  se) &&.      (pC
5f90: 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54  oll->type!=SQLIT
5fa0: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c  E_COLL_NOCASE ||
5fb0: 20 21 2a 70 6e 6f 43 61 73 65 29 20 29 7b 0a 20   !*pnoCase) ){. 
5fc0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5fd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
5fe0: 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66 74  prAffinity(pLeft
5ff0: 29 21 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  )!=SQLITE_AFF_TE
6000: 58 54 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a  XT ) return 0;..
6010: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69 73 74    pRight = pList
6020: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
6030: 6f 70 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 3b  op = pRight->op;
6040: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 52 45  .  if( op==TK_RE
6050: 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 6f 70  GISTER ){.    op
6060: 20 3d 20 70 52 69 67 68 74 2d 3e 6f 70 32 3b 0a   = pRight->op2;.
6070: 20 20 7d 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b    }.  if( op==TK
6080: 5f 56 41 52 49 41 42 4c 45 20 29 7b 0a 20 20 20  _VARIABLE ){.   
6090: 20 56 64 62 65 20 2a 70 52 65 70 72 65 70 61 72   Vdbe *pReprepar
60a0: 65 20 3d 20 70 50 61 72 73 65 2d 3e 70 52 65 70  e = pParse->pRep
60b0: 72 65 70 61 72 65 3b 0a 20 20 20 20 70 56 61 6c  repare;.    pVal
60c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65   = sqlite3VdbeGe
60d0: 74 56 61 6c 75 65 28 70 52 65 70 72 65 70 61 72  tValue(pReprepar
60e0: 65 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c 75  e, pRight->iColu
60f0: 6d 6e 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  mn, SQLITE_AFF_N
6100: 4f 4e 45 29 3b 0a 20 20 20 20 69 66 28 20 70 56  ONE);.    if( pV
6110: 61 6c 20 26 26 20 73 71 6c 69 74 65 33 5f 76 61  al && sqlite3_va
6120: 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3d 3d  lue_type(pVal)==
6130: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
6140: 20 20 20 20 20 7a 20 3d 20 28 63 68 61 72 20 2a       z = (char *
6150: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6160: 65 78 74 28 70 56 61 6c 29 3b 0a 20 20 20 20 7d  ext(pVal);.    }
6170: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6180: 53 65 74 56 61 72 6d 61 73 6b 28 70 50 61 72 73  SetVarmask(pPars
6190: 65 2d 3e 70 56 64 62 65 2c 20 70 52 69 67 68 74  e->pVdbe, pRight
61a0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
61b0: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e  assert( pRight->
61c0: 6f 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20  op==TK_VARIABLE 
61d0: 7c 7c 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  || pRight->op==T
61e0: 4b 5f 52 45 47 49 53 54 45 52 20 29 3b 0a 20 20  K_REGISTER );.  
61f0: 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b  }else if( op==TK
6200: 5f 53 54 52 49 4e 47 20 29 7b 0a 20 20 20 20 7a  _STRING ){.    z
6210: 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f   = pRight->u.zTo
6220: 6b 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  ken;.  }.  if( z
6230: 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 30 3b   ){.    cnt = 0;
6240: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 7a  .    while( (c=z
6250: 5b 63 6e 74 5d 29 21 3d 30 20 26 26 20 63 21 3d  [cnt])!=0 && c!=
6260: 77 63 5b 30 5d 20 26 26 20 63 21 3d 77 63 5b 31  wc[0] && c!=wc[1
6270: 5d 20 26 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b  ] && c!=wc[2] ){
6280: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
6290: 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
62a0: 3d 30 20 26 26 20 63 21 3d 30 20 26 26 20 32 35  =0 && c!=0 && 25
62b0: 35 21 3d 28 75 38 29 7a 5b 63 6e 74 2d 31 5d 20  5!=(u8)z[cnt-1] 
62c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
62d0: 50 72 65 66 69 78 3b 0a 20 20 20 20 20 20 2a 70  Prefix;.      *p
62e0: 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20 7a 5b 63  isComplete = z[c
62f0: 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26 26 20 7a 5b  nt]==wc[0] && z[
6300: 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20 20 20 20 20  cnt+1]==0;.     
6310: 20 70 50 72 65 66 69 78 20 3d 20 73 71 6c 69 74   pPrefix = sqlit
6320: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
6330: 52 49 4e 47 2c 20 7a 29 3b 0a 20 20 20 20 20 20  RING, z);.      
6340: 69 66 28 20 70 50 72 65 66 69 78 20 29 20 70 50  if( pPrefix ) pP
6350: 72 65 66 69 78 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b  refix->u.zToken[
6360: 63 6e 74 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  cnt] = 0;.      
6370: 2a 70 70 50 72 65 66 69 78 20 3d 20 70 50 72 65  *ppPrefix = pPre
6380: 66 69 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  fix;.      if( o
6390: 70 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 20 29  p==TK_VARIABLE )
63a0: 7b 0a 20 20 20 20 20 20 20 20 56 64 62 65 20 2a  {.        Vdbe *
63b0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
63c0: 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
63d0: 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
63e0: 28 76 2c 20 70 52 69 67 68 74 2d 3e 69 43 6f 6c  (v, pRight->iCol
63f0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
6400: 28 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 26  ( *pisComplete &
6410: 26 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b  & pRight->u.zTok
6420: 65 6e 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 20  en[1] ){.       
6430: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 72 68 73     /* If the rhs
6440: 20 6f 66 20 74 68 65 20 4c 49 4b 45 20 65 78 70   of the LIKE exp
6450: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 76 61 72  ression is a var
6460: 69 61 62 6c 65 2c 20 61 6e 64 20 74 68 65 20 63  iable, and the c
6470: 75 72 72 65 6e 74 0a 20 20 20 20 20 20 20 20 20  urrent.         
6480: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65   ** value of the
6490: 20 76 61 72 69 61 62 6c 65 20 6d 65 61 6e 73 20   variable means 
64a0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
64b0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 4c   to invoke the L
64c0: 49 4b 45 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  IKE.          **
64d0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20   function, then 
64e0: 6e 6f 20 4f 50 5f 56 61 72 69 61 62 6c 65 20 77  no OP_Variable w
64f0: 69 6c 6c 20 62 65 20 61 64 64 65 64 20 74 6f 20  ill be added to 
6500: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 20 20 20  the program..   
6510: 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 63         ** This c
6520: 61 75 73 65 73 20 70 72 6f 62 6c 65 6d 73 20 66  auses problems f
6530: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  or the sqlite3_b
6540: 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61  ind_parameter_na
6550: 6d 65 28 29 0a 20 20 20 20 20 20 20 20 20 20 2a  me().          *
6560: 2a 20 41 50 49 2e 20 54 6f 20 77 6f 72 6b 61 72  * API. To workar
6570: 6f 75 6e 64 20 74 68 65 6d 2c 20 61 64 64 20 61  ound them, add a
6580: 20 64 75 6d 6d 79 20 4f 50 5f 56 61 72 69 61 62   dummy OP_Variab
6590: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 20  le here..       
65a0: 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20     */ .         
65b0: 20 69 6e 74 20 72 31 20 3d 20 73 71 6c 69 74 65   int r1 = sqlite
65c0: 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61 72  3GetTempReg(pPar
65d0: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  se);.          s
65e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 61  qlite3ExprCodeTa
65f0: 72 67 65 74 28 70 50 61 72 73 65 2c 20 70 52 69  rget(pParse, pRi
6600: 67 68 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20  ght, r1);.      
6610: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6620: 68 61 6e 67 65 50 33 28 76 2c 20 73 71 6c 69 74  hangeP3(v, sqlit
6630: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
6640: 72 28 76 29 2d 31 2c 20 30 29 3b 0a 20 20 20 20  r(v)-1, 0);.    
6650: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
6660: 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
6670: 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  se, r1);.       
6680: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6690: 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20  else{.      z = 
66a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
66b0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
66c0: 28 70 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (pVal);.  return
66d0: 20 28 7a 21 3d 30 29 3b 0a 7d 0a 23 65 6e 64 69   (z!=0);.}.#endi
66e0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
66f0: 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49  _LIKE_OPTIMIZATI
6700: 4f 4e 20 2a 2f 0a 0a 0a 23 69 66 6e 64 65 66 20  ON */...#ifndef 
6710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
6720: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
6730: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6740: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
6750: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
6760: 72 6d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  rm.**.**        
6770: 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48 20 65 78   column MATCH ex
6780: 70 72 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74 20 69  pr.**.** If it i
6790: 73 20 74 68 65 6e 20 72 65 74 75 72 6e 20 54 52  s then return TR
67a0: 55 45 2e 20 20 49 66 20 6e 6f 74 2c 20 72 65 74  UE.  If not, ret
67b0: 75 72 6e 20 46 41 4c 53 45 2e 0a 2a 2f 0a 73 74  urn FALSE..*/.st
67c0: 61 74 69 63 20 69 6e 74 20 69 73 4d 61 74 63 68  atic int isMatch
67d0: 4f 66 43 6f 6c 75 6d 6e 28 0a 20 20 45 78 70 72  OfColumn(.  Expr
67e0: 20 2a 70 45 78 70 72 20 20 20 20 20 20 2f 2a 20   *pExpr      /* 
67f0: 54 65 73 74 20 74 68 69 73 20 65 78 70 72 65 73  Test this expres
6800: 73 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  sion */.){.  Exp
6810: 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 0a 20  rList *pList;.. 
6820: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
6830: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20  TK_FUNCTION ){. 
6840: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6850: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
6860: 72 49 43 6d 70 28 70 45 78 70 72 2d 3e 75 2e 7a  rICmp(pExpr->u.z
6870: 54 6f 6b 65 6e 2c 22 6d 61 74 63 68 22 29 21 3d  Token,"match")!=
6880: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6890: 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20 3d  0;.  }.  pList =
68a0: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
68b0: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
68c0: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
68d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
68e0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
68f0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
6900: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
6910: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6920: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
6930: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
6940: 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
6950: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
6960: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
6970: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
6980: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
6990: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
69a0: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
69b0: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
69c0: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
69d0: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
69e0: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
69f0: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
6a00: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
6a10: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
6a20: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
6a30: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
6a40: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
6a50: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
6a60: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
6a70: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
6a80: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
6a90: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f  (SQLITE_OMIT_OR_
6aa0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26  OPTIMIZATION) &&
6ab0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6ac0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
6ad0: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 61 20  /*.** Analyze a 
6ae0: 74 65 72 6d 20 74 68 61 74 20 63 6f 6e 73 69 73  term that consis
6af0: 74 73 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ts of two or mor
6b00: 65 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 0a 2a  e OR-connected.*
6b10: 2a 20 73 75 62 74 65 72 6d 73 2e 20 20 53 6f 20  * subterms.  So 
6b20: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2e  in:.**.**     ..
6b30: 2e 20 57 48 45 52 45 20 20 28 61 3d 35 29 20 41  . WHERE  (a=5) A
6b40: 4e 44 20 28 62 3d 37 20 4f 52 20 63 3d 39 20 4f  ND (b=7 OR c=9 O
6b50: 52 20 64 3d 31 33 29 20 41 4e 44 20 28 64 3d 31  R d=13) AND (d=1
6b60: 33 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  3).**           
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5e                 ^
6b80: 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e  ^^^^^^^^^^^^^^^^
6b90: 5e 5e 5e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ^^^.**.** This r
6ba0: 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20  outine analyzes 
6bb0: 74 65 72 6d 73 20 73 75 63 68 20 61 73 20 74 68  terms such as th
6bc0: 65 20 6d 69 64 64 6c 65 20 74 65 72 6d 20 69 6e  e middle term in
6bd0: 20 74 68 65 20 61 62 6f 76 65 20 65 78 61 6d 70   the above examp
6be0: 6c 65 2e 0a 2a 2a 20 41 20 57 68 65 72 65 4f 72  le..** A WhereOr
6bf0: 54 65 72 6d 20 6f 62 6a 65 63 74 20 69 73 20 63  Term object is c
6c00: 6f 6d 70 75 74 65 64 20 61 6e 64 20 61 74 74 61  omputed and atta
6c10: 63 68 65 64 20 74 6f 20 74 68 65 20 74 65 72 6d  ched to the term
6c20: 20 75 6e 64 65 72 0a 2a 2a 20 61 6e 61 6c 79 73   under.** analys
6c30: 69 73 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  is, regardless o
6c40: 66 20 74 68 65 20 6f 75 74 63 6f 6d 65 20 6f 66  f the outcome of
6c50: 20 74 68 65 20 61 6e 61 6c 79 73 69 73 2e 20 20   the analysis.  
6c60: 48 65 6e 63 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  Hence:.**.**    
6c70: 20 57 68 65 72 65 54 65 72 6d 2e 77 74 46 6c 61   WhereTerm.wtFla
6c80: 67 73 20 20 20 7c 3d 20 20 54 45 52 4d 5f 4f 52  gs   |=  TERM_OR
6c90: 49 4e 46 4f 0a 2a 2a 20 20 20 20 20 57 68 65 72  INFO.**     Wher
6ca0: 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66 6f 20  eTerm.u.pOrInfo 
6cb0: 20 3d 20 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c   =  a dynamicall
6cc0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72  y allocated Wher
6cd0: 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63 74 0a 2a  eOrTerm object.*
6ce0: 2a 0a 2a 2a 20 54 68 65 20 74 65 72 6d 20 62 65  *.** The term be
6cf0: 69 6e 67 20 61 6e 61 6c 79 7a 65 64 20 6d 75 73  ing analyzed mus
6d00: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
6d10: 72 65 20 6f 66 20 4f 52 2d 63 6f 6e 6e 65 63 74  re of OR-connect
6d20: 65 64 20 73 75 62 74 65 72 6d 73 2e 0a 2a 2a 20  ed subterms..** 
6d30: 41 20 73 69 6e 67 6c 65 20 73 75 62 74 65 72 6d  A single subterm
6d40: 20 6d 69 67 68 74 20 62 65 20 61 20 73 65 74 20   might be a set 
6d50: 6f 66 20 41 4e 44 2d 63 6f 6e 6e 65 63 74 65 64  of AND-connected
6d60: 20 73 75 62 2d 73 75 62 74 65 72 6d 73 2e 0a 2a   sub-subterms..*
6d70: 2a 20 45 78 61 6d 70 6c 65 73 20 6f 66 20 74 65  * Examples of te
6d80: 72 6d 73 20 75 6e 64 65 72 20 61 6e 61 6c 79 73  rms under analys
6d90: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 41  is:.**.**     (A
6da0: 29 20 20 20 20 20 74 31 2e 78 3d 74 32 2e 79 20  )     t1.x=t2.y 
6db0: 4f 52 20 74 31 2e 78 3d 74 32 2e 7a 20 4f 52 20  OR t1.x=t2.z OR 
6dc0: 74 31 2e 79 3d 31 35 20 4f 52 20 74 31 2e 7a 3d  t1.y=15 OR t1.z=
6dd0: 74 33 2e 61 2b 35 0a 2a 2a 20 20 20 20 20 28 42  t3.a+5.**     (B
6de0: 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f 52  )     x=expr1 OR
6df0: 20 65 78 70 72 32 3d 78 20 4f 52 20 78 3d 65 78   expr2=x OR x=ex
6e00: 70 72 33 0a 2a 2a 20 20 20 20 20 28 43 29 20 20  pr3.**     (C)  
6e10: 20 20 20 74 31 2e 78 3d 74 32 2e 79 20 4f 52 20     t1.x=t2.y OR 
6e20: 28 74 31 2e 78 3d 74 32 2e 7a 20 41 4e 44 20 74  (t1.x=t2.z AND t
6e30: 31 2e 79 3d 31 35 29 0a 2a 2a 20 20 20 20 20 28  1.y=15).**     (
6e40: 44 29 20 20 20 20 20 78 3d 65 78 70 72 31 20 4f  D)     x=expr1 O
6e50: 52 20 28 79 3e 31 31 20 41 4e 44 20 79 3c 32 32  R (y>11 AND y<22
6e60: 20 41 4e 44 20 7a 20 4c 49 4b 45 20 27 2a 68 65   AND z LIKE '*he
6e70: 6c 6c 6f 2a 27 29 0a 2a 2a 20 20 20 20 20 28 45  llo*').**     (E
6e80: 29 20 20 20 20 20 28 70 2e 61 3d 31 20 41 4e 44  )     (p.a=1 AND
6e90: 20 71 2e 62 3d 32 20 41 4e 44 20 72 2e 63 3d 33   q.b=2 AND r.c=3
6ea0: 29 20 4f 52 20 28 70 2e 78 3d 34 20 41 4e 44 20  ) OR (p.x=4 AND 
6eb0: 71 2e 79 3d 35 20 41 4e 44 20 72 2e 7a 3d 36 29  q.y=5 AND r.z=6)
6ec0: 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 31 3a 0a 2a  .**.** CASE 1:.*
6ed0: 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75 62 74  *.** If all subt
6ee0: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
6ef0: 66 6f 72 6d 20 54 2e 43 3d 65 78 70 72 20 66 6f  form T.C=expr fo
6f00: 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20 63 6f  r some single co
6f10: 6c 75 6d 6e 20 6f 66 20 43 0a 2a 2a 20 61 20 73  lumn of C.** a s
6f20: 69 6e 67 6c 65 20 74 61 62 6c 65 20 54 20 28 61  ingle table T (a
6f30: 73 20 73 68 6f 77 6e 20 69 6e 20 65 78 61 6d 70  s shown in examp
6f40: 6c 65 20 42 20 61 62 6f 76 65 29 20 74 68 65 6e  le B above) then
6f50: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 76 69   create a new vi
6f60: 72 74 75 61 6c 0a 2a 2a 20 74 65 72 6d 20 74 68  rtual.** term th
6f70: 61 74 20 69 73 20 61 6e 20 65 71 75 69 76 61 6c  at is an equival
6f80: 65 6e 74 20 49 4e 20 65 78 70 72 65 73 73 69 6f  ent IN expressio
6f90: 6e 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  n.  In other wor
6fa0: 64 73 2c 20 69 66 20 74 68 65 20 74 65 72 6d 0a  ds, if the term.
6fb0: 2a 2a 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a 65  ** being analyze
6fc0: 64 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  d is:.**.**     
6fd0: 20 78 20 3d 20 65 78 70 72 31 20 20 4f 52 20 20   x = expr1  OR  
6fe0: 65 78 70 72 32 20 3d 20 78 20 20 4f 52 20 20 78  expr2 = x  OR  x
6ff0: 20 3d 20 65 78 70 72 33 0a 2a 2a 0a 2a 2a 20 74   = expr3.**.** t
7000: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
7010: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 20 6c 69   virtual term li
7020: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
7030: 20 20 20 20 78 20 49 4e 20 28 65 78 70 72 31 2c      x IN (expr1,
7040: 65 78 70 72 32 2c 65 78 70 72 33 29 0a 2a 2a 0a  expr2,expr3).**.
7050: 2a 2a 20 43 41 53 45 20 32 3a 0a 2a 2a 0a 2a 2a  ** CASE 2:.**.**
7060: 20 49 66 20 61 6c 6c 20 73 75 62 74 65 72 6d 73   If all subterms
7070: 20 61 72 65 20 69 6e 64 65 78 61 62 6c 65 20 62   are indexable b
7080: 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  y a single table
7090: 20 54 2c 20 74 68 65 6e 20 73 65 74 0a 2a 2a 0a   T, then set.**.
70a0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
70b0: 2e 65 4f 70 65 72 61 74 6f 72 20 20 20 20 20 20  .eOperator      
70c0: 20 20 20 20 20 20 20 20 3d 20 20 57 4f 5f 4f 52          =  WO_OR
70d0: 0a 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72  .**     WhereTer
70e0: 6d 2e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64  m.u.pOrInfo->ind
70f0: 65 78 61 62 6c 65 20 20 7c 3d 20 20 74 68 65 20  exable  |=  the 
7100: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
7110: 72 20 74 61 62 6c 65 20 54 0a 2a 2a 0a 2a 2a 20  r table T.**.** 
7120: 41 20 73 75 62 74 65 72 6d 20 69 73 20 22 69 6e  A subterm is "in
7130: 64 65 78 61 62 6c 65 22 20 69 66 20 69 74 20 69  dexable" if it i
7140: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
7150: 20 22 54 2e 43 20 3c 6f 70 3e 20 3c 65 78 70 72   "T.C <op> <expr
7160: 3e 22 20 77 68 65 72 65 20 43 20 69 73 20 61 6e  >" where C is an
7170: 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 61 62 6c  y column of tabl
7180: 65 20 54 20 61 6e 64 20 0a 2a 2a 20 3c 6f 70 3e  e T and .** <op>
7190: 20 69 73 20 6f 6e 65 20 6f 66 20 22 3d 22 2c 20   is one of "=", 
71a0: 22 3c 22 2c 20 22 3c 3d 22 2c 20 22 3e 22 2c 20  "<", "<=", ">", 
71b0: 22 3e 3d 22 2c 20 22 49 53 20 4e 55 4c 4c 22 2c  ">=", "IS NULL",
71c0: 20 6f 72 20 22 49 4e 22 2e 0a 2a 2a 20 41 20 73   or "IN"..** A s
71d0: 75 62 74 65 72 6d 20 69 73 20 61 6c 73 6f 20 69  ubterm is also i
71e0: 6e 64 65 78 61 62 6c 65 20 69 66 20 69 74 20 69  ndexable if it i
71f0: 73 20 61 6e 20 41 4e 44 20 6f 66 20 74 77 6f 20  s an AND of two 
7200: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 73 75 62 73 75  or more.** subsu
7210: 62 74 65 72 6d 73 20 61 74 20 6c 65 61 73 74 20  bterms at least 
7220: 6f 6e 65 20 6f 66 20 77 68 69 63 68 20 69 73 20  one of which is 
7230: 69 6e 64 65 78 61 62 6c 65 2e 20 20 49 6e 64 65  indexable.  Inde
7240: 78 61 62 6c 65 20 41 4e 44 20 0a 2a 2a 20 73 75  xable AND .** su
7250: 62 74 65 72 6d 73 20 68 61 76 65 20 74 68 65 69  bterms have thei
7260: 72 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20  r eOperator set 
7270: 74 6f 20 57 4f 5f 41 4e 44 20 61 6e 64 20 74 68  to WO_AND and th
7280: 65 79 20 68 61 76 65 0a 2a 2a 20 75 2e 70 41 6e  ey have.** u.pAn
7290: 64 49 6e 66 6f 20 73 65 74 20 74 6f 20 61 20 64  dInfo set to a d
72a0: 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
72b0: 61 74 65 64 20 57 68 65 72 65 41 6e 64 54 65 72  ated WhereAndTer
72c0: 6d 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20  m object..**.** 
72d0: 46 72 6f 6d 20 61 6e 6f 74 68 65 72 20 70 6f 69  From another poi
72e0: 6e 74 20 6f 66 20 76 69 65 77 2c 20 22 69 6e 64  nt of view, "ind
72f0: 65 78 61 62 6c 65 22 20 6d 65 61 6e 73 20 74 68  exable" means th
7300: 61 74 20 74 68 65 20 73 75 62 74 65 72 6d 20 63  at the subterm c
7310: 6f 75 6c 64 0a 2a 2a 20 70 6f 74 65 6e 74 69 61  ould.** potentia
7320: 6c 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68  lly be used with
7330: 20 61 6e 20 69 6e 64 65 78 20 69 66 20 61 6e 20   an index if an 
7340: 61 70 70 72 6f 70 72 69 61 74 65 20 69 6e 64 65  appropriate inde
7350: 78 20 65 78 69 73 74 73 2e 0a 2a 2a 20 54 68 69  x exists..** Thi
7360: 73 20 61 6e 61 6c 79 73 69 73 20 64 6f 65 73 20  s analysis does 
7370: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 20 77 68 65  not consider whe
7380: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20  ther or not the 
7390: 69 6e 64 65 78 20 65 78 69 73 74 73 3b 20 74 68  index exists; th
73a0: 61 74 0a 2a 2a 20 69 73 20 73 6f 6d 65 74 68 69  at.** is somethi
73b0: 6e 67 20 74 68 65 20 62 65 73 74 49 6e 64 65 78  ng the bestIndex
73c0: 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  () routine will 
73d0: 64 65 74 65 72 6d 69 6e 65 2e 20 20 54 68 69 73  determine.  This
73e0: 20 61 6e 61 6c 79 73 69 73 0a 2a 2a 20 6f 6e 6c   analysis.** onl
73f0: 79 20 6c 6f 6f 6b 73 20 61 74 20 77 68 65 74 68  y looks at wheth
7400: 65 72 20 73 75 62 74 65 72 6d 73 20 61 70 70 72  er subterms appr
7410: 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65  opriate for inde
7420: 78 69 6e 67 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a  xing exist..**.*
7430: 2a 20 41 6c 6c 20 65 78 61 6d 70 6c 65 73 20 41  * All examples A
7440: 20 74 68 72 6f 75 67 68 20 45 20 61 62 6f 76 65   through E above
7450: 20 61 6c 6c 20 73 61 74 69 73 66 79 20 63 61 73   all satisfy cas
7460: 65 20 32 2e 20 20 42 75 74 20 69 66 20 61 20 74  e 2.  But if a t
7470: 65 72 6d 0a 2a 2a 20 61 6c 73 6f 20 73 74 61 74  erm.** also stat
7480: 69 73 66 69 65 73 20 63 61 73 65 20 31 20 28 73  isfies case 1 (s
7490: 75 63 68 20 61 73 20 42 29 20 77 65 20 6b 6e 6f  uch as B) we kno
74a0: 77 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  w that the optim
74b0: 69 7a 65 72 20 77 69 6c 6c 0a 2a 2a 20 61 6c 77  izer will.** alw
74c0: 61 79 73 20 70 72 65 66 65 72 20 63 61 73 65 20  ays prefer case 
74d0: 31 2c 20 73 6f 20 69 6e 20 74 68 61 74 20 63 61  1, so in that ca
74e0: 73 65 20 77 65 20 70 72 65 74 65 6e 64 20 74 68  se we pretend th
74f0: 61 74 20 63 61 73 65 20 32 20 69 73 20 6e 6f 74  at case 2 is not
7500: 0a 2a 2a 20 73 61 74 69 73 66 69 65 64 2e 0a 2a  .** satisfied..*
7510: 2a 0a 2a 2a 20 49 74 20 6d 69 67 68 74 20 62 65  *.** It might be
7520: 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 6d   the case that m
7530: 75 6c 74 69 70 6c 65 20 74 61 62 6c 65 73 20 61  ultiple tables a
7540: 72 65 20 69 6e 64 65 78 61 62 6c 65 2e 20 20 46  re indexable.  F
7550: 6f 72 20 65 78 61 6d 70 6c 65 2c 0a 2a 2a 20 28  or example,.** (
7560: 45 29 20 61 62 6f 76 65 20 69 73 20 69 6e 64 65  E) above is inde
7570: 78 61 62 6c 65 20 6f 6e 20 74 61 62 6c 65 73 20  xable on tables 
7580: 50 2c 20 51 2c 20 61 6e 64 20 52 2e 0a 2a 2a 0a  P, Q, and R..**.
7590: 2a 2a 20 54 65 72 6d 73 20 74 68 61 74 20 73 61  ** Terms that sa
75a0: 74 69 73 66 79 20 63 61 73 65 20 32 20 61 72 65  tisfy case 2 are
75b0: 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
75c0: 6c 6f 6f 6b 75 70 20 62 79 20 75 73 69 6e 67 0a  lookup by using.
75d0: 2a 2a 20 73 65 70 61 72 61 74 65 20 69 6e 64 69  ** separate indi
75e0: 63 65 73 20 74 6f 20 66 69 6e 64 20 72 6f 77 69  ces to find rowi
75f0: 64 73 20 66 6f 72 20 65 61 63 68 20 73 75 62 74  ds for each subt
7600: 65 72 6d 20 61 6e 64 20 63 6f 6d 70 6f 73 69 6e  erm and composin
7610: 67 0a 2a 2a 20 74 68 65 20 75 6e 69 6f 6e 20 6f  g.** the union o
7620: 66 20 61 6c 6c 20 72 6f 77 69 64 73 20 75 73 69  f all rowids usi
7630: 6e 67 20 61 20 52 6f 77 53 65 74 20 6f 62 6a 65  ng a RowSet obje
7640: 63 74 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ct.  This is sim
7650: 69 6c 61 72 0a 2a 2a 20 74 6f 20 22 62 69 74 6d  ilar.** to "bitm
7660: 61 70 20 69 6e 64 69 63 65 73 22 20 69 6e 20 6f  ap indices" in o
7670: 74 68 65 72 20 64 61 74 61 62 61 73 65 20 65 6e  ther database en
7680: 67 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 54 48  gines..**.** OTH
7690: 45 52 57 49 53 45 3a 0a 2a 2a 0a 2a 2a 20 49 66  ERWISE:.**.** If
76a0: 20 6e 65 69 74 68 65 72 20 63 61 73 65 20 31 20   neither case 1 
76b0: 6e 6f 72 20 63 61 73 65 20 32 20 61 70 70 6c 79  nor case 2 apply
76c0: 2c 20 74 68 65 6e 20 6c 65 61 76 65 20 74 68 65  , then leave the
76d0: 20 65 4f 70 65 72 61 74 6f 72 20 73 65 74 20 74   eOperator set t
76e0: 6f 0a 2a 2a 20 7a 65 72 6f 2e 20 20 54 68 69 73  o.** zero.  This
76f0: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 75 73 65   term is not use
7700: 66 75 6c 20 66 6f 72 20 73 65 61 72 63 68 2e 0a  ful for search..
7710: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
7720: 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
7730: 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72  (.  SrcList *pSr
7740: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c,            /*
7750: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
7760: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7770: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
7780: 2f 2a 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  /* the complete 
7790: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
77a0: 20 20 69 6e 74 20 69 64 78 54 65 72 6d 20 20 20    int idxTerm   
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
77c0: 6e 64 65 78 20 6f 66 20 74 68 65 20 4f 52 2d 74  ndex of the OR-t
77d0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
77e0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 50 61 72 73 65  ed */.){.  Parse
77f0: 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e   *pParse = pWC->
7800: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
7810: 20 20 20 2f 2a 20 50 61 72 73 65 72 20 63 6f 6e     /* Parser con
7820: 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  text */.  sqlite
7830: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
7840: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
7850: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
7860: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 57 68  nnection */.  Wh
7870: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d  ereTerm *pTerm =
7880: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
7890: 5d 3b 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72  ];    /* The ter
78a0: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
78b0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
78c0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
78d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
78e0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
78f0: 6f 66 20 74 68 65 20 74 65 72 6d 20 2a 2f 0a 20  of the term */. 
7900: 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
7910: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
7920: 4d 61 73 6b 53 65 74 3b 20 2f 2a 20 54 61 62 6c  MaskSet; /* Tabl
7930: 65 20 75 73 65 20 6d 61 73 6b 73 20 2a 2f 0a 20  e use masks */. 
7940: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
7950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7960: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
7970: 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 57   counters */.  W
7980: 68 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 57  hereClause *pOrW
7990: 63 3b 20 20 20 20 20 20 20 2f 2a 20 42 72 65 61  c;       /* Brea
79a0: 6b 75 70 20 6f 66 20 70 54 65 72 6d 20 69 6e 74  kup of pTerm int
79b0: 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20  o subterms */.  
79c0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
79d0: 72 6d 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 53  rm;       /* A S
79e0: 75 62 2d 74 65 72 6d 20 77 69 74 68 69 6e 20 74  ub-term within t
79f0: 68 65 20 70 4f 72 57 63 20 2a 2f 0a 20 20 57 68  he pOrWc */.  Wh
7a00: 65 72 65 4f 72 49 6e 66 6f 20 2a 70 4f 72 49 6e  ereOrInfo *pOrIn
7a10: 66 6f 3b 20 20 20 20 20 2f 2a 20 41 64 64 69 74  fo;     /* Addit
7a20: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
7a30: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
7a40: 68 20 70 54 65 72 6d 20 2a 2f 0a 20 20 42 69 74  h pTerm */.  Bit
7a50: 6d 61 73 6b 20 63 68 6e 67 54 6f 49 4e 3b 20 20  mask chngToIN;  
7a60: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 73         /* Tables
7a70: 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74 69   that might sati
7a80: 73 66 79 20 63 61 73 65 20 31 20 2a 2f 0a 20 20  sfy case 1 */.  
7a90: 42 69 74 6d 61 73 6b 20 69 6e 64 65 78 61 62 6c  Bitmask indexabl
7aa0: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62  e;        /* Tab
7ab0: 6c 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 64  les that are ind
7ac0: 65 78 61 62 6c 65 2c 20 73 61 74 69 73 66 79 69  exable, satisfyi
7ad0: 6e 67 20 63 61 73 65 20 32 20 2a 2f 0a 0a 20 20  ng case 2 */..  
7ae0: 2f 2a 0a 20 20 2a 2a 20 42 72 65 61 6b 20 74 68  /*.  ** Break th
7af0: 65 20 4f 52 20 63 6c 61 75 73 65 20 69 6e 74 6f  e OR clause into
7b00: 20 69 74 73 20 73 65 70 61 72 61 74 65 20 73 75   its separate su
7b10: 62 74 65 72 6d 73 2e 20 20 54 68 65 20 73 75 62  bterms.  The sub
7b20: 74 65 72 6d 73 20 61 72 65 0a 20 20 2a 2a 20 73  terms are.  ** s
7b30: 74 6f 72 65 64 20 69 6e 20 61 20 57 68 65 72 65  tored in a Where
7b40: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
7b50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 77 69 74 68   containing with
7b60: 69 6e 20 74 68 65 20 57 68 65 72 65 4f 72 49 6e  in the WhereOrIn
7b70: 66 6f 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 74  fo.  ** object t
7b80: 68 61 74 20 69 73 20 61 74 74 61 63 68 65 64 20  hat is attached 
7b90: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
7ba0: 4f 52 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 0a  OR clause term..
7bb0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
7bc0: 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
7bd0: 20 28 54 45 52 4d 5f 44 59 4e 41 4d 49 43 7c 54   (TERM_DYNAMIC|T
7be0: 45 52 4d 5f 4f 52 49 4e 46 4f 7c 54 45 52 4d 5f  ERM_ORINFO|TERM_
7bf0: 41 4e 44 49 4e 46 4f 29 29 3d 3d 30 20 29 3b 0a  ANDINFO))==0 );.
7c00: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
7c10: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20  >op==TK_OR );.  
7c20: 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f  pTerm->u.pOrInfo
7c30: 20 3d 20 70 4f 72 49 6e 66 6f 20 3d 20 73 71 6c   = pOrInfo = sql
7c40: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
7c50: 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70 4f 72  (db, sizeof(*pOr
7c60: 49 6e 66 6f 29 29 3b 0a 20 20 69 66 28 20 70 4f  Info));.  if( pO
7c70: 72 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74 75 72  rInfo==0 ) retur
7c80: 6e 3b 0a 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c  n;.  pTerm->wtFl
7c90: 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 49 4e  ags |= TERM_ORIN
7ca0: 46 4f 3b 0a 20 20 70 4f 72 57 63 20 3d 20 26 70  FO;.  pOrWc = &p
7cb0: 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 77 68  OrInfo->wc;.  wh
7cc0: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 70 4f  ereClauseInit(pO
7cd0: 72 57 63 2c 20 70 57 43 2d 3e 70 50 61 72 73 65  rWc, pWC->pParse
7ce0: 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20 77  , pMaskSet);.  w
7cf0: 68 65 72 65 53 70 6c 69 74 28 70 4f 72 57 63 2c  hereSplit(pOrWc,
7d00: 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a   pExpr, TK_OR);.
7d10: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c    exprAnalyzeAll
7d20: 28 70 53 72 63 2c 20 70 4f 72 57 63 29 3b 0a 20  (pSrc, pOrWc);. 
7d30: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
7d40: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 3b 0a  ailed ) return;.
7d50: 20 20 61 73 73 65 72 74 28 20 70 4f 72 57 63 2d    assert( pOrWc-
7d60: 3e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 0a 20 20  >nTerm>=2 );..  
7d70: 2f 2a 0a 20 20 2a 2a 20 43 6f 6d 70 75 74 65 20  /*.  ** Compute 
7d80: 74 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65  the set of table
7d90: 73 20 74 68 61 74 20 6d 69 67 68 74 20 73 61 74  s that might sat
7da0: 69 73 66 79 20 63 61 73 65 73 20 31 20 6f 72 20  isfy cases 1 or 
7db0: 32 2e 0a 20 20 2a 2f 0a 20 20 69 6e 64 65 78 61  2..  */.  indexa
7dc0: 62 6c 65 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ble = ~(Bitmask)
7dd0: 30 3b 0a 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20  0;.  chngToIN = 
7de0: 7e 28 70 57 43 2d 3e 76 6d 61 73 6b 29 3b 0a 20  ~(pWC->vmask);. 
7df0: 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e 6e 54   for(i=pOrWc->nT
7e00: 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 70  erm-1, pOrTerm=p
7e10: 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 20 26 26  OrWc->a; i>=0 &&
7e20: 20 69 6e 64 65 78 61 62 6c 65 3b 20 69 2d 2d 2c   indexable; i--,
7e30: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
7e40: 20 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 65   if( (pOrTerm->e
7e50: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 53 49  Operator & WO_SI
7e60: 4e 47 4c 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  NGLE)==0 ){.    
7e70: 20 20 57 68 65 72 65 41 6e 64 49 6e 66 6f 20 2a    WhereAndInfo *
7e80: 70 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAndInfo;.      
7e90: 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d  assert( pOrTerm-
7ea0: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 30 20 29 3b  >eOperator==0 );
7eb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
7ec0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
7ed0: 20 26 20 28 54 45 52 4d 5f 41 4e 44 49 4e 46 4f   & (TERM_ANDINFO
7ee0: 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 29 3d 3d  |TERM_ORINFO))==
7ef0: 30 20 29 3b 0a 20 20 20 20 20 20 63 68 6e 67 54  0 );.      chngT
7f00: 6f 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  oIN = 0;.      p
7f10: 41 6e 64 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65  AndInfo = sqlite
7f20: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
7f30: 20 73 69 7a 65 6f 66 28 2a 70 41 6e 64 49 6e 66   sizeof(*pAndInf
7f40: 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
7f50: 41 6e 64 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  AndInfo ){.     
7f60: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a     WhereClause *
7f70: 70 41 6e 64 57 43 3b 0a 20 20 20 20 20 20 20 20  pAndWC;.        
7f80: 57 68 65 72 65 54 65 72 6d 20 2a 70 41 6e 64 54  WhereTerm *pAndT
7f90: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  erm;.        int
7fa0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 42 69 74 6d   j;.        Bitm
7fb0: 61 73 6b 20 62 20 3d 20 30 3b 0a 20 20 20 20 20  ask b = 0;.     
7fc0: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 70 41     pOrTerm->u.pA
7fd0: 6e 64 49 6e 66 6f 20 3d 20 70 41 6e 64 49 6e 66  ndInfo = pAndInf
7fe0: 6f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  o;.        pOrTe
7ff0: 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
8000: 45 52 4d 5f 41 4e 44 49 4e 46 4f 3b 0a 20 20 20  ERM_ANDINFO;.   
8010: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 65 4f       pOrTerm->eO
8020: 70 65 72 61 74 6f 72 20 3d 20 57 4f 5f 41 4e 44  perator = WO_AND
8030: 3b 0a 20 20 20 20 20 20 20 20 70 41 6e 64 57 43  ;.        pAndWC
8040: 20 3d 20 26 70 41 6e 64 49 6e 66 6f 2d 3e 77 63   = &pAndInfo->wc
8050: 3b 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 43  ;.        whereC
8060: 6c 61 75 73 65 49 6e 69 74 28 70 41 6e 64 57 43  lauseInit(pAndWC
8070: 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70  , pWC->pParse, p
8080: 4d 61 73 6b 53 65 74 29 3b 0a 20 20 20 20 20 20  MaskSet);.      
8090: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 41 6e    whereSplit(pAn
80a0: 64 57 43 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45  dWC, pOrTerm->pE
80b0: 78 70 72 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20  xpr, TK_AND);.  
80c0: 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a        exprAnalyz
80d0: 65 41 6c 6c 28 70 53 72 63 2c 20 70 41 6e 64 57  eAll(pSrc, pAndW
80e0: 43 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  C);.        test
80f0: 63 61 73 65 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63  case( db->malloc
8100: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20  Failed );.      
8110: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
8120: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
8130: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 41       for(j=0, pA
8140: 6e 64 54 65 72 6d 3d 70 41 6e 64 57 43 2d 3e 61  ndTerm=pAndWC->a
8150: 3b 20 6a 3c 70 41 6e 64 57 43 2d 3e 6e 54 65 72  ; j<pAndWC->nTer
8160: 6d 3b 20 6a 2b 2b 2c 20 70 41 6e 64 54 65 72 6d  m; j++, pAndTerm
8170: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
8180: 20 61 73 73 65 72 74 28 20 70 41 6e 64 54 65 72   assert( pAndTer
8190: 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20  m->pExpr );.    
81a0: 20 20 20 20 20 20 20 20 69 66 28 20 61 6c 6c 6f          if( allo
81b0: 77 65 64 4f 70 28 70 41 6e 64 54 65 72 6d 2d 3e  wedOp(pAndTerm->
81c0: 70 45 78 70 72 2d 3e 6f 70 29 20 29 7b 0a 20 20  pExpr->op) ){.  
81d0: 20 20 20 20 20 20 20 20 20 20 20 20 62 20 7c 3d              b |=
81e0: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
81f0: 74 2c 20 70 41 6e 64 54 65 72 6d 2d 3e 6c 65 66  t, pAndTerm->lef
8200: 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  tCursor);.      
8210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8220: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8230: 20 20 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20        indexable 
8240: 26 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &= b;.      }.  
8250: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
8260: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8270: 45 52 4d 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20  ERM_COPIED ){.  
8280: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 68 69 73      /* Skip this
8290: 20 74 65 72 6d 20 66 6f 72 20 6e 6f 77 2e 20 20   term for now.  
82a0: 57 65 20 72 65 76 69 73 69 74 20 69 74 20 77 68  We revisit it wh
82b0: 65 6e 20 77 65 20 70 72 6f 63 65 73 73 20 74 68  en we process th
82c0: 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65  e.      ** corre
82d0: 73 70 6f 6e 64 69 6e 67 20 54 45 52 4d 5f 56 49  sponding TERM_VI
82e0: 52 54 55 41 4c 20 74 65 72 6d 20 2a 2f 0a 20 20  RTUAL term */.  
82f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 42    }else{.      B
8300: 69 74 6d 61 73 6b 20 62 3b 0a 20 20 20 20 20 20  itmask b;.      
8310: 62 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73  b = getMask(pMas
8320: 6b 53 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c  kSet, pOrTerm->l
8330: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
8340: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 77    if( pOrTerm->w
8350: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
8360: 52 54 55 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  RTUAL ){.       
8370: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
8380: 65 72 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  er = &pOrWc->a[p
8390: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
83a0: 3b 0a 20 20 20 20 20 20 20 20 62 20 7c 3d 20 67  ;.        b |= g
83b0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
83c0: 20 70 4f 74 68 65 72 2d 3e 6c 65 66 74 43 75 72   pOther->leftCur
83d0: 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  sor);.      }.  
83e0: 20 20 20 20 69 6e 64 65 78 61 62 6c 65 20 26 3d      indexable &=
83f0: 20 62 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f   b;.      if( pO
8400: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
8410: 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20  !=WO_EQ ){.     
8420: 20 20 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b     chngToIN = 0;
8430: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8440: 20 20 20 20 20 20 63 68 6e 67 54 6f 49 4e 20 26        chngToIN &
8450: 3d 20 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = b;.      }.   
8460: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
8470: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 73 65 74  * Record the set
8480: 20 6f 66 20 74 61 62 6c 65 73 20 74 68 61 74 20   of tables that 
8490: 73 61 74 69 73 66 79 20 63 61 73 65 20 32 2e 20  satisfy case 2. 
84a0: 20 54 68 65 20 73 65 74 20 6d 69 67 68 74 20 62   The set might b
84b0: 65 0a 20 20 2a 2a 20 65 6d 70 74 79 2e 0a 20 20  e.  ** empty..  
84c0: 2a 2f 0a 20 20 70 4f 72 49 6e 66 6f 2d 3e 69 6e  */.  pOrInfo->in
84d0: 64 65 78 61 62 6c 65 20 3d 20 69 6e 64 65 78 61  dexable = indexa
84e0: 62 6c 65 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f  ble;.  pTerm->eO
84f0: 70 65 72 61 74 6f 72 20 3d 20 69 6e 64 65 78 61  perator = indexa
8500: 62 6c 65 3d 3d 30 20 3f 20 30 20 3a 20 57 4f 5f  ble==0 ? 0 : WO_
8510: 4f 52 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63  OR;..  /*.  ** c
8520: 68 6e 67 54 6f 49 4e 20 68 6f 6c 64 73 20 61 20  hngToIN holds a 
8530: 73 65 74 20 6f 66 20 74 61 62 6c 65 73 20 74 68  set of tables th
8540: 61 74 20 2a 6d 69 67 68 74 2a 20 73 61 74 69 73  at *might* satis
8550: 66 79 20 63 61 73 65 20 31 2e 20 20 42 75 74 0a  fy case 1.  But.
8560: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 74 6f 20    ** we have to 
8570: 64 6f 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  do some addition
8580: 61 6c 20 63 68 65 63 6b 69 6e 67 20 74 6f 20 73  al checking to s
8590: 65 65 20 69 66 20 63 61 73 65 20 31 20 72 65 61  ee if case 1 rea
85a0: 6c 6c 79 0a 20 20 2a 2a 20 69 73 20 73 61 74 69  lly.  ** is sati
85b0: 73 66 69 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  sfied..  **.  **
85c0: 20 63 68 6e 67 54 6f 49 4e 20 77 69 6c 6c 20 68   chngToIN will h
85d0: 6f 6c 64 20 65 69 74 68 65 72 20 30 2c 20 31 2c  old either 0, 1,
85e0: 20 6f 72 20 32 20 62 69 74 73 2e 20 20 54 68 65   or 2 bits.  The
85f0: 20 30 2d 62 69 74 20 63 61 73 65 20 6d 65 61 6e   0-bit case mean
8600: 73 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 72  s.  ** that ther
8610: 65 20 69 73 20 6e 6f 20 70 6f 73 73 69 62 69 6c  e is no possibil
8620: 69 74 79 20 6f 66 20 74 72 61 6e 73 66 6f 72 6d  ity of transform
8630: 69 6e 67 20 74 68 65 20 4f 52 20 63 6c 61 75 73  ing the OR claus
8640: 65 20 69 6e 74 6f 20 61 6e 0a 20 20 2a 2a 20 49  e into an.  ** I
8650: 4e 20 6f 70 65 72 61 74 6f 72 20 62 65 63 61 75  N operator becau
8660: 73 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 74  se one or more t
8670: 65 72 6d 73 20 69 6e 20 74 68 65 20 4f 52 20 63  erms in the OR c
8680: 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e 0a 20 20  lause contain.  
8690: 2a 2a 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68  ** something oth
86a0: 65 72 20 74 68 61 6e 20 3d 3d 20 6f 6e 20 61 20  er than == on a 
86b0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 73 69  column in the si
86c0: 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68 65  ngle table.  The
86d0: 20 31 2d 62 69 74 0a 20 20 2a 2a 20 63 61 73 65   1-bit.  ** case
86e0: 20 6d 65 61 6e 73 20 74 68 61 74 20 65 76 65 72   means that ever
86f0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  y term of the OR
8700: 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20 74 68   clause is of th
8710: 65 20 66 6f 72 6d 0a 20 20 2a 2a 20 22 74 61 62  e form.  ** "tab
8720: 6c 65 2e 63 6f 6c 75 6d 6e 3d 65 78 70 72 22 20  le.column=expr" 
8730: 66 6f 72 20 73 6f 6d 65 20 73 69 6e 67 6c 65 20  for some single 
8740: 74 61 62 6c 65 2e 20 20 54 68 65 20 6f 6e 65 20  table.  The one 
8750: 62 69 74 20 74 68 61 74 20 69 73 20 73 65 74 0a  bit that is set.
8760: 20 20 2a 2a 20 77 69 6c 6c 20 63 6f 72 72 65 73    ** will corres
8770: 70 6f 6e 64 20 74 6f 20 74 68 65 20 63 6f 6d 6d  pond to the comm
8780: 6f 6e 20 74 61 62 6c 65 2e 20 20 57 65 20 73 74  on table.  We st
8790: 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 65 63  ill need to chec
87a0: 6b 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 73  k to make.  ** s
87b0: 75 72 65 20 74 68 65 20 73 61 6d 65 20 63 6f 6c  ure the same col
87c0: 75 6d 6e 20 69 73 20 75 73 65 64 20 6f 6e 20 61  umn is used on a
87d0: 6c 6c 20 74 65 72 6d 73 2e 20 20 54 68 65 20 32  ll terms.  The 2
87e0: 2d 62 69 74 20 63 61 73 65 20 69 73 20 77 68 65  -bit case is whe
87f0: 6e 0a 20 20 2a 2a 20 74 68 65 20 61 6c 6c 20 74  n.  ** the all t
8800: 65 72 6d 73 20 61 72 65 20 6f 66 20 74 68 65 20  erms are of the 
8810: 66 6f 72 6d 20 22 74 61 62 6c 65 31 2e 63 6f 6c  form "table1.col
8820: 75 6d 6e 3d 74 61 62 6c 65 32 2e 63 6f 6c 75 6d  umn=table2.colum
8830: 6e 22 2e 20 20 49 74 0a 20 20 2a 2a 20 6d 69 67  n".  It.  ** mig
8840: 68 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74  ht be possible t
8850: 6f 20 66 6f 72 6d 20 61 6e 20 49 4e 20 6f 70 65  o form an IN ope
8860: 72 61 74 6f 72 20 77 69 74 68 20 65 69 74 68 65  rator with eithe
8870: 72 20 74 61 62 6c 65 31 2e 63 6f 6c 75 6d 6e 0a  r table1.column.
8880: 20 20 2a 2a 20 6f 72 20 74 61 62 6c 65 32 2e 63    ** or table2.c
8890: 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 4c 48 53  olumn as the LHS
88a0: 20 69 66 20 65 69 74 68 65 72 20 69 73 20 63 6f   if either is co
88b0: 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74 65  mmon to every te
88c0: 72 6d 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 4f  rm of.  ** the O
88d0: 52 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20  R clause..  **. 
88e0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 65   ** Note that te
88f0: 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rms of the form 
8900: 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 31 3d 74  "table.column1=t
8910: 61 62 6c 65 2e 63 6f 6c 75 6d 6e 32 22 20 28 74  able.column2" (t
8920: 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 61 62  he.  ** same tab
8930: 6c 65 20 6f 6e 20 62 6f 74 68 20 73 69 7a 65 73  le on both sizes
8940: 20 6f 66 20 74 68 65 20 3d 3d 29 20 63 61 6e 6e   of the ==) cann
8950: 6f 74 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 2e  ot be optimized.
8960: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 68 6e 67  .  */.  if( chng
8970: 54 6f 49 4e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ToIN ){.    int 
8980: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
8990: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
89a0: 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20   the conversion 
89b0: 74 6f 20 49 4e 20 69 73 20 76 61 6c 69 64 20 2a  to IN is valid *
89c0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  /.    int iColum
89d0: 6e 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20  n = -1;         
89e0: 2f 2a 20 43 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  /* Column index 
89f0: 6f 6e 20 6c 68 73 20 6f 66 20 49 4e 20 6f 70 65  on lhs of IN ope
8a00: 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 69 6e 74  rator */.    int
8a10: 20 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 20 20   iCursor = -1;  
8a20: 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20         /* Table 
8a30: 63 75 72 73 6f 72 20 63 6f 6d 6d 6f 6e 20 74 6f  cursor common to
8a40: 20 61 6c 6c 20 74 65 72 6d 73 20 2a 2f 0a 20 20   all terms */.  
8a50: 20 20 69 6e 74 20 6a 20 3d 20 30 3b 20 20 20 20    int j = 0;    
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
8a70: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a  oop counter */..
8a80: 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f      /* Search fo
8a90: 72 20 61 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  r a table and co
8aa0: 6c 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72  lumn that appear
8ab0: 73 20 6f 6e 20 6f 6e 65 20 73 69 64 65 20 6f 72  s on one side or
8ac0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
8ad0: 72 20 6f 66 20 74 68 65 20 3d 3d 20 6f 70 65 72  r of the == oper
8ae0: 61 74 6f 72 20 69 6e 20 65 76 65 72 79 20 73 75  ator in every su
8af0: 62 74 65 72 6d 2e 20 20 54 68 61 74 20 74 61 62  bterm.  That tab
8b00: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 0a 20 20  le and column.  
8b10: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65 63    ** will be rec
8b20: 6f 72 64 65 64 20 69 6e 20 69 43 75 72 73 6f 72  orded in iCursor
8b30: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 20 20 54   and iColumn.  T
8b40: 68 65 72 65 20 6d 69 67 68 74 20 6e 6f 74 20 62  here might not b
8b50: 65 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73 75 63  e any.    ** suc
8b60: 68 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  h table and colu
8b70: 6d 6e 2e 20 20 53 65 74 20 6f 6b 54 6f 43 68 6e  mn.  Set okToChn
8b80: 67 54 6f 49 4e 20 69 66 20 61 6e 20 61 70 70 72  gToIN if an appr
8b90: 6f 70 72 69 61 74 65 20 74 61 62 6c 65 0a 20 20  opriate table.  
8ba0: 20 20 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 20    ** and column 
8bb0: 69 73 20 66 6f 75 6e 64 20 62 75 74 20 6c 65 61  is found but lea
8bc0: 76 65 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20  ve okToChngToIN 
8bd0: 66 61 6c 73 65 20 69 66 20 6e 6f 74 20 66 6f 75  false if not fou
8be0: 6e 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  nd..    */.    f
8bf0: 6f 72 28 6a 3d 30 3b 20 6a 3c 32 20 26 26 20 21  or(j=0; j<2 && !
8c00: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 6a 2b  okToChngToIN; j+
8c10: 2b 29 7b 0a 20 20 20 20 20 20 70 4f 72 54 65 72  +){.      pOrTer
8c20: 6d 20 3d 20 70 4f 72 57 63 2d 3e 61 3b 0a 20 20  m = pOrWc->a;.  
8c30: 20 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d      for(i=pOrWc-
8c40: 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20  >nTerm-1; i>=0; 
8c50: 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29 7b  i--, pOrTerm++){
8c60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8c70: 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61   pOrTerm->eOpera
8c80: 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a 20 20  tor==WO_EQ );.  
8c90: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
8ca0: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
8cb0: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69  OR_OK;.        i
8cc0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
8cd0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
8ce0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
8cf0: 54 68 69 73 20 69 73 20 74 68 65 20 32 2d 62 69  This is the 2-bi
8d00: 74 20 63 61 73 65 20 61 6e 64 20 77 65 20 61 72  t case and we ar
8d10: 65 20 6f 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  e on the second 
8d20: 69 74 65 72 61 74 69 6f 6e 20 61 6e 64 0a 20 20  iteration and.  
8d30: 20 20 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65          ** curre
8d40: 6e 74 20 74 65 72 6d 20 69 73 20 66 72 6f 6d 20  nt term is from 
8d50: 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
8d60: 69 6f 6e 2e 20 20 53 6f 20 73 6b 69 70 20 74 68  ion.  So skip th
8d70: 69 73 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  is term. */.    
8d80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3d        assert( j=
8d90: 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =1 );.          
8da0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8db0: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
8dc0: 28 63 68 6e 67 54 6f 49 4e 20 26 20 67 65 74 4d  (chngToIN & getM
8dd0: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f  ask(pMaskSet, pO
8de0: 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
8df0: 72 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r))==0 ){.      
8e00: 20 20 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d      /* This term
8e10: 20 6d 75 73 74 20 62 65 20 6f 66 20 74 68 65 20   must be of the 
8e20: 66 6f 72 6d 20 74 31 2e 61 3d 3d 74 32 2e 62 20  form t1.a==t2.b 
8e30: 77 68 65 72 65 20 74 32 20 69 73 20 69 6e 20 74  where t2 is in t
8e40: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
8e50: 63 68 6e 67 54 6f 49 4e 20 73 65 74 20 62 75 74  chngToIN set but
8e60: 20 74 31 20 69 73 20 6e 6f 74 2e 20 20 54 68 69   t1 is not.  Thi
8e70: 73 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 65  s term will be e
8e80: 69 74 68 65 72 20 70 72 65 63 65 65 64 65 64 0a  ither preceeded.
8e90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
8ea0: 66 6f 6c 6c 77 65 64 20 62 79 20 61 6e 20 69 6e  follwed by an in
8eb0: 76 65 72 74 65 64 20 63 6f 70 79 20 28 74 32 2e  verted copy (t2.
8ec0: 62 3d 3d 74 31 2e 61 29 2e 20 20 53 6b 69 70 20  b==t1.a).  Skip 
8ed0: 74 68 69 73 20 74 65 72 6d 20 0a 20 20 20 20 20  this term .     
8ee0: 20 20 20 20 20 2a 2a 20 61 6e 64 20 75 73 65 20       ** and use 
8ef0: 69 74 73 20 69 6e 76 65 72 73 69 6f 6e 2e 20 2a  its inversion. *
8f00: 2f 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  /.          test
8f10: 63 61 73 65 28 20 70 4f 72 54 65 72 6d 2d 3e 77  case( pOrTerm->w
8f20: 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
8f30: 50 49 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  PIED );.        
8f40: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
8f50: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8f60: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
8f70: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
8f80: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
8f90: 73 20 26 20 28 54 45 52 4d 5f 43 4f 50 49 45 44  s & (TERM_COPIED
8fa0: 7c 54 45 52 4d 5f 56 49 52 54 55 41 4c 29 20 29  |TERM_VIRTUAL) )
8fb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
8fc0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
8fd0: 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20          iColumn 
8fe0: 3d 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65 66  = pOrTerm->u.lef
8ff0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20  tColumn;.       
9000: 20 69 43 75 72 73 6f 72 20 3d 20 70 4f 72 54 65   iCursor = pOrTe
9010: 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3b 0a  rm->leftCursor;.
9020: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9040: 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i<0 ){.        
9050: 2f 2a 20 4e 6f 20 63 61 6e 64 69 64 61 74 65 20  /* No candidate 
9060: 74 61 62 6c 65 2b 63 6f 6c 75 6d 6e 20 77 61 73  table+column was
9070: 20 66 6f 75 6e 64 2e 20 20 54 68 69 73 20 63 61   found.  This ca
9080: 6e 20 6f 6e 6c 79 20 6f 63 63 75 72 0a 20 20 20  n only occur.   
9090: 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73       ** on the s
90a0: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
90b0: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
90c0: 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20 20  t( j==1 );.     
90d0: 20 20 20 61 73 73 65 72 74 28 20 28 63 68 6e 67     assert( (chng
90e0: 54 6f 49 4e 26 28 63 68 6e 67 54 6f 49 4e 2d 31  ToIN&(chngToIN-1
90f0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ))==0 );.       
9100: 20 61 73 73 65 72 74 28 20 63 68 6e 67 54 6f 49   assert( chngToI
9110: 4e 3d 3d 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b  N==getMask(pMask
9120: 53 65 74 2c 20 69 43 75 72 73 6f 72 29 20 29 3b  Set, iCursor) );
9130: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9140: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 74 65        }.      te
9150: 73 74 63 61 73 65 28 20 6a 3d 3d 31 20 29 3b 0a  stcase( j==1 );.
9160: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76  .      /* We hav
9170: 65 20 66 6f 75 6e 64 20 61 20 63 61 6e 64 69 64  e found a candid
9180: 61 74 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ate table and co
9190: 6c 75 6d 6e 2e 20 20 43 68 65 63 6b 20 74 6f 20  lumn.  Check to 
91a0: 73 65 65 20 69 66 20 74 68 61 74 0a 20 20 20 20  see if that.    
91b0: 20 20 2a 2a 20 74 61 62 6c 65 20 61 6e 64 20 63    ** table and c
91c0: 6f 6c 75 6d 6e 20 69 73 20 63 6f 6d 6d 6f 6e 20  olumn is common 
91d0: 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e  to every term in
91e0: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 2a   the OR clause *
91f0: 2f 0a 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67  /.      okToChng
9200: 54 6f 49 4e 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToIN = 1;.      
9210: 66 6f 72 28 3b 20 69 3e 3d 30 20 26 26 20 6f 6b  for(; i>=0 && ok
9220: 54 6f 43 68 6e 67 54 6f 49 4e 3b 20 69 2d 2d 2c  ToChngToIN; i--,
9230: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
9240: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9250: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
9260: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
9270: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
9280: 65 66 74 43 75 72 73 6f 72 21 3d 69 43 75 72 73  eftCursor!=iCurs
9290: 6f 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  or ){.          
92a0: 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  pOrTerm->wtFlags
92b0: 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b   &= ~TERM_OR_OK;
92c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
92d0: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c 65  f( pOrTerm->u.le
92e0: 66 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d  ftColumn!=iColum
92f0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  n ){.          o
9300: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30 3b  kToChngToIN = 0;
9310: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
9320: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 66            int af
9330: 66 4c 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b  fLeft, affRight;
9340: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  .          /* If
9350: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
9360: 73 69 64 65 20 69 73 20 61 6c 73 6f 20 61 20 63  side is also a c
9370: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20  olumn, then the 
9380: 61 66 66 69 6e 69 74 69 65 73 0a 20 20 20 20 20  affinities.     
9390: 20 20 20 20 20 2a 2a 20 6f 66 20 62 6f 74 68 20       ** of both 
93a0: 72 69 67 68 74 20 61 6e 64 20 6c 65 66 74 20 73  right and left s
93b0: 69 64 65 73 20 6d 75 73 74 20 62 65 20 73 75 63  ides must be suc
93c0: 68 20 74 68 61 74 20 6e 6f 20 74 79 70 65 0a 20  h that no type. 
93d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 76           ** conv
93e0: 65 72 73 69 6f 6e 73 20 61 72 65 20 72 65 71 75  ersions are requ
93f0: 69 72 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68  ired on the righ
9400: 74 2e 20 20 28 54 69 63 6b 65 74 20 23 32 32 34  t.  (Ticket #224
9410: 39 29 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  9).          */.
9420: 20 20 20 20 20 20 20 20 20 20 61 66 66 52 69 67            affRig
9430: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
9440: 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d  Affinity(pOrTerm
9450: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
9460: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 4c  ;.          affL
9470: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
9480: 72 41 66 66 69 6e 69 74 79 28 70 4f 72 54 65 72  rAffinity(pOrTer
9490: 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  m->pExpr->pLeft)
94a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
94b0: 61 66 66 52 69 67 68 74 21 3d 30 20 26 26 20 61  affRight!=0 && a
94c0: 66 66 52 69 67 68 74 21 3d 61 66 66 4c 65 66 74  ffRight!=affLeft
94d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
94e0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 30  okToChngToIN = 0
94f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9500: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
9510: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
9520: 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  |= TERM_OR_OK;. 
9530: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
9540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9550: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20 74 68   }..    /* At th
9560: 69 73 20 70 6f 69 6e 74 2c 20 6f 6b 54 6f 43 68  is point, okToCh
9570: 6e 67 54 6f 49 4e 20 69 73 20 74 72 75 65 20 69  ngToIN is true i
9580: 66 20 6f 72 69 67 69 6e 61 6c 20 70 54 65 72 6d  f original pTerm
9590: 20 73 61 74 69 73 66 69 65 73 0a 20 20 20 20 2a   satisfies.    *
95a0: 2a 20 63 61 73 65 20 31 2e 20 20 49 6e 20 74 68  * case 1.  In th
95b0: 61 74 20 63 61 73 65 2c 20 63 6f 6e 73 74 72 75  at case, constru
95c0: 63 74 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  ct a new virtual
95d0: 20 74 65 72 6d 20 74 68 61 74 20 69 73 20 0a 20   term that is . 
95e0: 20 20 20 2a 2a 20 70 54 65 72 6d 20 63 6f 6e 76     ** pTerm conv
95f0: 65 72 74 65 64 20 69 6e 74 6f 20 61 6e 20 49 4e  erted into an IN
9600: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20 2a   operator..    *
9610: 2f 0a 20 20 20 20 69 66 28 20 6f 6b 54 6f 43 68  /.    if( okToCh
9620: 6e 67 54 6f 49 4e 20 29 7b 0a 20 20 20 20 20 20  ngToIN ){.      
9630: 45 78 70 72 20 2a 70 44 75 70 3b 20 20 20 20 20  Expr *pDup;     
9640: 20 20 20 20 20 20 20 2f 2a 20 41 20 74 72 61 6e         /* A tran
9650: 73 69 65 6e 74 20 64 75 70 6c 69 63 61 74 65 20  sient duplicate 
9660: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
9670: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
9680: 69 73 74 20 3d 20 30 3b 20 20 20 2f 2a 20 54 68  ist = 0;   /* Th
9690: 65 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20  e RHS of the IN 
96a0: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  operator */.    
96b0: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
96c0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  0;       /* The 
96d0: 4c 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70  LHS of the IN op
96e0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
96f0: 45 78 70 72 20 2a 70 4e 65 77 3b 20 20 20 20 20  Expr *pNew;     
9700: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
9710: 6d 70 6c 65 74 65 20 49 4e 20 6f 70 65 72 61 74  mplete IN operat
9720: 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 66 6f 72  or */..      for
9730: 28 69 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d  (i=pOrWc->nTerm-
9740: 31 2c 20 70 4f 72 54 65 72 6d 3d 70 4f 72 57 63  1, pOrTerm=pOrWc
9750: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
9760: 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  pOrTerm++){.    
9770: 20 20 20 20 69 66 28 20 28 70 4f 72 54 65 72 6d      if( (pOrTerm
9780: 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d  ->wtFlags & TERM
9790: 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29 20 63 6f 6e  _OR_OK)==0 ) con
97a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
97b0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
97c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
97d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
97e0: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  rt( pOrTerm->lef
97f0: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72  tCursor==iCursor
9800: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
9810: 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e 75 2e 6c  rt( pOrTerm->u.l
9820: 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75  eftColumn==iColu
9830: 6d 6e 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44  mn );.        pD
9840: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
9850: 44 75 70 28 64 62 2c 20 70 4f 72 54 65 72 6d 2d  Dup(db, pOrTerm-
9860: 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  >pExpr->pRight, 
9870: 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73  0);.        pLis
9880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
9890: 69 73 74 41 70 70 65 6e 64 28 70 57 43 2d 3e 70  istAppend(pWC->p
98a0: 50 61 72 73 65 2c 20 70 4c 69 73 74 2c 20 70 44  Parse, pList, pD
98b0: 75 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  up);.        pLe
98c0: 66 74 20 3d 20 70 4f 72 54 65 72 6d 2d 3e 70 45  ft = pOrTerm->pE
98d0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
98e0: 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
98f0: 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20  ( pLeft!=0 );.  
9900: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
9910: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4c  e3ExprDup(db, pL
9920: 65 66 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  eft, 0);.      p
9930: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 50 45 78  New = sqlite3PEx
9940: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 49 4e  pr(pParse, TK_IN
9950: 2c 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  , pDup, 0, 0);. 
9960: 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b       if( pNew ){
9970: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78  .        int idx
9980: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61  New;.        tra
9990: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
99a0: 73 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a  s(pNew, pExpr);.
99b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
99c0: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
99d0: 28 70 4e 65 77 2c 20 45 50 5f 78 49 73 53 65 6c  (pNew, EP_xIsSel
99e0: 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
99f0: 70 4e 65 77 2d 3e 78 2e 70 4c 69 73 74 20 3d 20  pNew->x.pList = 
9a00: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  pList;.        i
9a10: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
9a20: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
9a30: 4e 65 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  New, TERM_VIRTUA
9a40: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
9a50: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
9a60: 65 28 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a  e( idxNew==0 );.
9a70: 20 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c          exprAnal
9a80: 79 7a 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69  yze(pSrc, pWC, i
9a90: 64 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  dxNew);.        
9aa0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
9ab0: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20  idxTerm];.      
9ac0: 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d    pWC->a[idxNew]
9ad0: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
9ae0: 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  rm;.        pTer
9af0: 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20  m->nChild = 1;. 
9b00: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9b10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
9b20: 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 4c  istDelete(db, pL
9b30: 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ist);.      }.  
9b40: 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72      pTerm->eOper
9b50: 61 74 6f 72 20 3d 20 30 3b 20 20 2f 2a 20 63 61  ator = 0;  /* ca
9b60: 73 65 20 31 20 74 72 75 6d 70 73 20 63 61 73 65  se 1 trumps case
9b70: 20 32 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a   2 */.    }.  }.
9b80: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
9b90: 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
9ba0: 4d 49 5a 41 54 49 4f 4e 20 26 26 20 21 53 51 4c  MIZATION && !SQL
9bb0: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
9bc0: 59 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Y */.../*.** The
9bd0: 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72   input to this r
9be0: 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65  outine is an Whe
9bf0: 72 65 54 65 72 6d 20 73 74 72 75 63 74 75 72 65  reTerm structure
9c00: 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a   with only the.*
9c10: 2a 20 22 70 45 78 70 72 22 20 66 69 65 6c 64 20  * "pExpr" field 
9c20: 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20  filled in.  The 
9c30: 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
9c40: 69 6e 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a  ine is to analyz
9c50: 65 20 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72  e the.** subexpr
9c60: 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c  ession and popul
9c70: 61 74 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65  ate all the othe
9c80: 72 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  r fields of the 
9c90: 57 68 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72  WhereTerm.** str
9ca0: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ucture..**.** If
9cb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
9cc0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  is of the form "
9cd0: 3c 65 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69  <expr> <op> X" i
9ce0: 74 20 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a  t gets commuted.
9cf0: 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61  ** to the standa
9d00: 72 64 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f  rd form of "X <o
9d10: 70 3e 20 3c 65 78 70 72 3e 22 2e 0a 2a 2a 0a 2a  p> <expr>"..**.*
9d20: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
9d30: 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f  ion is of the fo
9d40: 72 6d 20 22 58 20 3c 6f 70 3e 20 59 22 20 77 68  rm "X <op> Y" wh
9d50: 65 72 65 20 62 6f 74 68 20 58 20 61 6e 64 20 59  ere both X and Y
9d60: 20 61 72 65 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 2c   are.** columns,
9d70: 20 74 68 65 6e 20 74 68 65 20 6f 72 69 67 69 6e   then the origin
9d80: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  al expression is
9d90: 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 61   unchanged and a
9da0: 20 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20   new virtual.** 
9db0: 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  term of the form
9dc0: 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61   "Y <op> X" is a
9dd0: 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  dded to the WHER
9de0: 45 20 63 6c 61 75 73 65 20 61 6e 64 0a 2a 2a 20  E clause and.** 
9df0: 61 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74  analyzed separat
9e00: 65 6c 79 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ely.  The origin
9e10: 61 6c 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65  al term is marke
9e20: 64 20 77 69 74 68 20 54 45 52 4d 5f 43 4f 50 49  d with TERM_COPI
9e30: 45 44 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 65  ED.** and the ne
9e40: 77 20 74 65 72 6d 20 69 73 20 6d 61 72 6b 65 64  w term is marked
9e50: 20 77 69 74 68 20 54 45 52 4d 5f 44 59 4e 41 4d   with TERM_DYNAM
9e60: 49 43 20 28 62 65 63 61 75 73 65 20 69 74 27 73  IC (because it's
9e70: 20 70 45 78 70 72 0a 2a 2a 20 6e 65 65 64 73 20   pExpr.** needs 
9e80: 74 6f 20 62 65 20 66 72 65 65 64 20 77 69 74 68  to be freed with
9e90: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
9ea0: 29 20 61 6e 64 20 54 45 52 4d 5f 56 49 52 54 55  ) and TERM_VIRTU
9eb0: 41 4c 20 28 62 65 63 61 75 73 65 20 69 74 0a 2a  AL (because it.*
9ec0: 2a 20 69 73 20 61 20 63 6f 6d 6d 75 74 65 64 20  * is a commuted 
9ed0: 63 6f 70 79 20 6f 66 20 61 20 70 72 69 6f 72 20  copy of a prior 
9ee0: 74 65 72 6d 2e 29 20 20 54 68 65 20 6f 72 69 67  term.)  The orig
9ef0: 69 6e 61 6c 20 74 65 72 6d 20 68 61 73 20 6e 43  inal term has nC
9f00: 68 69 6c 64 3d 31 0a 2a 2a 20 61 6e 64 20 74 68  hild=1.** and th
9f10: 65 20 63 6f 70 79 20 68 61 73 20 69 64 78 50 61  e copy has idxPa
9f20: 72 65 6e 74 20 73 65 74 20 74 6f 20 74 68 65 20  rent set to the 
9f30: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6f 72 69  index of the ori
9f40: 67 69 6e 61 6c 20 74 65 72 6d 2e 0a 2a 2f 0a 73  ginal term..*/.s
9f50: 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 41  tatic void exprA
9f60: 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c 69 73  nalyze(.  SrcLis
9f70: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
9f80: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
9f90: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
9fa0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
9fb0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
9fc0: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
9fd0: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
9fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9ff0: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
a000: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
a010: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
a020: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
a030: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72        /* The ter
a040: 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  m to be analyzed
a050: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
a060: 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
a070: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66         /* Set of
a080: 20 74 61 62 6c 65 20 69 6e 64 65 78 20 6d 61 73   table index mas
a090: 6b 73 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  ks */.  Expr *pE
a0a0: 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  xpr;            
a0b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
a0c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
a0d0: 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 42   analyzed */.  B
a0e0: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65 66  itmask prereqLef
a0f0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
a100: 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65 73  /* Prerequesites
a110: 20 6f 66 20 74 68 65 20 70 45 78 70 72 2d 3e 70   of the pExpr->p
a120: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
a130: 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20  k prereqAll;    
a140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
a150: 65 72 65 71 75 65 73 69 74 65 73 20 6f 66 20 70  erequesites of p
a160: 45 78 70 72 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Expr */.  Bitmas
a170: 6b 20 65 78 74 72 61 52 69 67 68 74 20 3d 20 30  k extraRight = 0
a180: 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65  ;.  int isComple
a190: 74 65 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65  te;.  int noCase
a1a0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20  ;.  int op;     
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1c0: 20 20 20 20 20 2f 2a 20 54 6f 70 2d 6c 65 76 65       /* Top-leve
a1d0: 6c 20 6f 70 65 72 61 74 6f 72 2e 20 20 70 45 78  l operator.  pEx
a1e0: 70 72 2d 3e 6f 70 20 2a 2f 0a 20 20 50 61 72 73  pr->op */.  Pars
a1f0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
a200: 3e 70 50 61 72 73 65 3b 20 20 20 20 20 2f 2a 20  >pParse;     /* 
a210: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a220: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
a230: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
a240: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
a250: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
a260: 20 20 45 78 70 72 20 2a 70 53 74 72 31 3b 0a 0a    Expr *pStr1;..
a270: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
a280: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
a290: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 54 65 72  turn;.  }.  pTer
a2a0: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54  m = &pWC->a[idxT
a2b0: 65 72 6d 5d 3b 0a 20 20 70 4d 61 73 6b 53 65 74  erm];.  pMaskSet
a2c0: 20 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74   = pWC->pMaskSet
a2d0: 3b 0a 20 20 70 45 78 70 72 20 3d 20 70 54 65 72  ;.  pExpr = pTer
a2e0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 70 72 65 72  m->pExpr;.  prer
a2f0: 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61 62  eqLeft = exprTab
a300: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
a310: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a320: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
a330: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
a340: 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  IN ){.    assert
a350: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  ( pExpr->pRight=
a360: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 45 78  =0 );.    if( Ex
a370: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
a380: 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
a390: 74 29 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  t) ){.      pTer
a3a0: 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  m->prereqRight =
a3b0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
a3c0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
a3d0: 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74  pExpr->x.pSelect
a3e0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
a3f0: 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65      pTerm->prere
a400: 71 52 69 67 68 74 20 3d 20 65 78 70 72 4c 69 73  qRight = exprLis
a410: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
a420: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e 70  kSet, pExpr->x.p
a430: 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  List);.    }.  }
a440: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  else if( op==TK_
a450: 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54  ISNULL ){.    pT
a460: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
a470: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
a480: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
a490: 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c  Right = exprTabl
a4a0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
a4b0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
a4c0: 0a 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c  .  }.  prereqAll
a4d0: 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67   = exprTableUsag
a4e0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
a4f0: 72 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61  r);.  if( ExprHa
a500: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
a510: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
a520: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d  .    Bitmask x =
a530: 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65   getMask(pMaskSe
a540: 74 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74  t, pExpr->iRight
a550: 4a 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20  JoinTable);.    
a560: 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a  prereqAll |= x;.
a570: 20 20 20 20 65 78 74 72 61 52 69 67 68 74 20 3d      extraRight =
a580: 20 78 2d 31 3b 20 20 2f 2a 20 4f 4e 20 63 6c 61   x-1;  /* ON cla
a590: 75 73 65 20 74 65 72 6d 73 20 6d 61 79 20 6e 6f  use terms may no
a5a0: 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20 61  t be used with a
a5b0: 6e 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20  n index.        
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
a5d0: 2a 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20  * on left table 
a5e0: 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20  of a LEFT JOIN. 
a5f0: 20 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f   Ticket #3015 */
a600: 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72  .  }.  pTerm->pr
a610: 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71  ereqAll = prereq
a620: 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65  All;.  pTerm->le
a630: 66 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  ftCursor = -1;. 
a640: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20   pTerm->iParent 
a650: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65  = -1;.  pTerm->e
a660: 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20  Operator = 0;.  
a670: 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70  if( allowedOp(op
a680: 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65  ) && (pTerm->pre
a690: 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65  reqRight & prere
a6a0: 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20  qLeft)==0 ){.   
a6b0: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
a6c0: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
a6d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
a6e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
a6f0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
a700: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
a710: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
a720: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
a730: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  iTable;.      pT
a740: 65 72 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d  erm->u.leftColum
a750: 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  n = pLeft->iColu
a760: 6d 6e 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  mn;.      pTerm-
a770: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65  >eOperator = ope
a780: 72 61 74 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20  ratorMask(op);. 
a790: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69     }.    if( pRi
a7a0: 67 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f  ght && pRight->o
a7b0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
a7c0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
a7d0: 2a 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70  *pNew;.      Exp
a7e0: 72 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  r *pDup;.      i
a7f0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
a800: 72 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rsor>=0 ){.     
a810: 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20     int idxNew;. 
a820: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
a830: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a840: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20   pExpr, 0);.    
a850: 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c      if( db->mall
a860: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
a870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a880: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70  rDelete(db, pDup
a890: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
a8a0: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
a8b0: 20 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20         idxNew = 
a8c0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
a8d0: 74 28 70 57 43 2c 20 70 44 75 70 2c 20 54 45 52  t(pWC, pDup, TER
a8e0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
a8f0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20  YNAMIC);.       
a900: 20 69 66 28 20 69 64 78 4e 65 77 3d 3d 30 20 29   if( idxNew==0 )
a910: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
a920: 20 70 4e 65 77 20 3d 20 26 70 57 43 2d 3e 61 5b   pNew = &pWC->a[
a930: 69 64 78 4e 65 77 5d 3b 0a 20 20 20 20 20 20 20  idxNew];.       
a940: 20 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 20 3d   pNew->iParent =
a950: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
a960: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
a970: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
a980: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
a990: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  d = 1;.        p
a9a0: 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d  Term->wtFlags |=
a9b0: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
a9c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a9d0: 20 20 20 70 44 75 70 20 3d 20 70 45 78 70 72 3b     pDup = pExpr;
a9e0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20  .        pNew = 
a9f0: 70 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a 20  pTerm;.      }. 
aa00: 20 20 20 20 20 65 78 70 72 43 6f 6d 6d 75 74 65       exprCommute
aa10: 28 70 50 61 72 73 65 2c 20 70 44 75 70 29 3b 0a  (pParse, pDup);.
aa20: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 44        pLeft = pD
aa30: 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  up->pLeft;.     
aa40: 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73 6f   pNew->leftCurso
aa50: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
aa60: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 75  e;.      pNew->u
aa70: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c  .leftColumn = pL
aa80: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  eft->iColumn;.  
aa90: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
aaa0: 52 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65  Right = prereqLe
aab0: 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  ft;.      pNew->
aac0: 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72  prereqAll = prer
aad0: 65 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65  eqAll;.      pNe
aae0: 77 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f  w->eOperator = o
aaf0: 70 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70  peratorMask(pDup
ab00: 2d 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ->op);.    }.  }
ab10: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
ab20: 5f 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50  _OMIT_BETWEEN_OP
ab30: 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20  TIMIZATION.  /* 
ab40: 49 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65  If a term is the
ab50: 20 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f   BETWEEN operato
ab60: 72 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65  r, create two ne
ab70: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a  w virtual terms.
ab80: 20 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65    ** that define
ab90: 20 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20   the range that 
aba0: 74 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c  the BETWEEN impl
abb0: 65 6d 65 6e 74 73 2e 20 20 46 6f 72 20 65 78 61  ements.  For exa
abc0: 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  mple:.  **.  ** 
abd0: 20 20 20 20 20 61 20 42 45 54 57 45 45 4e 20 62       a BETWEEN b
abe0: 20 41 4e 44 20 63 0a 20 20 2a 2a 0a 20 20 2a 2a   AND c.  **.  **
abf0: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
ac00: 74 6f 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  to:.  **.  **   
ac10: 20 20 20 28 61 20 42 45 54 57 45 45 4e 20 62 20     (a BETWEEN b 
ac20: 41 4e 44 20 63 29 20 41 4e 44 20 28 61 3e 3d 62  AND c) AND (a>=b
ac30: 29 20 41 4e 44 20 28 61 3c 3d 63 29 0a 20 20 2a  ) AND (a<=c).  *
ac40: 2a 0a 20 20 2a 2a 20 54 68 65 20 74 77 6f 20 6e  *.  ** The two n
ac50: 65 77 20 74 65 72 6d 73 20 61 72 65 20 61 64 64  ew terms are add
ac60: 65 64 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ed onto the end 
ac70: 6f 66 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  of the WhereClau
ac80: 73 65 20 6f 62 6a 65 63 74 2e 0a 20 20 2a 2a 20  se object..  ** 
ac90: 54 68 65 20 6e 65 77 20 74 65 72 6d 73 20 61 72  The new terms ar
aca0: 65 20 22 64 79 6e 61 6d 69 63 22 20 61 6e 64 20  e "dynamic" and 
acb0: 61 72 65 20 63 68 69 6c 64 72 65 6e 20 6f 66 20  are children of 
acc0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 42 45 54  the original BET
acd0: 57 45 45 4e 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  WEEN.  ** term. 
ace0: 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   That means that
acf0: 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
ad00: 74 65 72 6d 20 69 73 20 63 6f 64 65 64 2c 20 74  term is coded, t
ad10: 68 65 20 63 68 69 6c 64 72 65 6e 20 61 72 65 0a  he children are.
ad20: 20 20 2a 2a 20 73 6b 69 70 70 65 64 2e 20 20 4f    ** skipped.  O
ad30: 72 2c 20 69 66 20 74 68 65 20 63 68 69 6c 64 72  r, if the childr
ad40: 65 6e 20 61 72 65 20 73 61 74 69 73 66 69 65 64  en are satisfied
ad50: 20 62 79 20 61 6e 20 69 6e 64 65 78 2c 20 74 68   by an index, th
ad60: 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  e original.  ** 
ad70: 42 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20  BETWEEN term is 
ad80: 73 6b 69 70 70 65 64 2e 0a 20 20 2a 2f 0a 20 20  skipped..  */.  
ad90: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
ada0: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 26  op==TK_BETWEEN &
adb0: 26 20 70 57 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e  & pWC->op==TK_AN
adc0: 44 20 29 7b 0a 20 20 20 20 45 78 70 72 4c 69 73  D ){.    ExprLis
add0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
ade0: 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20 20 69  ->x.pList;.    i
adf0: 6e 74 20 69 3b 0a 20 20 20 20 73 74 61 74 69 63  nt i;.    static
ae00: 20 63 6f 6e 73 74 20 75 38 20 6f 70 73 5b 5d 20   const u8 ops[] 
ae10: 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f 4c 45 7d  = {TK_GE, TK_LE}
ae20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
ae30: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  ist!=0 );.    as
ae40: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
ae50: 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20 66 6f 72  pr==2 );.    for
ae60: 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b  (i=0; i<2; i++){
ae70: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65  .      Expr *pNe
ae80: 77 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  wExpr;.      int
ae90: 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20 20 70   idxNew;.      p
aea0: 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65  NewExpr = sqlite
aeb0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 6f  3PExpr(pParse, o
aec0: 70 73 5b 69 5d 2c 20 0a 20 20 20 20 20 20 20 20  ps[i], .        
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
aef0: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  Dup(db, pExpr->p
af00: 4c 65 66 74 2c 20 30 29 2c 0a 20 20 20 20 20 20  Left, 0),.      
af10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
af30: 70 72 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d  prDup(db, pList-
af40: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 30 29 2c  >a[i].pExpr, 0),
af50: 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65   0);.      idxNe
af60: 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49  w = whereClauseI
af70: 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45  nsert(pWC, pNewE
af80: 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41  xpr, TERM_VIRTUA
af90: 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b  L|TERM_DYNAMIC);
afa0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
afb0: 20 69 64 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20   idxNew==0 );.  
afc0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
afd0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
afe0: 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  w);.      pTerm 
aff0: 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72  = &pWC->a[idxTer
b000: 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61  m];.      pWC->a
b010: 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74  [idxNew].iParent
b020: 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20   = idxTerm;.    
b030: 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68  }.    pTerm->nCh
b040: 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e  ild = 2;.  }.#en
b050: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
b060: 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d  IT_BETWEEN_OPTIM
b070: 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20  IZATION */..#if 
b080: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b090: 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
b0a0: 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65  TION) && !define
b0b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
b0c0: 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 6e 61  BQUERY).  /* Ana
b0d0: 6c 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74  lyze a term that
b0e0: 20 69 73 20 63 6f 6d 70 6f 73 65 64 20 6f 66 20   is composed of 
b0f0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 73 75 62 74  two or more subt
b100: 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  erms connected b
b110: 79 0a 20 20 2a 2a 20 61 6e 20 4f 52 20 6f 70 65  y.  ** an OR ope
b120: 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 65 6c  rator..  */.  el
b130: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
b140: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 61  ==TK_OR ){.    a
b150: 73 73 65 72 74 28 20 70 57 43 2d 3e 6f 70 3d 3d  ssert( pWC->op==
b160: 54 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 65 78  TK_AND );.    ex
b170: 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d 28  prAnalyzeOrTerm(
b180: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 54 65  pSrc, pWC, idxTe
b190: 72 6d 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm);.    pTerm =
b1a0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b1b0: 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  ];.  }.#endif /*
b1c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
b1d0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
b1e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b1f0: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
b200: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
b210: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
b220: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
b230: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
b240: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
b250: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
b260: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
b270: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
b280: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
b290: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
b2a0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
b2b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
b2c0: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
b2d0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
b2e0: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
b2f0: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
b300: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
b310: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
b320: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
b330: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
b340: 63 6f 6e 64 69 74 69 6f 6e 20 22 61 62 64 22 2e  condition "abd".
b350: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 43 2d  .  */.  if( pWC-
b360: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 0a 20 20 20  >op==TK_AND .   
b370: 26 26 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  && isLikeOrGlob(
b380: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
b390: 70 53 74 72 31 2c 20 26 69 73 43 6f 6d 70 6c 65  pStr1, &isComple
b3a0: 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a 20 20 29  te, &noCase).  )
b3b0: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66  {.    Expr *pLef
b3c0: 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74  t;.    Expr *pSt
b3d0: 72 32 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e  r2;.    Expr *pN
b3e0: 65 77 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78  ewExpr1, *pNewEx
b3f0: 70 72 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  pr2;.    int idx
b400: 4e 65 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a  New1, idxNew2;..
b410: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70      pLeft = pExp
b420: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
b430: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
b440: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
b450: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
b460: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
b470: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
b480: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
b490: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
b4a0: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
b4b0: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
b4c0: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
b4d0: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
b4e0: 54 6f 6b 65 6e 5b 73 71 6c 69 74 65 33 53 74 72  Token[sqlite3Str
b4f0: 6c 65 6e 33 30 28 70 53 74 72 32 2d 3e 75 2e 7a  len30(pStr2->u.z
b500: 54 6f 6b 65 6e 29 2d 31 5d 3b 0a 20 20 20 20 20  Token)-1];.     
b510: 20 63 20 3d 20 2a 70 43 3b 0a 20 20 20 20 20 20   c = *pC;.      
b520: 69 66 28 20 6e 6f 43 61 73 65 20 29 7b 0a 20 20  if( noCase ){.  
b530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69        /* The poi
b540: 6e 74 20 69 73 20 74 6f 20 69 6e 63 72 65 6d 65  nt is to increme
b550: 6e 74 20 74 68 65 20 6c 61 73 74 20 63 68 61 72  nt the last char
b560: 61 63 74 65 72 20 62 65 66 6f 72 65 20 74 68 65  acter before the
b570: 20 66 69 72 73 74 0a 20 20 20 20 20 20 20 20 2a   first.        *
b580: 2a 20 77 69 6c 64 63 61 72 64 2e 20 20 42 75 74  * wildcard.  But
b590: 20 69 66 20 77 65 20 69 6e 63 72 65 6d 65 6e 74   if we increment
b5a0: 20 27 40 27 2c 20 74 68 61 74 20 77 69 6c 6c 20   '@', that will 
b5b0: 70 75 73 68 20 69 74 20 69 6e 74 6f 20 74 68 65  push it into the
b5c0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 70 68  .        ** alph
b5d0: 61 62 65 74 69 63 20 72 61 6e 67 65 20 77 68 65  abetic range whe
b5e0: 72 65 20 63 61 73 65 20 63 6f 6e 76 65 72 73 69  re case conversi
b5f0: 6f 6e 73 20 77 69 6c 6c 20 6d 65 73 73 20 75 70  ons will mess up
b600: 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
b610: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 54 6f   inequality.  To
b620: 20 61 76 6f 69 64 20 74 68 69 73 2c 20 6d 61 6b   avoid this, mak
b630: 65 20 73 75 72 65 20 74 6f 20 61 6c 73 6f 20 72  e sure to also r
b640: 75 6e 20 74 68 65 20 66 75 6c 6c 0a 20 20 20 20  un the full.    
b650: 20 20 20 20 2a 2a 20 4c 49 4b 45 20 6f 6e 20 61      ** LIKE on a
b660: 6c 6c 20 63 61 6e 64 69 64 61 74 65 20 65 78 70  ll candidate exp
b670: 72 65 73 73 69 6f 6e 73 20 62 79 20 63 6c 65 61  ressions by clea
b680: 72 69 6e 67 20 74 68 65 20 69 73 43 6f 6d 70 6c  ring the isCompl
b690: 65 74 65 20 66 6c 61 67 0a 20 20 20 20 20 20 20  ete flag.       
b6a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
b6b0: 63 3d 3d 27 41 27 2d 31 20 29 20 69 73 43 6f 6d  c=='A'-1 ) isCom
b6c0: 70 6c 65 74 65 20 3d 20 30 3b 0a 0a 20 20 20 20  plete = 0;..    
b6d0: 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 55      c = sqlite3U
b6e0: 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b 0a  pperToLower[c];.
b6f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
b700: 43 20 3d 20 63 20 2b 20 31 3b 0a 20 20 20 20 7d  C = c + 1;.    }
b710: 0a 20 20 20 20 70 4e 65 77 45 78 70 72 31 20 3d  .    pNewExpr1 =
b720: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
b730: 61 72 73 65 2c 20 54 4b 5f 47 45 2c 20 73 71 6c  arse, TK_GE, sql
b740: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 70  ite3ExprDup(db,p
b750: 4c 65 66 74 2c 30 29 2c 70 53 74 72 31 2c 30 29  Left,0),pStr1,0)
b760: 3b 0a 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20  ;.    idxNew1 = 
b770: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72  whereClauseInser
b780: 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31  t(pWC, pNewExpr1
b790: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
b7a0: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
b7b0: 20 20 74 65 73 74 63 61 73 65 28 20 69 64 78 4e    testcase( idxN
b7c0: 65 77 31 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78  ew1==0 );.    ex
b7d0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
b7e0: 70 57 43 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20  pWC, idxNew1);. 
b7f0: 20 20 20 70 4e 65 77 45 78 70 72 32 20 3d 20 73     pNewExpr2 = s
b800: 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72  qlite3PExpr(pPar
b810: 73 65 2c 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74  se, TK_LT, sqlit
b820: 65 33 45 78 70 72 44 75 70 28 64 62 2c 70 4c 65  e3ExprDup(db,pLe
b830: 66 74 2c 30 29 2c 70 53 74 72 32 2c 30 29 3b 0a  ft,0),pStr2,0);.
b840: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
b850: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
b860: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
b870: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
b880: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
b890: 74 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77  testcase( idxNew
b8a0: 32 3d 3d 30 20 29 3b 0a 20 20 20 20 65 78 70 72  2==0 );.    expr
b8b0: 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57  Analyze(pSrc, pW
b8c0: 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20  C, idxNew2);.   
b8d0: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
b8e0: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69  [idxTerm];.    i
b8f0: 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b  f( isComplete ){
b900: 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64  .      pWC->a[id
b910: 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d  xNew1].iParent =
b920: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
b930: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e  pWC->a[idxNew2].
b940: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b950: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  m;.      pTerm->
b960: 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20  nChild = 2;.    
b970: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
b980: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
b990: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f  _OPTIMIZATION */
b9a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b9b0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
b9c0: 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57 4f  LE.  /* Add a WO
b9d0: 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72 79  _MATCH auxiliary
b9e0: 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f 6e   term to the con
b9f0: 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20 74  straint set if t
ba00: 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  he.  ** current 
ba10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
ba20: 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c 75   the form:  colu
ba30: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a 20  mn MATCH expr.. 
ba40: 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61   ** This informa
ba50: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79 20  tion is used by 
ba60: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d  the xBestIndex m
ba70: 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20 76  ethods of.  ** v
ba80: 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20 20  irtual tables.  
ba90: 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72 79  The native query
baa0: 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73 20   optimizer does 
bab0: 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a 2a  not attempt.  **
bac0: 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20   to do anything 
bad0: 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63 74  with MATCH funct
bae0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
baf0: 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e   isMatchOfColumn
bb00: 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 69  (pExpr) ){.    i
bb10: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 45  nt idxNew;.    E
bb20: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c  xpr *pRight, *pL
bb30: 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54 65  eft;.    WhereTe
bb40: 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20 20  rm *pNewTerm;.  
bb50: 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71    Bitmask prereq
bb60: 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45 78  Column, prereqEx
bb70: 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74 20  pr;..    pRight 
bb80: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
bb90: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
bba0: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
bbb0: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
bbc0: 45 78 70 72 3b 0a 20 20 20 20 70 72 65 72 65 71  Expr;.    prereq
bbd0: 45 78 70 72 20 3d 20 65 78 70 72 54 61 62 6c 65  Expr = exprTable
bbe0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
bbf0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 70 72 65  pRight);.    pre
bc00: 72 65 71 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72  reqColumn = expr
bc10: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
bc20: 53 65 74 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  Set, pLeft);.   
bc30: 20 69 66 28 20 28 70 72 65 72 65 71 45 78 70 72   if( (prereqExpr
bc40: 20 26 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29   & prereqColumn)
bc50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 78 70  ==0 ){.      Exp
bc60: 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20  r *pNewExpr;.   
bc70: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
bc80: 6c 69 74 65 33 50 45 78 70 72 28 70 50 61 72 73  lite3PExpr(pPars
bc90: 65 2c 20 54 4b 5f 4d 41 54 43 48 2c 20 0a 20 20  e, TK_MATCH, .  
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
bcc0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62  qlite3ExprDup(db
bcd0: 2c 20 70 52 69 67 68 74 2c 20 30 29 2c 20 30 29  , pRight, 0), 0)
bce0: 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d  ;.      idxNew =
bcf0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65   whereClauseInse
bd00: 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72  rt(pWC, pNewExpr
bd10: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
bd20: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
bd30: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 64      testcase( id
bd40: 78 4e 65 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  xNew==0 );.     
bd50: 20 70 4e 65 77 54 65 72 6d 20 3d 20 26 70 57 43   pNewTerm = &pWC
bd60: 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20 20  ->a[idxNew];.   
bd70: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
bd80: 72 65 71 52 69 67 68 74 20 3d 20 70 72 65 72 65  reqRight = prere
bd90: 71 45 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65  qExpr;.      pNe
bda0: 77 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  wTerm->leftCurso
bdb0: 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c  r = pLeft->iTabl
bdc0: 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  e;.      pNewTer
bdd0: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20  m->u.leftColumn 
bde0: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
bdf0: 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d  ;.      pNewTerm
be00: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 57 4f  ->eOperator = WO
be10: 5f 4d 41 54 43 48 3b 0a 20 20 20 20 20 20 70 4e  _MATCH;.      pN
be20: 65 77 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20  ewTerm->iParent 
be30: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
be40: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
be50: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
be60: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
be70: 20 31 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d   1;.      pTerm-
be80: 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
be90: 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 70  _COPIED;.      p
bea0: 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  NewTerm->prereqA
beb0: 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70 72 65 72  ll = pTerm->prer
bec0: 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d  eqAll;.    }.  }
bed0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
bee0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
bef0: 42 4c 45 20 2a 2f 0a 0a 20 20 2f 2a 20 50 72 65  BLE */..  /* Pre
bf00: 76 65 6e 74 20 4f 4e 20 63 6c 61 75 73 65 20 74  vent ON clause t
bf10: 65 72 6d 73 20 6f 66 20 61 20 4c 45 46 54 20 4a  erms of a LEFT J
bf20: 4f 49 4e 20 66 72 6f 6d 20 62 65 69 6e 67 20 75  OIN from being u
bf30: 73 65 64 20 74 6f 20 64 72 69 76 65 0a 20 20 2a  sed to drive.  *
bf40: 2a 20 61 6e 20 69 6e 64 65 78 20 66 6f 72 20 74  * an index for t
bf50: 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
bf60: 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20  t of the join.. 
bf70: 20 2a 2f 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65   */.  pTerm->pre
bf80: 72 65 71 52 69 67 68 74 20 7c 3d 20 65 78 74 72  reqRight |= extr
bf90: 61 52 69 67 68 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  aRight;.}../*.**
bfa0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
bfb0: 61 6e 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  any of the expre
bfc0: 73 73 69 6f 6e 73 20 69 6e 20 70 4c 69 73 74 2d  ssions in pList-
bfd0: 3e 61 5b 69 46 69 72 73 74 2e 2e 2e 5d 20 63 6f  >a[iFirst...] co
bfe0: 6e 74 61 69 6e 0a 2a 2a 20 61 20 72 65 66 65 72  ntain.** a refer
bff0: 65 6e 63 65 20 74 6f 20 61 6e 79 20 74 61 62 6c  ence to any tabl
c000: 65 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  e other than the
c010: 20 69 42 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2f   iBase table..*/
c020: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 66 65  .static int refe
c030: 72 65 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65  rencesOtherTable
c040: 73 28 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  s(.  ExprList *p
c050: 4c 69 73 74 2c 20 20 20 20 20 20 20 20 20 20 2f  List,          /
c060: 2a 20 53 65 61 72 63 68 20 65 78 70 72 65 73 73  * Search express
c070: 69 6f 6e 73 20 69 6e 20 74 68 73 20 6c 69 73 74  ions in ths list
c080: 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
c090: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20  et *pMaskSet,   
c0a0: 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72 6f 6d 20  /* Mapping from 
c0b0: 74 61 62 6c 65 73 20 74 6f 20 62 69 74 6d 61 70  tables to bitmap
c0c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  s */.  int iFirs
c0d0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
c0e0: 20 2f 2a 20 42 65 20 73 65 61 72 63 68 69 6e 67   /* Be searching
c0f0: 20 77 69 74 68 20 74 68 65 20 69 46 69 72 73 74   with the iFirst
c100: 2d 74 68 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  -th expression *
c110: 2f 0a 20 20 69 6e 74 20 69 42 61 73 65 20 20 20  /.  int iBase   
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c130: 20 49 67 6e 6f 72 65 20 72 65 66 65 72 65 6e 63   Ignore referenc
c140: 65 73 20 74 6f 20 74 68 69 73 20 74 61 62 6c 65  es to this table
c150: 20 2a 2f 0a 29 7b 0a 20 20 42 69 74 6d 61 73 6b   */.){.  Bitmask
c160: 20 61 6c 6c 6f 77 65 64 20 3d 20 7e 67 65 74 4d   allowed = ~getM
c170: 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 69 42  ask(pMaskSet, iB
c180: 61 73 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 69  ase);.  while( i
c190: 46 69 72 73 74 3c 70 4c 69 73 74 2d 3e 6e 45 78  First<pList->nEx
c1a0: 70 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 65  pr ){.    if( (e
c1b0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
c1c0: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
c1d0: 5b 69 46 69 72 73 74 2b 2b 5d 2e 70 45 78 70 72  [iFirst++].pExpr
c1e0: 29 26 61 6c 6c 6f 77 65 64 29 21 3d 30 20 29 7b  )&allowed)!=0 ){
c1f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
c200: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c210: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn 0;.}.../*.**
c220: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65   This routine de
c230: 63 69 64 65 73 20 69 66 20 70 49 64 78 20 63 61  cides if pIdx ca
c240: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 61 74  n be used to sat
c250: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
c260: 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20 49 66  Y.** clause.  If
c270: 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65 74 75   it can, it retu
c280: 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64 78 20  rns 1.  If pIdx 
c290: 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74  cannot satisfy t
c2a0: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
c2b0: 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f 75 74  lause, this rout
c2c0: 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a  ine returns 0..*
c2d0: 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73  *.** pOrderBy is
c2e0: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
c2f0: 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c 45 43  use from a SELEC
c300: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 54  T statement.  pT
c310: 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c 65 66  ab is the.** lef
c320: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69 6e 20  t-most table in 
c330: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
c340: 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53 45 4c  of that same SEL
c350: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 61 6e  ECT statement an
c360: 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 68  d.** the table h
c370: 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62  as a cursor numb
c380: 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20 20 70  er of "base".  p
c390: 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65 78 20  Idx is an index 
c3a0: 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 6e  on pTab..**.** n
c3b0: 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e 75 6d  EqCol is the num
c3c0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 6f  ber of columns o
c3d0: 66 20 70 49 64 78 20 74 68 61 74 20 61 72 65 20  f pIdx that are 
c3e0: 75 73 65 64 20 61 73 20 65 71 75 61 6c 69 74 79  used as equality
c3f0: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e  .** constraints.
c400: 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65 20 63    Any of these c
c410: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20 6d 69  olumns may be mi
c420: 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 4f  ssing from the O
c430: 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73  RDER BY.** claus
c440: 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20  e and the match 
c450: 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61 20 73  can still be a s
c460: 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c  uccess..**.** Al
c470: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f  l terms of the O
c480: 52 44 45 52 20 42 59 20 74 68 61 74 20 6d 61 74  RDER BY that mat
c490: 63 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 69  ch against the i
c4a0: 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 69 74  ndex must be eit
c4b0: 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72 20 44 45  her.** ASC or DE
c4c0: 53 43 2e 20 20 28 54 65 72 6d 73 20 6f 66 20 74  SC.  (Terms of t
c4d0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c4e0: 73 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  se past the end 
c4f0: 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a 2a 20 69  of a UNIQUE.** i
c500: 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e 65 65 64  ndex do not need
c510: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 69 73   to satisfy this
c520: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29 20 20 54   constraint.)  T
c530: 68 65 20 2a 70 62 52 65 76 20 76 61 6c 75 65 20  he *pbRev value 
c540: 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 31 20 69  is.** set to 1 i
c550: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
c560: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 44 45 53  lause is all DES
c570: 43 20 61 6e 64 20 69 74 20 69 73 20 73 65 74 20  C and it is set 
c580: 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68 65 20 4f  to 0 if.** the O
c590: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69  RDER BY clause i
c5a0: 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f 0a 73 74  s all ASC..*/.st
c5b0: 61 74 69 63 20 69 6e 74 20 69 73 53 6f 72 74 69  atic int isSorti
c5c0: 6e 67 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  ngIndex(.  Parse
c5d0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
c5e0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
c5f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
c600: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
c610: 74 2c 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66 72  t, /* Mapping fr
c620: 6f 6d 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20  om table cursor 
c630: 6e 75 6d 62 65 72 73 20 74 6f 20 62 69 74 6d 61  numbers to bitma
c640: 70 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  ps */.  Index *p
c650: 49 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  Idx,            
c660: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
c670: 61 72 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20  are testing */. 
c680: 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20   int base,      
c690: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
c6a0: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  or number for th
c6b0: 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f  e table to be so
c6c0: 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69  rted */.  ExprLi
c6d0: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
c6e0: 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
c6f0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  Y clause */.  in
c700: 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20  t nEqCol,       
c710: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c720: 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  of index columns
c730: 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61   with == constra
c740: 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ints */.  int *p
c750: 62 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20  bRev            
c760: 20 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66    /* Set to 1 if
c770: 20 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53   ORDER BY is DES
c780: 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  C */.){.  int i,
c790: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
c7a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c7b0: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
c7c0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 20 3d 20  int sortOrder = 
c7d0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
c7e0: 2f 2a 20 58 4f 52 20 6f 66 20 69 6e 64 65 78 20  /* XOR of index 
c7f0: 61 6e 64 20 4f 52 44 45 52 20 42 59 20 73 6f 72  and ORDER BY sor
c800: 74 20 64 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20  t direction */. 
c810: 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20   int nTerm;     
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
c840: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
c850: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
c860: 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20  t_item *pTerm;  
c870: 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
c880: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
c890: 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  se */.  sqlite3 
c8a0: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
c8b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  ;..  assert( pOr
c8c0: 64 65 72 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54  derBy!=0 );.  nT
c8d0: 65 72 6d 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  erm = pOrderBy->
c8e0: 6e 45 78 70 72 3b 0a 20 20 61 73 73 65 72 74 28  nExpr;.  assert(
c8f0: 20 6e 54 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f   nTerm>0 );..  /
c900: 2a 20 41 72 67 75 6d 65 6e 74 20 70 49 64 78 20  * Argument pIdx 
c910: 6d 75 73 74 20 65 69 74 68 65 72 20 70 6f 69 6e  must either poin
c920: 74 20 74 6f 20 61 20 27 72 65 61 6c 27 20 6e 61  t to a 'real' na
c930: 6d 65 64 20 69 6e 64 65 78 20 73 74 72 75 63 74  med index struct
c940: 75 72 65 2c 20 0a 20 20 2a 2a 20 6f 72 20 61 6e  ure, .  ** or an
c950: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
c960: 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 74 68   allocated on th
c970: 65 20 73 74 61 63 6b 20 62 79 20 62 65 73 74 42  e stack by bestB
c980: 74 72 65 65 49 6e 64 65 78 28 29 20 74 6f 0a 20  treeIndex() to. 
c990: 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 20 74 68   ** represent th
c9a0: 65 20 72 6f 77 69 64 20 69 6e 64 65 78 20 74 68  e rowid index th
c9b0: 61 74 20 69 73 20 70 61 72 74 20 6f 66 20 65 76  at is part of ev
c9c0: 65 72 79 20 74 61 62 6c 65 2e 20 20 2a 2f 0a 20  ery table.  */. 
c9d0: 20 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 7a   assert( pIdx->z
c9e0: 4e 61 6d 65 20 7c 7c 20 28 70 49 64 78 2d 3e 6e  Name || (pIdx->n
c9f0: 43 6f 6c 75 6d 6e 3d 3d 31 20 26 26 20 70 49 64  Column==1 && pId
ca00: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 3d 3d  x->aiColumn[0]==
ca10: 2d 31 29 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  -1) );..  /* Mat
ca20: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
ca30: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
ca40: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
ca50: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
ca60: 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74  x..  **.  ** Not
ca70: 65 20 74 68 61 74 20 69 6e 64 69 63 65 73 20 68  e that indices h
ca80: 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ave pIdx->nColum
ca90: 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  n regular column
caa0: 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e 65 20  s plus.  ** one 
cab0: 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c 75 6d  additional colum
cac0: 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  n containing the
cad0: 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72 6f 77   rowid.  The row
cae0: 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f  id column.  ** o
caf0: 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61  f the index is a
cb00: 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f 20 6d  lso allowed to m
cb10: 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68 65  atch against the
cb20: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
cb30: 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f  lause..  */.  fo
cb40: 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70  r(i=j=0, pTerm=p
cb50: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54  OrderBy->a; j<nT
cb60: 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78 2d 3e  erm && i<=pIdx->
cb70: 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20  nColumn; i++){. 
cb80: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20     Expr *pExpr; 
cb90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
cba0: 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f  ression of the O
cbb0: 52 44 45 52 20 42 59 20 70 54 65 72 6d 20 2a 2f  RDER BY pTerm */
cbc0: 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  .    CollSeq *pC
cbd0: 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65 20 63  oll;    /* The c
cbe0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
cbf0: 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  e of pExpr */.  
cc00: 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74 4f 72    int termSortOr
cc10: 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f 72 64  der; /* Sort ord
cc20: 65 72 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  er for this term
cc30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c   */.    int iCol
cc40: 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  umn;       /* Th
cc50: 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20 6f 66  e i-th column of
cc60: 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d 31 20   the index.  -1 
cc70: 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20 20 20  for rowid */.   
cc80: 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65 72 3b   int iSortOrder;
cc90: 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44 45 53      /* 1 for DES
cca0: 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f 6e 20  C, 0 for ASC on 
ccb0: 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78 20 74  the i-th index t
ccc0: 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  erm */.    const
ccd0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20 2f 2a   char *zColl; /*
cce0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
ccf0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lating sequence 
cd00: 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78 20 74  for i-th index t
cd10: 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  erm */..    pExp
cd20: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
cd30: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
cd40: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
cd50: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
cd60: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
cd70: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
cd80: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
cd90: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
cda0: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
cdb0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
cdc0: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
cdd0: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
cde0: 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  */.      break;.
cdf0: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
ce00: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
ce10: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
ce20: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
ce30: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 43 6f  oll ){.      pCo
ce40: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
ce50: 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ll;.    }.    if
ce60: 28 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 26 26  ( pIdx->zName &&
ce70: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
ce80: 20 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d   ){.      iColum
ce90: 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  n = pIdx->aiColu
cea0: 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  mn[i];.      if(
ceb0: 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e   iColumn==pIdx->
cec0: 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79 20 29 7b  pTable->iPKey ){
ced0: 0a 20 20 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e  .        iColumn
cee0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
cef0: 20 20 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20       iSortOrder 
cf00: 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  = pIdx->aSortOrd
cf10: 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20 7a 43 6f  er[i];.      zCo
cf20: 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a 43 6f 6c  ll = pIdx->azCol
cf30: 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  l[i];.    }else{
cf40: 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d  .      iColumn =
cf50: 20 2d 31 3b 0a 20 20 20 20 20 20 69 53 6f 72 74   -1;.      iSort
cf60: 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Order = 0;.     
cf70: 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 2d 3e   zColl = pColl->
cf80: 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a 20 20 20  zName;.    }.   
cf90: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
cfa0: 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20 7c 7c 20  umn!=iColumn || 
cfb0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
cfc0: 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  Coll->zName, zCo
cfd0: 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ll) ){.      /* 
cfe0: 54 65 72 6d 20 6a 20 6f 66 20 74 68 65 20 4f 52  Term j of the OR
cff0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 64 6f  DER BY clause do
d000: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 63 6f 6c  es not match col
d010: 75 6d 6e 20 69 20 6f 66 20 74 68 65 20 69 6e 64  umn i of the ind
d020: 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ex */.      if( 
d030: 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20  i<nEqCol ){.    
d040: 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64      /* If an ind
d050: 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69  ex column that i
d060: 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  s constrained by
d070: 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20 6d 61 74   == fails to mat
d080: 63 68 20 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ch an.        **
d090: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 2c 20   ORDER BY term, 
d0a0: 74 68 61 74 20 69 73 20 4f 4b 2e 20 20 4a 75 73  that is OK.  Jus
d0b0: 74 20 69 67 6e 6f 72 65 20 74 68 61 74 20 63 6f  t ignore that co
d0c0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65  lumn of the inde
d0d0: 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  x.        */.   
d0e0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
d0f0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
d100: 3d 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  ==pIdx->nColumn 
d110: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ){.        /* In
d120: 64 65 78 20 63 6f 6c 75 6d 6e 20 69 20 69 73 20  dex column i is 
d130: 74 68 65 20 72 6f 77 69 64 2e 20 20 41 6c 6c 20  the rowid.  All 
d140: 6f 74 68 65 72 20 74 65 72 6d 73 20 6d 61 74 63  other terms matc
d150: 68 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  h. */.        br
d160: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
d170: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
d180: 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20  an index column 
d190: 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61  fails to match a
d1a0: 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72  nd is not constr
d1b0: 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20  ained by ==.    
d1c0: 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20      ** then the 
d1d0: 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74  index cannot sat
d1e0: 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42  isfy the ORDER B
d1f0: 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20  Y constraint..  
d200: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
d210: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
d220: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
d230: 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74  ert( pIdx->aSort
d240: 4f 72 64 65 72 21 3d 30 20 7c 7c 20 69 43 6f 6c  Order!=0 || iCol
d250: 75 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 20 20 61  umn==-1 );.    a
d260: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f  ssert( pTerm->so
d270: 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54  rtOrder==0 || pT
d280: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d  erm->sortOrder==
d290: 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  1 );.    assert(
d2a0: 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c   iSortOrder==0 |
d2b0: 7c 20 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20  | iSortOrder==1 
d2c0: 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
d2d0: 72 64 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65  rder = iSortOrde
d2e0: 72 20 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  r ^ pTerm->sortO
d2f0: 72 64 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e  rder;.    if( i>
d300: 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  nEqCol ){.      
d310: 69 66 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65  if( termSortOrde
d320: 72 21 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a  r!=sortOrder ){.
d330: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63          /* Indic
d340: 65 73 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  es can only be u
d350: 73 65 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52  sed if all ORDER
d360: 20 42 59 20 74 65 72 6d 73 20 70 61 73 74 20 74   BY terms past t
d370: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71  he.        ** eq
d380: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
d390: 74 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ts are all eithe
d3a0: 72 20 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a  r DESC or ASC. *
d3b0: 2f 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  /.        return
d3c0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d3d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72  }else{.      sor
d3e0: 74 4f 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72  tOrder = termSor
d3f0: 74 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20  tOrder;.    }.  
d400: 20 20 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d    j++;.    pTerm
d410: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c  ++;.    if( iCol
d420: 75 6d 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65  umn<0 && !refere
d430: 6e 63 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28  ncesOtherTables(
d440: 70 4f 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53  pOrderBy, pMaskS
d450: 65 74 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a  et, j, base) ){.
d460: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
d470: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69  indexed column i
d480: 73 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  s the primary ke
d490: 79 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67  y and everything
d4a0: 20 6d 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a   matches.      *
d4b0: 2a 20 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e  * so far and non
d4c0: 65 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  e of the ORDER B
d4d0: 59 20 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72  Y terms to the r
d4e0: 69 67 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f  ight reference o
d4f0: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61  ther.      ** ta
d500: 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e  bles in the join
d510: 2c 20 74 68 65 6e 20 77 65 20 61 72 65 20 61 73  , then we are as
d520: 73 75 72 65 64 20 74 68 61 74 20 74 68 65 20 69  sured that the i
d530: 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64  ndex can be used
d540: 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f   .      ** to so
d550: 72 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  rt because the p
d560: 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e  rimary key is un
d570: 69 71 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65  ique and so none
d580: 20 6f 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20   of the other.  
d590: 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77      ** columns w
d5a0: 69 6c 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66  ill make any dif
d5b0: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f  ference.      */
d5c0: 0a 20 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d  .      j = nTerm
d5d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a  ;.    }.  }..  *
d5e0: 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
d5f0: 72 21 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e  r!=0;.  if( j>=n
d600: 54 65 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Term ){.    /* A
d610: 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
d620: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
d630: 61 72 65 20 63 6f 76 65 72 65 64 20 62 79 20 74  are covered by t
d640: 68 69 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20  his index so.   
d650: 20 2a 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63   ** this index c
d660: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
d670: 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  orting. */.    r
d680: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
d690: 66 28 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  f( pIdx->onError
d6a0: 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d  !=OE_None && i==
d6b0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20  pIdx->nColumn.  
d6c0: 20 20 20 20 26 26 20 21 72 65 66 65 72 65 6e 63      && !referenc
d6d0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
d6e0: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
d6f0: 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , j, base) ){.  
d700: 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f    /* All terms o
d710: 66 20 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74  f this index mat
d720: 63 68 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f  ch some prefix o
d730: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
d740: 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  lause.    ** and
d750: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e   the index is UN
d760: 49 51 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d  IQUE and no term
d770: 73 20 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66  s on the tail of
d780: 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20   the ORDER BY.  
d790: 20 20 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65    ** clause refe
d7a0: 72 65 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c  rence other tabl
d7b0: 65 73 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49  es in a join.  I
d7c0: 66 20 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72  f this is all tr
d7d0: 75 65 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  ue then.    ** t
d7e0: 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75  he order by clau
d7f0: 73 65 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75  se is superfluou
d800: 73 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  s. */.    return
d810: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
d820: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65   0;.}../*.** Pre
d830: 70 61 72 65 20 61 20 63 72 75 64 65 20 65 73 74  pare a crude est
d840: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67  imate of the log
d850: 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e  arithm of the in
d860: 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68  put value..** Th
d870: 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e  e results need n
d880: 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20 54 68  ot be exact.  Th
d890: 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20  is is only used 
d8a0: 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a  for estimating.*
d8b0: 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74  * the total cost
d8c0: 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f   of performing o
d8d0: 70 65 72 61 74 69 6f 6e 73 20 77 69 74 68 20 4f  perations with O
d8e0: 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67  (logN) or O(Nlog
d8f0: 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79  N).** complexity
d900: 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69 73 20  .  Because N is 
d910: 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20 69 74  just a guess, it
d920: 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61   is no great tra
d930: 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20  gedy if.** logN 
d940: 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e  is a little off.
d950: 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c  .*/.static doubl
d960: 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20  e estLog(double 
d970: 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67  N){.  double log
d980: 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20  N = 1;.  double 
d990: 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28  x = 10;.  while(
d9a0: 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e   N>x ){.    logN
d9b0: 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20   += 1;.    x *= 
d9c0: 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  10;.  }.  return
d9d0: 20 6c 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   logN;.}../*.** 
d9e0: 54 77 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  Two routines for
d9f0: 20 70 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f   printing the co
da00: 6e 74 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69  ntent of an sqli
da10: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a  te3_index_info.*
da20: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 55 73  * structure.  Us
da30: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
da40: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
da50: 79 2e 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a  y.  If neither.*
da60: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72  * SQLITE_TEST or
da70: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72   SQLITE_DEBUG ar
da80: 65 20 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20  e defined, then 
da90: 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a  these routines.*
daa0: 2a 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f  * are no-ops..*/
dab0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
dac0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
dad0: 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e  LTABLE) && defin
dae0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
daf0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41  .static void TRA
db00: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 73 71  CE_IDX_INPUTS(sq
db10: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
db20: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
db30: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
db40: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
db50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
db60: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
db70: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
db80: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 63  DebugPrintf("  c
db90: 6f 6e 73 74 72 61 69 6e 74 5b 25 64 5d 3a 20 63  onstraint[%d]: c
dba0: 6f 6c 3d 25 64 20 74 65 72 6d 69 64 3d 25 64 20  ol=%d termid=%d 
dbb0: 6f 70 3d 25 64 20 75 73 61 62 6c 65 64 3d 25 64  op=%d usabled=%d
dbc0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20  \n",.       i,. 
dbd0: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
dbe0: 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  aint[i].iColumn,
dbf0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
dc00: 74 72 61 69 6e 74 5b 69 5d 2e 69 54 65 72 6d 4f  traint[i].iTermO
dc10: 66 66 73 65 74 2c 0a 20 20 20 20 20 20 20 70 2d  ffset,.       p-
dc20: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
dc30: 6f 70 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  op,.       p->aC
dc40: 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61  onstraint[i].usa
dc50: 62 6c 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ble);.  }.  for(
dc60: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 72 64 65 72  i=0; i<p->nOrder
dc70: 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  By; i++){.    sq
dc80: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
dc90: 28 22 20 20 6f 72 64 65 72 62 79 5b 25 64 5d 3a  ("  orderby[%d]:
dca0: 20 63 6f 6c 3d 25 64 20 64 65 73 63 3d 25 64 5c   col=%d desc=%d\
dcb0: 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c 0a 20 20  n",.       i,.  
dcc0: 20 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79       p->aOrderBy
dcd0: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  [i].iColumn,.   
dce0: 20 20 20 20 70 2d 3e 61 4f 72 64 65 72 42 79 5b      p->aOrderBy[
dcf0: 69 5d 2e 64 65 73 63 29 3b 0a 20 20 7d 0a 7d 0a  i].desc);.  }.}.
dd00: 73 74 61 74 69 63 20 76 6f 69 64 20 54 52 41 43  static void TRAC
dd10: 45 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 73 71  E_IDX_OUTPUTS(sq
dd20: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
dd30: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
dd40: 20 69 66 28 20 21 73 71 6c 69 74 65 33 57 68 65   if( !sqlite3Whe
dd50: 72 65 54 72 61 63 65 20 29 20 72 65 74 75 72 6e  reTrace ) return
dd60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
dd70: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
dd80: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
dd90: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 75  DebugPrintf("  u
dda0: 73 61 67 65 5b 25 64 5d 3a 20 61 72 67 76 49 64  sage[%d]: argvId
ddb0: 78 3d 25 64 20 6f 6d 69 74 3d 25 64 5c 6e 22 2c  x=%d omit=%d\n",
ddc0: 0a 20 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20  .       i,.     
ddd0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
dde0: 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64  Usage[i].argvInd
ddf0: 65 78 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43  ex,.       p->aC
de00: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69  onstraintUsage[i
de10: 5d 2e 6f 6d 69 74 29 3b 0a 20 20 7d 0a 20 20 73  ].omit);.  }.  s
de20: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
de30: 66 28 22 20 20 69 64 78 4e 75 6d 3d 25 64 5c 6e  f("  idxNum=%d\n
de40: 22 2c 20 70 2d 3e 69 64 78 4e 75 6d 29 3b 0a 20  ", p->idxNum);. 
de50: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
de60: 6e 74 66 28 22 20 20 69 64 78 53 74 72 3d 25 73  ntf("  idxStr=%s
de70: 5c 6e 22 2c 20 70 2d 3e 69 64 78 53 74 72 29 3b  \n", p->idxStr);
de80: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
de90: 72 69 6e 74 66 28 22 20 20 6f 72 64 65 72 42 79  rintf("  orderBy
dea0: 43 6f 6e 73 75 6d 65 64 3d 25 64 5c 6e 22 2c 20  Consumed=%d\n", 
deb0: 70 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  p->orderByConsum
dec0: 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  ed);.  sqlite3De
ded0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 65 73 74  bugPrintf("  est
dee0: 69 6d 61 74 65 64 43 6f 73 74 3d 25 67 5c 6e 22  imatedCost=%g\n"
def0: 2c 20 70 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  , p->estimatedCo
df00: 73 74 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  st);.}.#else.#de
df10: 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58 5f 49  fine TRACE_IDX_I
df20: 4e 50 55 54 53 28 41 29 0a 23 64 65 66 69 6e 65  NPUTS(A).#define
df30: 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55   TRACE_IDX_OUTPU
df40: 54 53 28 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TS(A).#endif../*
df50: 20 0a 2a 2a 20 52 65 71 75 69 72 65 64 20 62 65   .** Required be
df60: 63 61 75 73 65 20 62 65 73 74 49 6e 64 65 78 28  cause bestIndex(
df70: 29 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 62  ) is called by b
df80: 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
df90: 28 29 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  () .*/.static vo
dfa0: 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20  id bestIndex(.  
dfb0: 20 20 50 61 72 73 65 2a 2c 20 57 68 65 72 65 43    Parse*, WhereC
dfc0: 6c 61 75 73 65 2a 2c 20 73 74 72 75 63 74 20 53  lause*, struct S
dfd0: 72 63 4c 69 73 74 5f 69 74 65 6d 2a 2c 20 42 69  rcList_item*, Bi
dfe0: 74 6d 61 73 6b 2c 20 45 78 70 72 4c 69 73 74 2a  tmask, ExprList*
dff0: 2c 20 57 68 65 72 65 43 6f 73 74 2a 29 3b 0a 0a  , WhereCost*);..
e000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e010: 6e 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 66  ne attempts to f
e020: 69 6e 64 20 61 6e 20 73 63 61 6e 6e 69 6e 67 20  ind an scanning 
e030: 73 74 72 61 74 65 67 79 20 74 68 61 74 20 63 61  strategy that ca
e040: 6e 20 62 65 20 75 73 65 64 20 0a 2a 2a 20 74 6f  n be used .** to
e050: 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 27 4f 52   optimize an 'OR
e060: 27 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  ' expression tha
e070: 74 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 57  t is part of a W
e080: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 2a 2a  HERE clause. .**
e090: 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 61 73  .** The table as
e0a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46 52  sociated with FR
e0b0: 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 70  OM clause term p
e0c0: 53 72 63 20 6d 61 79 20 62 65 20 65 69 74 68 65  Src may be eithe
e0d0: 72 20 61 0a 2a 2a 20 72 65 67 75 6c 61 72 20 42  r a.** regular B
e0e0: 2d 54 72 65 65 20 74 61 62 6c 65 20 6f 72 20 61  -Tree table or a
e0f0: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a   virtual table..
e100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
e110: 65 73 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78  estOrClauseIndex
e120: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
e130: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
e140: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
e150: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
e160: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
e170: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
e180: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
e190: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
e1a0: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
e1b0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
e1c0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
e1d0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
e1e0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
e1f0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
e200: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
e210: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
e220: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
e230: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
e240: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
e250: 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74  e */.  WhereCost
e260: 20 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20   *pCost         
e270: 20 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73     /* Lowest cos
e280: 74 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a  t query plan */.
e290: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
e2a0: 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49  E_OMIT_OR_OPTIMI
e2b0: 5a 41 54 49 4f 4e 0a 20 20 63 6f 6e 73 74 20 69  ZATION.  const i
e2c0: 6e 74 20 69 43 75 72 20 3d 20 70 53 72 63 2d 3e  nt iCur = pSrc->
e2d0: 69 43 75 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68  iCursor;   /* Th
e2e0: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
e2f0: 74 61 62 6c 65 20 74 6f 20 62 65 20 61 63 63 65  table to be acce
e300: 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ssed */.  const 
e310: 42 69 74 6d 61 73 6b 20 6d 61 73 6b 53 72 63 20  Bitmask maskSrc 
e320: 3d 20 67 65 74 4d 61 73 6b 28 70 57 43 2d 3e 70  = getMask(pWC->p
e330: 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 20  MaskSet, iCur); 
e340: 20 2f 2a 20 42 69 74 6d 61 73 6b 20 66 6f 72 20   /* Bitmask for 
e350: 70 53 72 63 20 2a 2f 0a 20 20 57 68 65 72 65 54  pSrc */.  WhereT
e360: 65 72 6d 20 2a 20 63 6f 6e 73 74 20 70 57 43 45  erm * const pWCE
e370: 6e 64 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  nd = &pWC->a[pWC
e380: 2d 3e 6e 54 65 72 6d 5d 3b 20 20 20 20 20 20 20  ->nTerm];       
e390: 20 2f 2a 20 45 6e 64 20 6f 66 20 70 57 43 2d 3e   /* End of pWC->
e3a0: 61 5b 5d 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  a[] */.  WhereTe
e3b0: 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
e3c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
e3d0: 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 74  single term of t
e3e0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e3f0: 2a 2f 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20  */..  /* Search 
e400: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
e410: 20 74 65 72 6d 73 20 66 6f 72 20 61 20 75 73 61   terms for a usa
e420: 62 6c 65 20 57 4f 5f 4f 52 20 74 65 72 6d 2e 20  ble WO_OR term. 
e430: 2a 2f 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  */.  for(pTerm=p
e440: 57 43 2d 3e 61 3b 20 70 54 65 72 6d 3c 70 57 43  WC->a; pTerm<pWC
e450: 45 6e 64 3b 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  End; pTerm++){. 
e460: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
e470: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52 20 0a  perator==WO_OR .
e480: 20 20 20 20 20 26 26 20 28 28 70 54 65 72 6d 2d       && ((pTerm-
e490: 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 7e 6d 61  >prereqAll & ~ma
e4a0: 73 6b 53 72 63 29 20 26 20 6e 6f 74 52 65 61 64  skSrc) & notRead
e4b0: 79 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 28 70  y)==0.     && (p
e4c0: 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d  Term->u.pOrInfo-
e4d0: 3e 69 6e 64 65 78 61 62 6c 65 20 26 20 6d 61 73  >indexable & mas
e4e0: 6b 53 72 63 29 21 3d 30 20 0a 20 20 20 20 29 7b  kSrc)!=0 .    ){
e4f0: 0a 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75  .      WhereClau
e500: 73 65 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43  se * const pOrWC
e510: 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72   = &pTerm->u.pOr
e520: 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20  Info->wc;.      
e530: 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f 6e 73  WhereTerm * cons
e540: 74 20 70 4f 72 57 43 45 6e 64 20 3d 20 26 70 4f  t pOrWCEnd = &pO
e550: 72 57 43 2d 3e 61 5b 70 4f 72 57 43 2d 3e 6e 54  rWC->a[pOrWC->nT
e560: 65 72 6d 5d 3b 0a 20 20 20 20 20 20 57 68 65 72  erm];.      Wher
e570: 65 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a  eTerm *pOrTerm;.
e580: 20 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20        int flags 
e590: 3d 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  = WHERE_MULTI_OR
e5a0: 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72  ;.      double r
e5b0: 54 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  Total = 0;.     
e5c0: 20 64 6f 75 62 6c 65 20 6e 52 6f 77 20 3d 20 30   double nRow = 0
e5d0: 3b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20  ;.      Bitmask 
e5e0: 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 20  used = 0;..     
e5f0: 20 66 6f 72 28 70 4f 72 54 65 72 6d 3d 70 4f 72   for(pOrTerm=pOr
e600: 57 43 2d 3e 61 3b 20 70 4f 72 54 65 72 6d 3c 70  WC->a; pOrTerm<p
e610: 4f 72 57 43 45 6e 64 3b 20 70 4f 72 54 65 72 6d  OrWCEnd; pOrTerm
e620: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65  ++){.        Whe
e630: 72 65 43 6f 73 74 20 73 54 65 72 6d 43 6f 73 74  reCost sTermCost
e640: 3b 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54  ;.        WHERET
e650: 52 41 43 45 28 28 22 2e 2e 2e 20 4d 75 6c 74 69  RACE(("... Multi
e660: 2d 69 6e 64 65 78 20 4f 52 20 74 65 73 74 69 6e  -index OR testin
e670: 67 20 66 6f 72 20 74 65 72 6d 20 25 64 20 6f 66  g for term %d of
e680: 20 25 64 2e 2e 2e 2e 5c 6e 22 2c 20 0a 20 20 20   %d....\n", .   
e690: 20 20 20 20 20 20 20 28 70 4f 72 54 65 72 6d 20         (pOrTerm 
e6a0: 2d 20 70 4f 72 57 43 2d 3e 61 29 2c 20 28 70 54  - pOrWC->a), (pT
e6b0: 65 72 6d 20 2d 20 70 57 43 2d 3e 61 29 0a 20 20  erm - pWC->a).  
e6c0: 20 20 20 20 20 20 29 29 3b 0a 20 20 20 20 20 20        ));.      
e6d0: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65    if( pOrTerm->e
e6e0: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44  Operator==WO_AND
e6f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 57 68   ){.          Wh
e700: 65 72 65 43 6c 61 75 73 65 20 2a 70 41 6e 64 57  ereClause *pAndW
e710: 43 20 3d 20 26 70 4f 72 54 65 72 6d 2d 3e 75 2e  C = &pOrTerm->u.
e720: 70 41 6e 64 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20  pAndInfo->wc;.  
e730: 20 20 20 20 20 20 20 20 62 65 73 74 49 6e 64 65          bestInde
e740: 78 28 70 50 61 72 73 65 2c 20 70 41 6e 64 57 43  x(pParse, pAndWC
e750: 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
e760: 2c 20 30 2c 20 26 73 54 65 72 6d 43 6f 73 74 29  , 0, &sTermCost)
e770: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
e780: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
e790: 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 7b  tCursor==iCur ){
e7a0: 0a 20 20 20 20 20 20 20 20 20 20 57 68 65 72 65  .          Where
e7b0: 43 6c 61 75 73 65 20 74 65 6d 70 57 43 3b 0a 20  Clause tempWC;. 
e7c0: 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
e7d0: 70 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50  pParse = pWC->pP
e7e0: 61 72 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  arse;.          
e7f0: 74 65 6d 70 57 43 2e 70 4d 61 73 6b 53 65 74 20  tempWC.pMaskSet 
e800: 3d 20 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b  = pWC->pMaskSet;
e810: 0a 20 20 20 20 20 20 20 20 20 20 74 65 6d 70 57  .          tempW
e820: 43 2e 6f 70 20 3d 20 54 4b 5f 41 4e 44 3b 0a 20  C.op = TK_AND;. 
e830: 20 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e           tempWC.
e840: 61 20 3d 20 70 4f 72 54 65 72 6d 3b 0a 20 20 20  a = pOrTerm;.   
e850: 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 6e 54         tempWC.nT
e860: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  erm = 1;.       
e870: 20 20 20 62 65 73 74 49 6e 64 65 78 28 70 50 61     bestIndex(pPa
e880: 72 73 65 2c 20 26 74 65 6d 70 57 43 2c 20 70 53  rse, &tempWC, pS
e890: 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 30 2c  rc, notReady, 0,
e8a0: 20 26 73 54 65 72 6d 43 6f 73 74 29 3b 0a 20 20   &sTermCost);.  
e8b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e8c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
e8d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e8e0: 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 73 54 65     rTotal += sTe
e8f0: 72 6d 43 6f 73 74 2e 72 43 6f 73 74 3b 0a 20 20  rmCost.rCost;.  
e900: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 73 54        nRow += sT
e910: 65 72 6d 43 6f 73 74 2e 6e 52 6f 77 3b 0a 20 20  ermCost.nRow;.  
e920: 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 73 54        used |= sT
e930: 65 72 6d 43 6f 73 74 2e 75 73 65 64 3b 0a 20 20  ermCost.used;.  
e940: 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61 6c        if( rTotal
e950: 3e 3d 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  >=pCost->rCost )
e960: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e970: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
e980: 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  re is an ORDER B
e990: 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61  Y clause, increa
e9a0: 73 65 20 74 68 65 20 73 63 61 6e 20 63 6f 73 74  se the scan cost
e9b0: 20 74 6f 20 61 63 63 6f 75 6e 74 20 0a 20 20 20   to account .   
e9c0: 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 6f     ** for the co
e9d0: 73 74 20 6f 66 20 74 68 65 20 73 6f 72 74 2e 20  st of the sort. 
e9e0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72  */.      if( pOr
e9f0: 64 65 72 42 79 21 3d 30 20 29 7b 0a 20 20 20 20  derBy!=0 ){.    
ea00: 20 20 20 20 72 54 6f 74 61 6c 20 2b 3d 20 6e 52      rTotal += nR
ea10: 6f 77 2a 65 73 74 4c 6f 67 28 6e 52 6f 77 29 3b  ow*estLog(nRow);
ea20: 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 54 52  .        WHERETR
ea30: 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e  ACE(("... sortin
ea40: 67 20 69 6e 63 72 65 61 73 65 73 20 4f 52 20 63  g increases OR c
ea50: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
ea60: 72 54 6f 74 61 6c 29 29 3b 0a 20 20 20 20 20 20  rTotal));.      
ea70: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  }..      /* If t
ea80: 68 65 20 63 6f 73 74 20 6f 66 20 73 63 61 6e 6e  he cost of scann
ea90: 69 6e 67 20 75 73 69 6e 67 20 74 68 69 73 20 4f  ing using this O
eaa0: 52 20 74 65 72 6d 20 66 6f 72 20 6f 70 74 69 6d  R term for optim
eab0: 69 7a 61 74 69 6f 6e 20 69 73 0a 20 20 20 20 20  ization is.     
eac0: 20 2a 2a 20 6c 65 73 73 20 74 68 61 6e 20 74 68   ** less than th
ead0: 65 20 63 75 72 72 65 6e 74 20 63 6f 73 74 20 73  e current cost s
eae0: 74 6f 72 65 64 20 69 6e 20 70 43 6f 73 74 2c 20  tored in pCost, 
eaf0: 72 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  replace the cont
eb00: 65 6e 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ents.      ** of
eb10: 20 70 43 6f 73 74 2e 20 2a 2f 0a 20 20 20 20 20   pCost. */.     
eb20: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
eb30: 2e 20 6d 75 6c 74 69 2d 69 6e 64 65 78 20 4f 52  . multi-index OR
eb40: 20 63 6f 73 74 3d 25 2e 39 67 20 6e 72 6f 77 3d   cost=%.9g nrow=
eb50: 25 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 2c  %.9g\n", rTotal,
eb60: 20 6e 52 6f 77 29 29 3b 0a 20 20 20 20 20 20 69   nRow));.      i
eb70: 66 28 20 72 54 6f 74 61 6c 3c 70 43 6f 73 74 2d  f( rTotal<pCost-
eb80: 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20  >rCost ){.      
eb90: 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
eba0: 20 72 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 20   rTotal;.       
ebb0: 20 70 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e   pCost->nRow = n
ebc0: 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Row;.        pCo
ebd0: 73 74 2d 3e 75 73 65 64 20 3d 20 75 73 65 64 3b  st->used = used;
ebe0: 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
ebf0: 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d 20 66  plan.wsFlags = f
ec00: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 70 43  lags;.        pC
ec10: 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 54 65 72  ost->plan.u.pTer
ec20: 6d 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  m = pTerm;.     
ec30: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
ec40: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ec50: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
ec60: 4f 4e 20 2a 2f 0a 7d 0a 0a 23 69 66 6e 64 65 66  ON */.}..#ifndef
ec70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ec80: 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
ec90: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 70 6f 70  Allocate and pop
eca0: 75 6c 61 74 65 20 61 6e 20 73 71 6c 69 74 65 33  ulate an sqlite3
ecb0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
ecc0: 63 74 75 72 65 2e 20 49 74 20 69 73 20 74 68 65  cture. It is the
ecd0: 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
ece0: 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
ecf0: 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
ed00: 72 65 6c 65 61 73 65 20 74 68 65 20 73 74 72 75  release the stru
ed10: 63 74 75 72 65 0a 2a 2a 20 62 79 20 70 61 73 73  cture.** by pass
ed20: 69 6e 67 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ing the pointer 
ed30: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
ed40: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 73 71 6c   function to sql
ed50: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
ed60: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
ed70: 6e 64 65 78 5f 69 6e 66 6f 20 2a 61 6c 6c 6f 63  ndex_info *alloc
ed80: 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 0a 20 20  ateIndexInfo(.  
ed90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 0a  Parse *pParse, .
eda0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
edb0: 57 43 2c 0a 20 20 73 74 72 75 63 74 20 53 72 63  WC,.  struct Src
edc0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
edd0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
ede0: 64 65 72 42 79 0a 29 7b 0a 20 20 69 6e 74 20 69  derBy.){.  int i
edf0: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 54 65 72 6d  , j;.  int nTerm
ee00: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
ee10: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
ee20: 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b 0a 20  int *pIdxCons;. 
ee30: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
ee40: 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 20 2a 70  index_orderby *p
ee50: 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20 73 74  IdxOrderBy;.  st
ee60: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
ee70: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
ee80: 61 67 65 20 2a 70 55 73 61 67 65 3b 0a 20 20 57  age *pUsage;.  W
ee90: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
eea0: 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b  .  int nOrderBy;
eeb0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
eec0: 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b  _info *pIdxInfo;
eed0: 0a 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  ..  WHERETRACE((
eee0: 22 52 65 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64  "Recomputing ind
eef0: 65 78 20 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e  ex info for %s..
ef00: 2e 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61 62  .\n", pSrc->pTab
ef10: 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 2f 2a  ->zName));..  /*
ef20: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
ef30: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
ef40: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
ef50: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
ef60: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 76 69  .  ** to this vi
ef70: 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 20  rtual table */. 
ef80: 20 66 6f 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20   for(i=nTerm=0, 
ef90: 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c  pTerm=pWC->a; i<
efa0: 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c  pWC->nTerm; i++,
efb0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69   pTerm++){.    i
efc0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
efd0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
efe0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
eff0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
f000: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26  Term->eOperator&
f010: 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  (pTerm->eOperato
f020: 72 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  r-1))==0 );.    
f030: 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
f040: 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49  >eOperator==WO_I
f050: 4e 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  N );.    testcas
f060: 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
f070: 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor==WO_ISNULL )
f080: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d  ;.    if( pTerm-
f090: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
f0a0: 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29  _IN|WO_ISNULL) )
f0b0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6e   continue;.    n
f0c0: 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  Term++;.  }..  /
f0d0: 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20 42  * If the ORDER B
f0e0: 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69 6e  Y clause contain
f0f0: 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20 69  s only columns i
f100: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20  n the current . 
f110: 20 2a 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c   ** virtual tabl
f120: 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  e then allocate 
f130: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f  space for the aO
f140: 72 64 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20  rderBy part of. 
f150: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f   ** the sqlite3_
f160: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f170: 74 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 72  ture..  */.  nOr
f180: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 69 66 28  derBy = 0;.  if(
f190: 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
f1a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
f1b0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
f1c0: 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
f1d0: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
f1e0: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
f1f0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
f200: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
f210: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70 53  Expr->iTable!=pS
f220: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62 72  rc->iCursor ) br
f230: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
f240: 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e  f( i==pOrderBy->
f250: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 6e  nExpr ){.      n
f260: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
f270: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 7d  By->nExpr;.    }
f280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
f290: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
f2a0: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
f2b0: 74 75 72 65 0a 20 20 2a 2f 0a 20 20 70 49 64 78  ture.  */.  pIdx
f2c0: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33 44 62  Info = sqlite3Db
f2d0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 50 61 72 73  MallocZero(pPars
f2e0: 65 2d 3e 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  e->db, sizeof(*p
f2f0: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70      + (sizeof(*p
f320: 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f  IdxCons) + sizeo
f330: 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72  f(*pUsage))*nTer
f340: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m.              
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
f360: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
f370: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
f380: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
f390: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
f3a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
f3b0: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
f3c0: 29 3b 0a 20 20 20 20 2f 2a 20 28 64 6f 75 62 6c  );.    /* (doubl
f3d0: 65 29 30 20 49 6e 20 63 61 73 65 20 6f 66 20 53  e)0 In case of S
f3e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
f3f0: 49 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a  ING_POINT... */.
f400: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
f410: 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  }..  /* Initiali
f420: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
f430: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
f440: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
f450: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 2a  ure contains.  *
f460: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
f470: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
f480: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
f490: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
f4a0: 6f 6d 0a 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67  om.  ** changing
f4b0: 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20   them.  We have 
f4c0: 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79  to do some funky
f4d0: 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65   casting in orde
f4e0: 72 20 74 6f 0a 20 20 2a 2a 20 69 6e 69 74 69 61  r to.  ** initia
f4f0: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
f500: 73 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f  s..  */.  pIdxCo
f510: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
f520: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f530: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
f540: 5b 31 5d 3b 0a 20 20 70 49 64 78 4f 72 64 65 72  [1];.  pIdxOrder
f550: 42 79 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  By = (struct sql
f560: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
f570: 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b 6e 54  by*)&pIdxCons[nT
f580: 65 72 6d 5d 3b 0a 20 20 70 55 73 61 67 65 20 3d  erm];.  pUsage =
f590: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
f5a0: 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e  _index_constrain
f5b0: 74 5f 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72  t_usage*)&pIdxOr
f5c0: 64 65 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b  derBy[nOrderBy];
f5d0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
f5e0: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
f5f0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 2a 28 69 6e   = nTerm;.  *(in
f600: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
f610: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
f620: 79 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71  y;.  *(struct sq
f630: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
f640: 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e  traint**)&pIdxIn
f650: 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20  fo->aConstraint 
f660: 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 2a 28  = pIdxCons;.  *(
f670: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
f680: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
f690: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
f6a0: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
f6b0: 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c  ;.  *(struct sql
f6c0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
f6d0: 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70  raint_usage**)&p
f6e0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
f6f0: 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20  aintUsage =.    
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f740: 55 73 61 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  Usage;..  for(i=
f750: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  j=0, pTerm=pWC->
f760: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
f770: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
f780: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
f790: 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72  eftCursor != pSr
f7a0: 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e  c->iCursor ) con
f7b0: 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72  tinue;.    asser
f7c0: 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65 72  t( (pTerm->eOper
f7d0: 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e 65 4f 70  ator&(pTerm->eOp
f7e0: 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30 20 29 3b  erator-1))==0 );
f7f0: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
f800: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
f810: 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20 20 74 65  =WO_IN );.    te
f820: 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
f830: 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e  Operator==WO_ISN
f840: 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ULL );.    if( p
f850: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
f860: 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  & (WO_IN|WO_ISNU
f870: 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LL) ) continue;.
f880: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
f890: 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d 2d  iColumn = pTerm-
f8a0: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
f8b0: 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69     pIdxCons[j].i
f8c0: 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b 0a  TermOffset = i;.
f8d0: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
f8e0: 6f 70 20 3d 20 28 75 38 29 70 54 65 72 6d 2d 3e  op = (u8)pTerm->
f8f0: 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 2f  eOperator;.    /
f900: 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73 73  * The direct ass
f910: 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ignment in the p
f920: 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73 20  revious line is 
f930: 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62 65  possible only be
f940: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
f950: 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f   WO_ and SQLITE_
f960: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
f970: 5f 20 63 6f 64 65 73 20 61 72 65 20 69 64 65 6e  _ codes are iden
f980: 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20  tical.  The.    
f990: 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
f9a0: 65 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73  erts verify this
f9b0: 20 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 61 73   fact. */.    as
f9c0: 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51 4c  sert( WO_EQ==SQL
f9d0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
f9e0: 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20 61  AINT_EQ );.    a
f9f0: 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51  ssert( WO_LT==SQ
fa00: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
fa10: 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20  RAINT_LT );.    
fa20: 61 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53  assert( WO_LE==S
fa30: 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53  QLITE_INDEX_CONS
fa40: 54 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20  TRAINT_LE );.   
fa50: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d   assert( WO_GT==
fa60: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
fa70: 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20  STRAINT_GT );.  
fa80: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
fa90: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
faa0: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
fab0: 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d 41     assert( WO_MA
fac0: 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  TCH==SQLITE_INDE
fad0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41 54  X_CONSTRAINT_MAT
fae0: 43 48 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  CH );.    assert
faf0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
fb00: 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c  or & (WO_EQ|WO_L
fb10: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
fb20: 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b  _GE|WO_MATCH) );
fb30: 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20 7d 0a 20 20  .    j++;.  }.  
fb40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65  for(i=0; i<nOrde
fb50: 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45  rBy; i++){.    E
fb60: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72  xpr *pExpr = pOr
fb70: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70  derBy->a[i].pExp
fb80: 72 3b 0a 20 20 20 20 70 49 64 78 4f 72 64 65 72  r;.    pIdxOrder
fb90: 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20  By[i].iColumn = 
fba0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
fbb0: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
fbc0: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
fbd0: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
fbe0: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
fbf0: 6e 20 70 49 64 78 49 6e 66 6f 3b 0a 7d 0a 0a 2f  n pIdxInfo;.}../
fc00: 2a 0a 2a 2a 20 54 68 65 20 74 61 62 6c 65 20 6f  *.** The table o
fc10: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
fc20: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
fc30: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
fc40: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
fc50: 2a 20 6d 75 73 74 20 72 65 70 72 65 73 65 6e 74  * must represent
fc60: 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65   a virtual table
fc70: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
fc80: 69 6e 76 6f 6b 65 73 20 74 68 65 20 78 42 65 73  invokes the xBes
fc90: 74 49 6e 64 65 78 28 29 0a 2a 2a 20 6d 65 74 68  tIndex().** meth
fca0: 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75 61  od of the virtua
fcb0: 6c 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65  l table with the
fcc0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
fcd0: 6e 66 6f 20 70 6f 69 6e 74 65 72 20 70 61 73 73  nfo pointer pass
fce0: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 61 72 67  ed.** as the arg
fcf0: 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
fd00: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
fd10: 20 70 50 61 72 73 65 20 69 73 20 70 6f 70 75 6c   pParse is popul
fd20: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
fd30: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 61  or message and a
fd40: 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  .** non-zero val
fd50: 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ue is returned. 
fd60: 4f 74 68 65 72 77 69 73 65 2c 20 30 20 69 73 20  Otherwise, 0 is 
fd70: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
fd80: 20 6f 75 74 70 75 74 0a 2a 2a 20 70 61 72 74 20   output.** part 
fd90: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
fda0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
fdb0: 75 72 65 20 69 73 20 6c 65 66 74 20 70 6f 70 75  ure is left popu
fdc0: 6c 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  lated..**.** Whe
fdd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 6e 20 65  ther or not an e
fde0: 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
fdf0: 2c 20 69 74 20 69 73 20 74 68 65 20 72 65 73 70  , it is the resp
fe00: 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
fe10: 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
fe20: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 70  ventually free p
fe30: 2d 3e 69 64 78 53 74 72 20 69 66 20 70 2d 3e 6e  ->idxStr if p->n
fe40: 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20  eedToFreeIdxStr 
fe50: 69 6e 64 69 63 61 74 65 73 0a 2a 2a 20 74 68 61  indicates.** tha
fe60: 74 20 74 68 69 73 20 69 73 20 72 65 71 75 69 72  t this is requir
fe70: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
fe80: 74 20 76 74 61 62 42 65 73 74 49 6e 64 65 78 28  t vtabBestIndex(
fe90: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54  Parse *pParse, T
fea0: 61 62 6c 65 20 2a 70 54 61 62 2c 20 73 71 6c 69  able *pTab, sqli
feb0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
fec0: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 74  p){.  sqlite3_vt
fed0: 61 62 20 2a 70 56 74 61 62 20 3d 20 73 71 6c 69  ab *pVtab = sqli
fee0: 74 65 33 47 65 74 56 54 61 62 6c 65 28 70 50 61  te3GetVTable(pPa
fef0: 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 29 2d 3e  rse->db, pTab)->
ff00: 70 56 74 61 62 3b 0a 20 20 69 6e 74 20 69 3b 0a  pVtab;.  int i;.
ff10: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 28 76 6f    int rc;..  (vo
ff20: 69 64 29 73 71 6c 69 74 65 33 53 61 66 65 74 79  id)sqlite3Safety
ff30: 4f 66 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  Off(pParse->db);
ff40: 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
ff50: 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
ff60: 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
ff70: 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
ff80: 5f 49 4e 50 55 54 53 28 70 29 3b 0a 20 20 72 63  _INPUTS(p);.  rc
ff90: 20 3d 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c   = pVtab->pModul
ffa0: 65 2d 3e 78 42 65 73 74 49 6e 64 65 78 28 70 56  e->xBestIndex(pV
ffb0: 74 61 62 2c 20 70 29 3b 0a 20 20 54 52 41 43 45  tab, p);.  TRACE
ffc0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 70 29 3b  _IDX_OUTPUTS(p);
ffd0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
ffe0: 53 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d  SafetyOn(pParse-
fff0: 3e 64 62 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  >db);..  if( rc!
10000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10010 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10020 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
10030 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
10040 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  ocFailed = 1;.  
10050 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 56 74    }else if( !pVt
10060 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ab->zErrMsg ){. 
10070 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
10080 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73  rMsg(pParse, "%s
10090 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  ", sqlite3ErrStr
100a0 28 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (rc));.    }else
100b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
100c0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
100d0 22 25 73 22 2c 20 70 56 74 61 62 2d 3e 7a 45 72  "%s", pVtab->zEr
100e0 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
100f0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
10100 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 56 74  (pParse->db, pVt
10110 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
10120 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
10130 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0;..  for(i=0; 
10140 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  i<p->nConstraint
10150 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
10160 21 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b  !p->aConstraint[
10170 69 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 2d 3e  i].usable && p->
10180 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
10190 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20  [i].argvIndex>0 
101a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
101b0 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
101c0 20 0a 20 20 20 20 20 20 20 20 20 20 22 74 61 62   .          "tab
101d0 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e 64 65  le %s: xBestInde
101e0 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20 69 6e  x returned an in
101f0 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70 54 61  valid plan", pTa
10200 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  b->zName);.    }
10210 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
10220 50 61 72 73 65 2d 3e 6e 45 72 72 3b 0a 7d 0a 0a  Parse->nErr;.}..
10230 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 74  ./*.** Compute t
10240 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
10250 72 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  r a virtual tabl
10260 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 65 73  e..**.** The bes
10270 74 20 69 6e 64 65 78 20 69 73 20 63 6f 6d 70 75  t index is compu
10280 74 65 64 20 62 79 20 74 68 65 20 78 42 65 73 74  ted by the xBest
10290 49 6e 64 65 78 20 6d 65 74 68 6f 64 20 6f 66 20  Index method of 
102a0 74 68 65 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  the virtual.** t
102b0 61 62 6c 65 20 6d 6f 64 75 6c 65 2e 20 20 54 68  able module.  Th
102c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65  is routine is re
102d0 61 6c 6c 79 20 6a 75 73 74 20 61 20 77 72 61 70  ally just a wrap
102e0 70 65 72 20 74 68 61 74 20 73 65 74 73 20 75 70  per that sets up
102f0 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f  .** the sqlite3_
10300 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
10310 74 75 72 65 20 74 68 61 74 20 69 73 20 75 73 65  ture that is use
10320 64 20 74 6f 20 63 6f 6d 6d 75 6e 69 63 61 74 65  d to communicate
10330 20 77 69 74 68 0a 2a 2a 20 78 42 65 73 74 49 6e   with.** xBestIn
10340 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 20  dex..**.** In a 
10350 6a 6f 69 6e 2c 20 74 68 69 73 20 72 6f 75 74 69  join, this routi
10360 6e 65 20 6d 69 67 68 74 20 62 65 20 63 61 6c 6c  ne might be call
10370 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
10380 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 61 6d  s for the.** sam
10390 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  e virtual table.
103a0 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e    The sqlite3_in
103b0 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
103c0 72 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  re is created.**
103d0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
103e0 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 69 6e   on the first in
103f0 76 6f 63 61 74 69 6f 6e 20 61 6e 64 20 72 65 75  vocation and reu
10400 73 65 64 20 6f 6e 20 61 6c 6c 20 73 75 62 73 65  sed on all subse
10410 71 75 65 6e 74 0a 2a 2a 20 69 6e 76 6f 63 61 74  quent.** invocat
10420 69 6f 6e 73 2e 20 20 54 68 65 20 73 71 6c 69 74  ions.  The sqlit
10430 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74  e3_index_info st
10440 72 75 63 74 75 72 65 20 69 73 20 61 6c 73 6f 20  ructure is also 
10450 75 73 65 64 20 77 68 65 6e 0a 2a 2a 20 63 6f 64  used when.** cod
10460 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 74  e is generated t
10470 6f 20 61 63 63 65 73 73 20 74 68 65 20 76 69 72  o access the vir
10480 74 75 61 6c 20 74 61 62 6c 65 2e 20 20 54 68 65  tual table.  The
10490 20 77 68 65 72 65 49 6e 66 6f 44 65 6c 65 74 65   whereInfoDelete
104a0 28 29 20 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  () .** routine t
104b0 61 6b 65 73 20 63 61 72 65 20 6f 66 20 66 72 65  akes care of fre
104c0 65 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  eing the sqlite3
104d0 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75  _index_info stru
104e0 63 74 75 72 65 20 61 66 74 65 72 0a 2a 2a 20 65  cture after.** e
104f0 76 65 72 79 62 6f 64 79 20 68 61 73 20 66 69 6e  verybody has fin
10500 69 73 68 65 64 20 77 69 74 68 20 69 74 2e 0a 2a  ished with it..*
10510 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65  /.static void be
10520 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 0a  stVirtualIndex(.
10530 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
10540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10550 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
10560 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
10570 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
10580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10590 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
105a0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
105b0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
105c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52  ,      /* The FR
105d0 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74  OM clause term t
105e0 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69  o search */.  Bi
105f0 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20  tmask notReady, 
10600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10610 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
10620 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
10630 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
10640 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10660 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61  The order by cla
10670 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f  use */.  WhereCo
10680 73 74 20 2a 70 43 6f 73 74 2c 20 20 20 20 20 20  st *pCost,      
10690 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
106a0 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
106b0 61 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  an */.  sqlite3_
106c0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49  index_info **ppI
106d0 64 78 49 6e 66 6f 20 20 2f 2a 20 49 6e 64 65 78  dxInfo  /* Index
106e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73   information pas
106f0 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64 65  sed to xBestInde
10700 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65 20  x */.){.  Table 
10710 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70 54  *pTab = pSrc->pT
10720 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  ab;.  sqlite3_in
10730 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e  dex_info *pIdxIn
10740 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  fo;.  struct sql
10750 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
10760 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73 3b  raint *pIdxCons;
10770 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65  .  struct sqlite
10780 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
10790 6e 74 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65  nt_usage *pUsage
107a0 3b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  ;.  WhereTerm *p
107b0 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  Term;.  int i, j
107c0 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79  ;.  int nOrderBy
107d0 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
107e0 65 20 77 73 46 6c 61 67 73 20 69 73 20 69 6e 69  e wsFlags is ini
107f0 74 69 61 6c 69 7a 65 64 20 74 6f 20 73 6f 6d 65  tialized to some
10800 20 73 61 6e 65 20 76 61 6c 75 65 2e 20 4f 74 68   sane value. Oth
10810 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 0a  erwise, if the .
10820 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 69 6e 20 61    ** malloc in a
10830 6c 6c 6f 63 61 74 65 49 6e 64 65 78 49 6e 66 6f  llocateIndexInfo
10840 28 29 20 66 61 69 6c 73 20 61 6e 64 20 74 68 69  () fails and thi
10850 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
10860 6e 73 20 6c 65 61 76 69 6e 67 0a 20 20 2a 2a 20  ns leaving.  ** 
10870 77 73 46 6c 61 67 73 20 69 6e 20 61 6e 20 75 6e  wsFlags in an un
10880 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74  initialized stat
10890 65 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 61  e, the caller ma
108a0 79 20 62 65 68 61 76 65 20 75 6e 70 72 65 64 69  y behave unpredi
108b0 63 74 61 62 6c 79 2e 0a 20 20 2a 2f 0a 20 20 6d  ctably..  */.  m
108c0 65 6d 73 65 74 28 70 43 6f 73 74 2c 20 30 2c 20  emset(pCost, 0, 
108d0 73 69 7a 65 6f 66 28 2a 70 43 6f 73 74 29 29 3b  sizeof(*pCost));
108e0 0a 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77  .  pCost->plan.w
108f0 73 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56  sFlags = WHERE_V
10900 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 0a 20 20  IRTUALTABLE;..  
10910 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69 74 65  /* If the sqlite
10920 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
10930 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74 20 62  ucture has not b
10940 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79 0a 20  een previously. 
10950 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   ** allocated an
10960 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74  d initialized, t
10970 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  hen allocate and
10980 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e   initialize it n
10990 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  ow..  */.  pIdxI
109a0 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f  nfo = *ppIdxInfo
109b0 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
109c0 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 70 49 64  ==0 ){.    *ppId
109d0 78 49 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f  xInfo = pIdxInfo
109e0 20 3d 20 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78   = allocateIndex
109f0 49 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 57 43  Info(pParse, pWC
10a00 2c 20 70 53 72 63 2c 20 70 4f 72 64 65 72 42 79  , pSrc, pOrderBy
10a10 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64  );.  }.  if( pId
10a20 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  xInfo==0 ){.    
10a30 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  return;.  }..  /
10a40 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  * At this point,
10a50 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
10a60 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
10a70 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f 20  e that pIdxInfo 
10a80 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 77  points.  ** to w
10a90 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69 6e  ill have been in
10aa0 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68 65  itialized, eithe
10ab0 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75 72  r during the cur
10ac0 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rent invocation 
10ad0 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 73  or.  ** during s
10ae0 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63 61  ome prior invoca
10af0 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a 75  tion.  Now we ju
10b00 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74 6f  st have to custo
10b10 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64 65  mize the.  ** de
10b20 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e 66  tails of pIdxInf
10b30 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  o for the curren
10b40 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
10b50 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a 2a   pass it to.  **
10b60 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20 2a   xBestIndex..  *
10b70 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64 75  /..  /* The modu
10b80 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  le name must be 
10b90 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20 62  defined. Also, b
10ba0 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  y this point the
10bb0 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  re must.  ** be 
10bc0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
10bd0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74 72  sqlite3_vtab str
10be0 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69 73  ucture. Otherwis
10bf0 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 69  e.  ** sqlite3Vi
10c00 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73  ewGetColumnNames
10c10 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70 69  () would have pi
10c20 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72 6f  cked up the erro
10c30 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  r. .  */.  asser
10c40 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c  t( pTab->azModul
10c50 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61 7a  eArg && pTab->az
10c60 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a  ModuleArg[0] );.
10c70 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10c80 33 47 65 74 56 54 61 62 6c 65 28 70 50 61 72 73  3GetVTable(pPars
10c90 65 2d 3e 64 62 2c 20 70 54 61 62 29 20 29 3b 0a  e->db, pTab) );.
10ca0 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
10cb0 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
10cc0 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
10cd0 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
10ce0 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
10cf0 6c 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  les to zero..  *
10d00 2a 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69  *.  ** aConstrai
10d10 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74  nt[].usable is t
10d20 72 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  rue for constrai
10d30 6e 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69  nts where the ri
10d40 67 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69  ght-hand.  ** si
10d50 64 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  de contains only
10d60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
10d70 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66  ables to the lef
10d80 74 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  t of the current
10d90 0a 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e  .  ** table.  In
10da0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66   other words, if
10db0 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
10dc0 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
10dd0 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
10de0 20 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70      column = exp
10df0 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20  r.  **.  ** and 
10e00 77 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e  we are evaluatin
10e10 67 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  g a join, then t
10e20 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e  he constraint on
10e30 20 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a   column is .  **
10e40 20 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61   only valid if a
10e50 6c 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  ll tables refere
10e60 6e 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63  nced in expr occ
10e70 75 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20  ur to the left. 
10e80 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
10e90 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
10ea0 6d 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  mn..  **.  ** Th
10eb0 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d  e aConstraints[]
10ec0 20 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20   array contains 
10ed0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
10ee0 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a  constraints.  **
10ef0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
10f00 74 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79  table.  That way
10f10 20 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f   we only have to
10f20 20 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65   compute it once
10f30 0a 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67  .  ** even thoug
10f40 68 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74  h we might try t
10f50 6f 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20  o pick the best 
10f60 69 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74  index multiple t
10f70 69 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65  imes..  ** For e
10f80 61 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70  ach attempt at p
10f90 69 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c  icking an index,
10fa0 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61   the order of ta
10fb0 62 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a  bles in the.  **
10fc0 20 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64   join might be d
10fd0 69 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68  ifferent so we h
10fe0 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65  ave to recompute
10ff0 20 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67   the usable flag
11000 0a 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e  .  ** each time.
11010 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73  .  */.  pIdxCons
11020 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
11030 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
11040 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
11050 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
11060 20 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e   pUsage = pIdxIn
11070 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55  fo->aConstraintU
11080 73 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  sage;.  for(i=0;
11090 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
110a0 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70  nstraint; i++, p
110b0 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20  IdxCons++){.    
110c0 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54  j = pIdxCons->iT
110d0 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70  ermOffset;.    p
110e0 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a  Term = &pWC->a[j
110f0 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d  ];.    pIdxCons-
11100 3e 75 73 61 62 6c 65 20 3d 20 28 70 54 65 72 6d  >usable = (pTerm
11110 2d 3e 70 72 65 72 65 71 52 69 67 68 74 26 6e 6f  ->prereqRight&no
11120 74 52 65 61 64 79 29 20 3f 20 30 20 3a 20 31 3b  tReady) ? 0 : 1;
11130 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55  .  }.  memset(pU
11140 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sage, 0, sizeof(
11150 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78 49  pUsage[0])*pIdxI
11160 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
11170 29 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  );.  if( pIdxInf
11180 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
11190 53 74 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Str ){.    sqlit
111a0 65 33 5f 66 72 65 65 28 70 49 64 78 49 6e 66 6f  e3_free(pIdxInfo
111b0 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20  ->idxStr);.  }. 
111c0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74   pIdxInfo->idxSt
111d0 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  r = 0;.  pIdxInf
111e0 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20  o->idxNum = 0;. 
111f0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
11200 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30 3b  oFreeIdxStr = 0;
11210 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  .  pIdxInfo->ord
11220 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30  erByConsumed = 0
11230 3b 0a 20 20 2f 2a 20 28 28 64 6f 75 62 6c 65 29  ;.  /* ((double)
11240 32 29 20 49 6e 20 63 61 73 65 20 6f 66 20 53 51  2) In case of SQ
11250 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
11260 4e 47 5f 50 4f 49 4e 54 2e 2e 2e 20 2a 2f 0a 20  NG_POINT... */. 
11270 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
11280 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
11290 45 5f 42 49 47 5f 44 42 4c 20 2f 20 28 28 64 6f  E_BIG_DBL / ((do
112a0 75 62 6c 65 29 32 29 3b 0a 20 20 6e 4f 72 64 65  uble)2);.  nOrde
112b0 72 42 79 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  rBy = pIdxInfo->
112c0 6e 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28 20  nOrderBy;.  if( 
112d0 21 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  !pOrderBy ){.   
112e0 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65   pIdxInfo->nOrde
112f0 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
11300 69 66 28 20 76 74 61 62 42 65 73 74 49 6e 64 65  if( vtabBestInde
11310 78 28 70 50 61 72 73 65 2c 20 70 54 61 62 2c 20  x(pParse, pTab, 
11320 70 49 64 78 49 6e 66 6f 29 20 29 7b 0a 20 20 20  pIdxInfo) ){.   
11330 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
11340 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
11350 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
11360 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
11370 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
11380 72 61 69 6e 74 3b 0a 20 20 66 6f 72 28 69 3d 30  raint;.  for(i=0
11390 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  ; i<pIdxInfo->nC
113a0 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b  onstraint; i++){
113b0 0a 20 20 20 20 69 66 28 20 70 55 73 61 67 65 5b  .    if( pUsage[
113c0 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e 30 20 29  i].argvIndex>0 )
113d0 7b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75  {.      pCost->u
113e0 73 65 64 20 7c 3d 20 70 57 43 2d 3e 61 5b 70 49  sed |= pWC->a[pI
113f0 64 78 43 6f 6e 73 5b 69 5d 2e 69 54 65 72 6d 4f  dxCons[i].iTermO
11400 66 66 73 65 74 5d 2e 70 72 65 72 65 71 52 69 67  ffset].prereqRig
11410 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ht;.    }.  }.. 
11420 20 2f 2a 20 54 68 65 20 63 6f 73 74 20 69 73 20   /* The cost is 
11430 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62  not allowed to b
11440 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51  e larger than SQ
11450 4c 49 54 45 5f 42 49 47 5f 44 42 4c 20 28 74 68  LITE_BIG_DBL (th
11460 65 0a 20 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61  e.  ** inital va
11470 6c 75 65 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73  lue of lowestCos
11480 74 20 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20  t in this loop. 
11490 49 66 20 69 74 20 69 73 2c 20 74 68 65 6e 20 74  If it is, then t
114a0 68 65 0a 20 20 2a 2a 20 28 63 6f 73 74 3c 6c 6f  he.  ** (cost<lo
114b0 77 65 73 74 43 6f 73 74 29 20 74 65 73 74 20 62  westCost) test b
114c0 65 6c 6f 77 20 77 69 6c 6c 20 6e 65 76 65 72 20  elow will never 
114d0 62 65 20 74 72 75 65 2e 0a 20 20 2a 2a 20 0a 20  be true..  ** . 
114e0 20 2a 2a 20 55 73 65 20 22 28 64 6f 75 62 6c 65   ** Use "(double
114f0 29 32 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22  )2" instead of "
11500 32 2e 30 22 20 69 6e 20 63 61 73 65 20 4f 4d 49  2.0" in case OMI
11510 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
11520 20 0a 20 20 2a 2a 20 69 73 20 64 65 66 69 6e 65   .  ** is define
11530 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 53  d..  */.  if( (S
11540 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 28 28  QLITE_BIG_DBL/((
11550 64 6f 75 62 6c 65 29 32 29 29 3c 70 49 64 78 49  double)2))<pIdxI
11560 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
11570 73 74 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d  st ){.    pCost-
11580 3e 72 43 6f 73 74 20 3d 20 28 53 51 4c 49 54 45  >rCost = (SQLITE
11590 5f 42 49 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c  _BIG_DBL/((doubl
115a0 65 29 32 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e)2));.  }else{.
115b0 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
115c0 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74   = pIdxInfo->est
115d0 69 6d 61 74 65 64 43 6f 73 74 3b 0a 20 20 7d 0a  imatedCost;.  }.
115e0 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
115f0 70 56 74 61 62 49 64 78 20 3d 20 70 49 64 78 49  pVtabIdx = pIdxI
11600 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49  nfo;.  if( pIdxI
11610 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
11620 75 6d 65 64 20 29 7b 0a 20 20 20 20 70 43 6f 73  umed ){.    pCos
11630 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  t->plan.wsFlags 
11640 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
11650 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d 3e 70  ;.  }.  pCost->p
11660 6c 61 6e 2e 6e 45 71 20 3d 20 30 3b 0a 20 20 70  lan.nEq = 0;.  p
11670 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42  IdxInfo->nOrderB
11680 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 0a 20  y = nOrderBy;.. 
11690 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20   /* Try to find 
116a0 61 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74  a more efficient
116b0 20 61 63 63 65 73 73 20 70 61 74 74 65 72 6e 20   access pattern 
116c0 62 79 20 75 73 69 6e 67 20 6d 75 6c 74 69 70 6c  by using multipl
116d0 65 20 69 6e 64 65 78 65 73 0a 20 20 2a 2a 20 74  e indexes.  ** t
116e0 6f 20 6f 70 74 69 6d 69 7a 65 20 61 6e 20 4f 52  o optimize an OR
116f0 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74 68   expression with
11700 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  in the WHERE cla
11710 75 73 65 2e 20 0a 20 20 2a 2f 0a 20 20 62 65 73  use. .  */.  bes
11720 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
11730 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
11740 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
11750 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 7d 0a  erBy, pCost);.}.
11760 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
11770 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
11780 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 72 67  LE */../*.** Arg
11790 75 6d 65 6e 74 20 70 49 64 78 20 69 73 20 61 20  ument pIdx is a 
117a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e  pointer to an in
117b0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 74 68  dex structure th
117c0 61 74 20 68 61 73 20 61 6e 20 61 72 72 61 79 20  at has an array 
117d0 6f 66 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4e 44  of.** SQLITE_IND
117e0 45 58 5f 53 41 4d 50 4c 45 53 20 65 76 65 6e 6c  EX_SAMPLES evenl
117f0 79 20 73 70 61 63 65 64 20 73 61 6d 70 6c 65 73  y spaced samples
11800 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 69 6e   of the first in
11810 64 65 78 65 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20  dexed column.** 
11820 73 74 6f 72 65 64 20 69 6e 20 49 6e 64 65 78 2e  stored in Index.
11830 61 53 61 6d 70 6c 65 2e 20 54 68 65 20 64 6f 6d  aSample. The dom
11840 61 69 6e 20 6f 66 20 76 61 6c 75 65 73 20 73 74  ain of values st
11850 6f 72 65 64 20 69 6e 20 73 61 69 64 20 63 6f 6c  ored in said col
11860 75 6d 6e 0a 2a 2a 20 6d 61 79 20 62 65 20 74 68  umn.** may be th
11870 6f 75 67 68 74 20 6f 66 20 61 73 20 64 69 76 69  ought of as divi
11880 64 65 64 20 69 6e 74 6f 20 28 53 51 4c 49 54 45  ded into (SQLITE
11890 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b 31  _INDEX_SAMPLES+1
118a0 29 20 72 65 67 69 6f 6e 73 2e 0a 2a 2a 20 52 65  ) regions..** Re
118b0 67 69 6f 6e 20 30 20 63 6f 6e 74 61 69 6e 73 20  gion 0 contains 
118c0 61 6c 6c 20 76 61 6c 75 65 73 20 73 6d 61 6c 6c  all values small
118d0 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
118e0 74 20 73 61 6d 70 6c 65 20 76 61 6c 75 65 2e 20  t sample value. 
118f0 52 65 67 69 6f 6e 0a 2a 2a 20 31 20 63 6f 6e 74  Region.** 1 cont
11900 61 69 6e 73 20 76 61 6c 75 65 73 20 6c 61 72 67  ains values larg
11910 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
11920 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66   to the value of
11930 20 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c   the first sampl
11940 65 2c 0a 2a 2a 20 62 75 74 20 73 6d 61 6c 6c 65  e,.** but smalle
11950 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75 65  r than the value
11960 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 2e 20   of the second. 
11970 41 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a  And so on..**.**
11980 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
11990 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
119a0 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 20 6f  termines which o
119b0 66 20 74 68 65 20 72 65 67 69 6f 6e 73 20 76 61  f the regions va
119c0 6c 75 65 20 0a 2a 2a 20 70 56 61 6c 20 6c 69 65  lue .** pVal lie
119d0 73 20 69 6e 2c 20 73 65 74 73 20 2a 70 69 52 65  s in, sets *piRe
119e0 67 69 6f 6e 20 74 6f 20 74 68 65 20 72 65 67 69  gion to the regi
119f0 6f 6e 20 69 6e 64 65 78 20 28 61 20 76 61 6c 75  on index (a valu
11a00 65 20 62 65 74 77 65 65 6e 20 30 0a 2a 2a 20 61  e between 0.** a
11a10 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f  nd SQLITE_INDEX_
11a20 53 41 4d 50 4c 45 53 2b 31 2c 20 69 6e 63 6c 75  SAMPLES+1, inclu
11a30 73 69 76 65 29 20 61 6e 64 20 72 65 74 75 72 6e  sive) and return
11a40 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  s SQLITE_OK..** 
11a50 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20 6f 63  Or, if an OOM oc
11a60 63 75 72 73 20 77 68 69 6c 65 20 63 6f 6e 76 65  curs while conve
11a70 72 74 69 6e 67 20 74 65 78 74 20 76 61 6c 75 65  rting text value
11a80 73 20 62 65 74 77 65 65 6e 20 65 6e 63 6f 64 69  s between encodi
11a90 6e 67 73 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  ngs,.** SQLITE_N
11aa0 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64  OMEM is returned
11ab0 20 61 6e 64 20 2a 70 69 52 65 67 69 6f 6e 20 69   and *piRegion i
11ac0 73 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  s undefined..*/.
11ad0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
11ae0 41 42 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69  ABLE_STAT2.stati
11af0 63 20 69 6e 74 20 77 68 65 72 65 52 61 6e 67 65  c int whereRange
11b00 52 65 67 69 6f 6e 28 0a 20 20 50 61 72 73 65 20  Region(.  Parse 
11b10 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
11b20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11b30 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
11b40 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
11b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11b60 20 49 6e 64 65 78 20 74 6f 20 63 6f 6e 73 69 64   Index to consid
11b70 65 72 20 64 6f 6d 61 69 6e 20 6f 66 20 2a 2f 0a  er domain of */.
11b80 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
11b90 2a 70 56 61 6c 2c 20 20 20 20 20 20 20 20 2f 2a  *pVal,        /*
11ba0 20 56 61 6c 75 65 20 74 6f 20 63 6f 6e 73 69 64   Value to consid
11bb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 52  er */.  int *piR
11bc0 65 67 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20  egion           
11bd0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 67 69      /* OUT: Regi
11be0 6f 6e 20 6f 66 20 64 6f 6d 61 69 6e 20 69 6e 20  on of domain in 
11bf0 77 68 69 63 68 20 76 61 6c 75 65 20 6c 69 65 73  which value lies
11c00 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 41 4c 57   */.){.  if( ALW
11c10 41 59 53 28 70 56 61 6c 29 20 29 7b 0a 20 20 20  AYS(pVal) ){.   
11c20 20 49 6e 64 65 78 53 61 6d 70 6c 65 20 2a 61 53   IndexSample *aS
11c30 61 6d 70 6c 65 20 3d 20 70 49 64 78 2d 3e 61 53  ample = pIdx->aS
11c40 61 6d 70 6c 65 3b 0a 20 20 20 20 69 6e 74 20 69  ample;.    int i
11c50 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 65 54   = 0;.    int eT
11c60 79 70 65 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  ype = sqlite3_va
11c70 6c 75 65 5f 74 79 70 65 28 70 56 61 6c 29 3b 0a  lue_type(pVal);.
11c80 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
11c90 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 7c  SQLITE_INTEGER |
11ca0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
11cb0 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 64  FLOAT ){.      d
11cc0 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
11cd0 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 70  3_value_double(p
11ce0 56 61 6c 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  Val);.      for(
11cf0 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e  i=0; i<SQLITE_IN
11d00 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b  DEX_SAMPLES; i++
11d10 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
11d20 53 61 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3d  Sample[i].eType=
11d30 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29 20 63  =SQLITE_NULL ) c
11d40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
11d50 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69 5d 2e   if( aSample[i].
11d60 65 54 79 70 65 3e 3d 53 51 4c 49 54 45 5f 54 45  eType>=SQLITE_TE
11d70 58 54 20 7c 7c 20 61 53 61 6d 70 6c 65 5b 69 5d  XT || aSample[i]
11d80 2e 75 2e 72 3e 72 20 29 20 62 72 65 61 6b 3b 0a  .u.r>r ) break;.
11d90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
11da0 65 7b 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e{ .      sqlite
11db0 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
11dc0 64 62 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  db;.      CollSe
11dd0 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  q *pColl;.      
11de0 63 6f 6e 73 74 20 75 38 20 2a 7a 3b 0a 20 20 20  const u8 *z;.   
11df0 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 20 20 20     int n;..     
11e00 20 2f 2a 20 70 56 61 6c 20 63 6f 6d 65 73 20 66   /* pVal comes f
11e10 72 6f 6d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  rom sqlite3Value
11e20 46 72 6f 6d 45 78 70 72 28 29 20 73 6f 20 74 68  FromExpr() so th
11e30 65 20 74 79 70 65 20 63 61 6e 6e 6f 74 20 62 65  e type cannot be
11e40 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 61   NULL */.      a
11e50 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
11e60 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 65 54 79  LITE_TEXT || eTy
11e70 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20  pe==SQLITE_BLOB 
11e80 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 65 54  );..      if( eT
11e90 79 70 65 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ype==SQLITE_BLOB
11ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 20 3d 20   ){.        z = 
11eb0 28 63 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69  (const u8 *)sqli
11ec0 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 70  te3_value_blob(p
11ed0 56 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 43  Val);.        pC
11ee0 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43  oll = db->pDfltC
11ef0 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 61 73 73  oll;.        ass
11f00 65 72 74 28 20 70 43 6f 6c 6c 2d 3e 65 6e 63 3d  ert( pColl->enc=
11f10 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 29 3b 0a  =SQLITE_UTF8 );.
11f20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11f30 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
11f40 69 74 65 33 47 65 74 43 6f 6c 6c 53 65 71 28 64  ite3GetCollSeq(d
11f50 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
11f60 30 2c 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  0, *pIdx->azColl
11f70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
11f80 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Coll==0 ){.     
11f90 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
11fa0 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
11fb0 20 73 75 63 68 20 63 6f 6c 6c 61 74 69 6f 6e 20   such collation 
11fc0 73 65 71 75 65 6e 63 65 3a 20 25 73 22 2c 0a 20  sequence: %s",. 
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fe0 20 20 20 20 20 20 20 20 20 2a 70 49 64 78 2d 3e           *pIdx->
11ff0 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20  azColl);.       
12000 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12010 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
12020 7d 0a 20 20 20 20 20 20 20 20 7a 20 3d 20 28 63  }.        z = (c
12030 6f 6e 73 74 20 75 38 20 2a 29 73 71 6c 69 74 65  onst u8 *)sqlite
12040 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
12050 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
12060 20 20 20 20 20 20 69 66 28 20 21 7a 20 29 7b 0a        if( !z ){.
12070 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12080 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12090 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
120a0 20 61 73 73 65 72 74 28 20 7a 20 26 26 20 70 43   assert( z && pC
120b0 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
120c0 6d 70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mp );.      }.  
120d0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 56      n = sqlite3V
120e0 61 6c 75 65 42 79 74 65 73 28 70 56 61 6c 2c 20  alueBytes(pVal, 
120f0 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 0a 20 20  pColl->enc);..  
12100 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
12110 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
12120 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
12130 20 20 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20     int r;.      
12140 20 20 69 6e 74 20 65 53 61 6d 70 6c 65 74 79 70    int eSampletyp
12150 65 20 3d 20 61 53 61 6d 70 6c 65 5b 69 5d 2e 65  e = aSample[i].e
12160 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Type;.        if
12170 28 20 65 53 61 6d 70 6c 65 74 79 70 65 3d 3d 53  ( eSampletype==S
12180 51 4c 49 54 45 5f 4e 55 4c 4c 20 7c 7c 20 65 53  QLITE_NULL || eS
12190 61 6d 70 6c 65 74 79 70 65 3c 65 54 79 70 65 20  ampletype<eType 
121a0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
121b0 20 20 20 20 69 66 28 20 28 65 53 61 6d 70 6c 65      if( (eSample
121c0 74 79 70 65 21 3d 65 54 79 70 65 29 20 29 20 62  type!=eType) ) b
121d0 72 65 61 6b 3b 0a 23 69 66 6e 64 65 66 20 53 51  reak;.#ifndef SQ
121e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
121f0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
12200 6c 2d 3e 65 6e 63 21 3d 53 51 4c 49 54 45 5f 55  l->enc!=SQLITE_U
12210 54 46 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TF8 ){.         
12220 20 69 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20   int nSample;.  
12230 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53          char *zS
12240 61 6d 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55  ample = sqlite3U
12250 74 66 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20  tf8to16(.       
12260 20 20 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c         db, pColl
12270 2d 3e 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69  ->enc, aSample[i
12280 5d 2e 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69  ].u.z, aSample[i
12290 5d 2e 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c  ].nByte, &nSampl
122a0 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
122b0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 7a 53           if( !zS
122c0 61 6d 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  ample ){.       
122d0 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
122e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
122f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
12300 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
12310 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
12320 20 20 20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c          r = pCol
12330 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
12340 55 73 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a  User, nSample, z
12350 53 61 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20  Sample, n, z);. 
12360 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12370 44 62 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70  DbFree(db, zSamp
12380 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  le);.        }el
12390 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  se.#endif.      
123a0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 20    {.          r 
123b0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
123c0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61 6d  oll->pUser, aSam
123d0 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61 53  ple[i].nByte, aS
123e0 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e 2c  ample[i].u.z, n,
123f0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   z);.        }. 
12400 20 20 20 20 20 20 20 69 66 28 20 72 3e 30 20 29         if( r>0 )
12410 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12420 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
12430 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 53 51  t( i>=0 && i<=SQ
12440 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
12450 45 53 20 29 3b 0a 20 20 20 20 2a 70 69 52 65 67  ES );.    *piReg
12460 69 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72  ion = i;.  }.  r
12470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
12480 0a 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23  .}.#endif   /* #
12490 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
124a0 42 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a  BLE_STAT2 */../*
124b0 0a 2a 2a 20 49 66 20 65 78 70 72 65 73 73 69 6f  .** If expressio
124c0 6e 20 70 45 78 70 72 20 72 65 70 72 65 73 65 6e  n pExpr represen
124d0 74 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  ts a literal val
124e0 75 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ue, set *pp to p
124f0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 61 6e 20 73 71  oint to.** an sq
12500 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
12510 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
12520 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2c   the same value,
12530 20 77 69 74 68 20 61 66 66 69 6e 69 74 79 0a 2a   with affinity.*
12540 2a 20 61 66 66 20 61 70 70 6c 69 65 64 20 74 6f  * aff applied to
12550 20 69 74 2c 20 62 65 66 6f 72 65 20 72 65 74 75   it, before retu
12560 72 6e 69 6e 67 2e 20 49 74 20 69 73 20 74 68 65  rning. It is the
12570 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
12580 6f 66 20 74 68 65 20 0a 2a 2a 20 63 61 6c 6c 65  of the .** calle
12590 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
125a0 72 65 6c 65 61 73 65 20 74 68 69 73 20 73 74 72  release this str
125b0 75 63 74 75 72 65 20 62 79 20 70 61 73 73 69 6e  ucture by passin
125c0 67 20 69 74 20 74 6f 20 0a 2a 2a 20 73 71 6c 69  g it to .** sqli
125d0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
125e0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
125f0 72 65 6e 74 20 70 61 72 73 65 20 69 73 20 61 20  rent parse is a 
12600 72 65 63 6f 6d 70 69 6c 65 20 28 73 71 6c 69 74  recompile (sqlit
12610 65 33 52 65 70 72 65 70 61 72 65 28 29 29 20 61  e3Reprepare()) a
12620 6e 64 20 70 45 78 70 72 0a 2a 2a 20 69 73 20 61  nd pExpr.** is a
12630 6e 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 74  n SQL variable t
12640 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
12650 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c  s a non-NULL val
12660 75 65 20 62 6f 75 6e 64 20 74 6f 20 69 74 2c 0a  ue bound to it,.
12670 2a 2a 20 63 72 65 61 74 65 20 61 6e 20 73 71 6c  ** create an sql
12680 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63  ite3_value struc
12690 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ture containing 
126a0 74 68 69 73 20 76 61 6c 75 65 2c 20 61 67 61 69  this value, agai
126b0 6e 20 77 69 74 68 0a 2a 2a 20 61 66 66 69 6e 69  n with.** affini
126c0 74 79 20 61 66 66 20 61 70 70 6c 69 65 64 20 74  ty aff applied t
126d0 6f 20 69 74 2c 20 69 6e 73 74 65 61 64 2e 0a 2a  o it, instead..*
126e0 2a 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20  *.** If neither 
126f0 6f 66 20 74 68 65 20 61 62 6f 76 65 20 61 70 70  of the above app
12700 6c 79 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 4e  ly, set *pp to N
12710 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
12720 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
12730 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
12740 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ode. Otherwise, 
12750 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 23 69  SQLITE_OK..*/.#i
12760 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
12770 4c 45 5f 53 54 41 54 32 0a 73 74 61 74 69 63 20  LE_STAT2.static 
12780 69 6e 74 20 76 61 6c 75 65 46 72 6f 6d 45 78 70  int valueFromExp
12790 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
127a0 73 65 2c 20 0a 20 20 45 78 70 72 20 2a 70 45 78  se, .  Expr *pEx
127b0 70 72 2c 20 0a 20 20 75 38 20 61 66 66 2c 20 0a  pr, .  u8 aff, .
127c0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
127d0 2a 2a 70 70 0a 29 7b 0a 20 20 69 66 28 20 28 70  **pp.){.  if( (p
127e0 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 56 41 52  Expr->op==TK_VAR
127f0 49 41 42 4c 45 29 0a 20 20 20 7c 7c 20 28 70 45  IABLE).   || (pE
12800 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52 45 47 49  xpr->op==TK_REGI
12810 53 54 45 52 20 26 26 20 70 45 78 70 72 2d 3e 6f  STER && pExpr->o
12820 70 32 3d 3d 54 4b 5f 56 41 52 49 41 42 4c 45 29  p2==TK_VARIABLE)
12830 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56  .  ){.    int iV
12840 61 72 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ar = pExpr->iCol
12850 75 6d 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  umn;.    sqlite3
12860 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 70  VdbeSetVarmask(p
12870 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 69 56  Parse->pVdbe, iV
12880 61 72 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 73  ar);.    *pp = s
12890 71 6c 69 74 65 33 56 64 62 65 47 65 74 56 61 6c  qlite3VdbeGetVal
128a0 75 65 28 70 50 61 72 73 65 2d 3e 70 52 65 70 72  ue(pParse->pRepr
128b0 65 70 61 72 65 2c 20 69 56 61 72 2c 20 61 66 66  epare, iVar, aff
128c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
128d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
128e0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 61 6c  eturn sqlite3Val
128f0 75 65 46 72 6f 6d 45 78 70 72 28 70 50 61 72 73  ueFromExpr(pPars
12900 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 53 51  e->db, pExpr, SQ
12910 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20  LITE_UTF8, aff, 
12920 70 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  pp);.}.#endif../
12930 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12940 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 65 73  on is used to es
12950 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
12960 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
12970 69 6c 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a  ill be visited.*
12980 2a 20 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e  * by scanning an
12990 20 69 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e   index for a ran
129a0 67 65 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68  ge of values. Th
129b0 65 20 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65  e range may have
129c0 20 61 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75   an upper.** bou
129d0 6e 64 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e  nd, a lower boun
129e0 64 2c 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20  d, or both. The 
129f0 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
12a00 6d 73 20 74 68 61 74 20 73 65 74 20 74 68 65 20  ms that set the 
12a10 75 70 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77  upper.** and low
12a20 65 72 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65  er bounds are re
12a30 70 72 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f  presented by pLo
12a40 77 65 72 20 61 6e 64 20 70 55 70 70 65 72 20 72  wer and pUpper r
12a50 65 73 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72  espectively. For
12a60 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73  .** example, ass
12a70 75 6d 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78  uming that index
12a80 20 70 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a   p is on t1(a):.
12a90 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d  **.**   ... FROM
12aa0 20 74 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20   t1 WHERE a > ? 
12ab0 41 4e 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND a < ? ....**
12ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ad0 20 20 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f      |_____|   |_
12ae0 5f 5f 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20  ____|.**        
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
12b00 20 20 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20           |.**   
12b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b20 20 20 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70    pLower    pUpp
12b30 65 72 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  er.**.** If eith
12b40 65 72 20 6f 66 20 74 68 65 20 75 70 70 65 72 20  er of the upper 
12b50 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69  or lower bound i
12b60 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74  s not present, t
12b70 68 65 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73  hen NULL is pass
12b80 65 64 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f  ed in.** place o
12b90 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  f the correspond
12ba0 69 6e 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a  ing WhereTerm..*
12bb0 2a 0a 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72  *.** The nEq par
12bc0 61 6d 65 74 65 72 20 69 73 20 70 61 73 73 65 64  ameter is passed
12bd0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
12be0 65 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73  e index column s
12bf0 75 62 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a  ubject to the.**
12c00 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
12c10 74 2e 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e  t. Or, equivalen
12c20 74 6c 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20  tly, the number 
12c30 6f 66 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  of equality cons
12c40 74 72 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d  traints.** optim
12c50 69 7a 65 64 20 62 79 20 74 68 65 20 70 72 6f 70  ized by the prop
12c60 6f 73 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e  osed index scan.
12c70 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73   For example, as
12c80 73 75 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69  suming index p i
12c90 73 0a 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29  s.** on t1(a, b)
12ca0 2c 20 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75  , and the SQL qu
12cb0 65 72 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ery is:.**.**   
12cc0 2e 2e 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52  ... FROM t1 WHER
12cd0 45 20 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20  E a = ? AND b > 
12ce0 3f 20 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a  ? AND b < ? ....
12cf0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73  **.** then nEq s
12d00 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
12d10 74 68 65 20 76 61 6c 75 65 20 31 20 28 61 73 20  the value 1 (as 
12d20 74 68 65 20 72 61 6e 67 65 20 72 65 73 74 72 69  the range restri
12d30 63 74 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20  cted column,.** 
12d40 62 2c 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  b, is the second
12d50 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
12d60 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e  n of the index).
12d70 20 4f 72 2c 20 69 66 20 74 68 65 20 71 75 65 72   Or, if the quer
12d80 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
12d90 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
12da0 61 20 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20  a > ? AND a < ? 
12db0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e  ....**.** then n
12dc0 45 71 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73  Eq should be pas
12dd0 73 65 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sed 0..**.** The
12de0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
12df0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  is an integer be
12e00 74 77 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c  tween 1 and 100,
12e10 20 69 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65   inclusive. A re
12e20 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  turn.** value of
12e30 20 31 20 69 6e 64 69 63 61 74 65 73 20 74 68 61   1 indicates tha
12e40 74 20 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72  t the proposed r
12e50 61 6e 67 65 20 73 63 61 6e 20 69 73 20 65 78 70  ange scan is exp
12e60 65 63 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a  ected to visit.*
12e70 2a 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20  * approximately 
12e80 31 2f 31 30 30 74 68 20 28 31 25 29 20 6f 66 20  1/100th (1%) of 
12e90 74 68 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65  the rows selecte
12ea0 64 20 62 79 20 74 68 65 20 6e 45 71 20 65 71 75  d by the nEq equ
12eb0 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
12ec0 69 6e 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41  ints (if any). A
12ed0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
12ee0 20 31 30 30 20 69 6e 64 69 63 61 74 65 73 20 74   100 indicates t
12ef0 68 61 74 20 69 74 20 69 73 20 65 78 70 65 63 74  hat it is expect
12f00 65 64 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72  ed.** that the r
12f10 61 6e 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76  ange scan will v
12f20 69 73 69 74 20 65 76 65 72 79 20 72 6f 77 20 28  isit every row (
12f30 31 30 30 25 29 20 73 65 6c 65 63 74 65 64 20 62  100%) selected b
12f40 79 20 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a  y the equality.*
12f50 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a  * constraints..*
12f60 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65  *.** In the abse
12f70 6e 63 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74  nce of sqlite_st
12f80 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61  at2 ANALYZE data
12f90 2c 20 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65  , each range ine
12fa0 71 75 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63  quality.** reduc
12fb0 65 73 20 74 68 65 20 73 65 61 72 63 68 20 73 70  es the search sp
12fc0 61 63 65 20 62 79 20 32 2f 33 72 64 73 2e 20 20  ace by 2/3rds.  
12fd0 48 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63  Hence a single c
12fe0 6f 6e 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a  onstraint (x>?).
12ff0 2a 2a 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20  ** results in a 
13000 72 65 74 75 72 6e 20 6f 66 20 33 33 20 61 6e 64  return of 33 and
13010 20 61 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61   a range constra
13020 69 6e 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f  int (x>? AND x<?
13030 29 20 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20  ) results.** in 
13040 61 20 72 65 74 75 72 6e 20 6f 66 20 31 31 2e 0a  a return of 11..
13050 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  */.static int wh
13060 65 72 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28  ereRangeScanEst(
13070 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
13080 2c 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69  ,       /* Parsi
13090 6e 67 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61  ng & code genera
130a0 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ting context */.
130b0 20 20 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20    Index *p,     
130c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
130d0 64 65 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  dex containing t
130e0 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65  he range-compare
130f0 64 20 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f  d column; "x" */
13100 0a 20 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20  .  int nEq,     
13110 20 20 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78          /* index
13120 20 69 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20   into p->aCol[] 
13130 6f 66 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d  of the range-com
13140 70 61 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  pared column */.
13150 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f    WhereTerm *pLo
13160 77 65 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer,   /* Lower 
13170 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e  bound on the ran
13180 67 65 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20  ge. ex: "x>123" 
13190 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
131a0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55  .  WhereTerm *pU
131b0 70 70 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72  pper,   /* Upper
131c0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61   bound on the ra
131d0 6e 67 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22  nge. ex: "x<455"
131e0 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a   Might be NULL *
131f0 2f 0a 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20  /.  int *piEst  
13200 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
13210 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
13220 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
13230 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65  QLITE_OK;..#ifde
13240 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
13250 53 54 41 54 32 0a 0a 20 20 69 66 28 20 6e 45 71  STAT2..  if( nEq
13260 3d 3d 30 20 26 26 20 70 2d 3e 61 53 61 6d 70 6c  ==0 && p->aSampl
13270 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
13280 5f 76 61 6c 75 65 20 2a 70 4c 6f 77 65 72 56 61  _value *pLowerVa
13290 6c 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  l = 0;.    sqlit
132a0 65 33 5f 76 61 6c 75 65 20 2a 70 55 70 70 65 72  e3_value *pUpper
132b0 56 61 6c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Val = 0;.    int
132c0 20 69 45 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iEst;.    int i
132d0 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  Lower = 0;.    i
132e0 6e 74 20 69 55 70 70 65 72 20 3d 20 53 51 4c 49  nt iUpper = SQLI
132f0 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
13300 3b 0a 20 20 20 20 75 38 20 61 66 66 20 3d 20 70  ;.    u8 aff = p
13310 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70  ->pTable->aCol[p
13320 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d 5d 2e 61  ->aiColumn[0]].a
13330 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66  ffinity;..    if
13340 28 20 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20  ( pLower ){.    
13350 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
13360 70 4c 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70  pLower->pExpr->p
13370 52 69 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20  Right;.      rc 
13380 3d 20 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28  = valueFromExpr(
13390 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
133a0 66 66 2c 20 26 70 4c 6f 77 65 72 56 61 6c 29 3b  ff, &pLowerVal);
133b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
133c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
133d0 70 55 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20  pUpper ){.      
133e0 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55  Expr *pExpr = pU
133f0 70 70 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  pper->pExpr->pRi
13400 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
13410 76 61 6c 75 65 46 72 6f 6d 45 78 70 72 28 70 50  valueFromExpr(pP
13420 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 66 66  arse, pExpr, aff
13430 2c 20 26 70 55 70 70 65 72 56 61 6c 29 3b 0a 20  , &pUpperVal);. 
13440 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
13450 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
13460 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20  pLowerVal==0 && 
13470 70 55 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b  pUpperVal==0) ){
13480 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
13490 6c 75 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61  lueFree(pLowerVa
134a0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
134b0 33 56 61 6c 75 65 46 72 65 65 28 70 55 70 70 65  3ValueFree(pUppe
134c0 72 56 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74  rVal);.      got
134d0 6f 20 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c  o range_est_fall
134e0 62 61 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  back;.    }else 
134f0 69 66 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30  if( pLowerVal==0
13500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
13510 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
13520 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65  pParse, p, pUppe
13530 72 56 61 6c 2c 20 26 69 55 70 70 65 72 29 3b 0a  rVal, &iUpper);.
13540 20 20 20 20 20 20 69 66 28 20 70 4c 6f 77 65 72        if( pLower
13550 20 29 20 69 4c 6f 77 65 72 20 3d 20 69 55 70 70   ) iLower = iUpp
13560 65 72 2f 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20  er/2;.    }else 
13570 69 66 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30  if( pUpperVal==0
13580 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   ){.      rc = w
13590 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28  hereRangeRegion(
135a0 70 50 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65  pParse, p, pLowe
135b0 72 56 61 6c 2c 20 26 69 4c 6f 77 65 72 29 3b 0a  rVal, &iLower);.
135c0 20 20 20 20 20 20 69 66 28 20 70 55 70 70 65 72        if( pUpper
135d0 20 29 20 69 55 70 70 65 72 20 3d 20 28 69 4c 6f   ) iUpper = (iLo
135e0 77 65 72 20 2b 20 53 51 4c 49 54 45 5f 49 4e 44  wer + SQLITE_IND
135f0 45 58 5f 53 41 4d 50 4c 45 53 20 2b 20 31 29 2f  EX_SAMPLES + 1)/
13600 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
13610 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52 61      rc = whereRa
13620 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73 65  ngeRegion(pParse
13630 2c 20 70 2c 20 70 55 70 70 65 72 56 61 6c 2c 20  , p, pUpperVal, 
13640 26 69 55 70 70 65 72 29 3b 0a 20 20 20 20 20 20  &iUpper);.      
13650 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
13660 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
13670 3d 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69  = whereRangeRegi
13680 6f 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4c  on(pParse, p, pL
13690 6f 77 65 72 56 61 6c 2c 20 26 69 4c 6f 77 65 72  owerVal, &iLower
136a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
136b0 0a 0a 20 20 20 20 69 45 73 74 20 3d 20 69 55 70  ..    iEst = iUp
136c0 70 65 72 20 2d 20 69 4c 6f 77 65 72 3b 0a 20 20  per - iLower;.  
136d0 20 20 74 65 73 74 63 61 73 65 28 20 69 45 73 74    testcase( iEst
136e0 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53  ==SQLITE_INDEX_S
136f0 41 4d 50 4c 45 53 20 29 3b 0a 20 20 20 20 61 73  AMPLES );.    as
13700 73 65 72 74 28 20 69 45 73 74 3c 3d 53 51 4c 49  sert( iEst<=SQLI
13710 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53  TE_INDEX_SAMPLES
13720 20 29 3b 0a 20 20 20 20 69 66 28 20 69 45 73 74   );.    if( iEst
13730 3c 31 20 29 7b 0a 20 20 20 20 20 20 69 45 73 74  <1 ){.      iEst
13740 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
13750 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
13760 65 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20 20  e(pLowerVal);.  
13770 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
13780 65 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a 20  ee(pUpperVal);. 
13790 20 20 20 2a 70 69 45 73 74 20 3d 20 28 69 45 73     *piEst = (iEs
137a0 74 20 2a 20 31 30 30 29 2f 53 51 4c 49 54 45 5f  t * 100)/SQLITE_
137b0 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20  INDEX_SAMPLES;. 
137c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
137d0 7d 0a 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c  }.range_est_fall
137e0 62 61 63 6b 3a 0a 23 65 6c 73 65 0a 20 20 55 4e  back:.#else.  UN
137f0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
13800 50 61 72 73 65 29 3b 0a 20 20 55 4e 55 53 45 44  Parse);.  UNUSED
13810 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
13820 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
13830 52 28 6e 45 71 29 3b 0a 23 65 6e 64 69 66 0a 20  R(nEq);.#endif. 
13840 20 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20   assert( pLower 
13850 7c 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 69  || pUpper );.  i
13860 66 28 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70  f( pLower && pUp
13870 70 65 72 20 29 7b 0a 20 20 20 20 2a 70 69 45 73  per ){.    *piEs
13880 74 20 3d 20 31 31 3b 0a 20 20 7d 65 6c 73 65 7b  t = 11;.  }else{
13890 0a 20 20 20 20 2a 70 69 45 73 74 20 3d 20 33 33  .    *piEst = 33
138a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
138b0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  c;.}.../*.** Fin
138c0 64 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  d the query plan
138d0 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61   for accessing a
138e0 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
138f0 65 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  e.  Write the.**
13900 20 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e   best query plan
13910 20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e   and its cost in
13920 74 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74  to the WhereCost
13930 20 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64   object supplied
13940 20 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20   as the.** last 
13950 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
13960 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
13970 20 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65   plan wins.  The
13980 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69   cost is an esti
13990 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75  mate of the amou
139a0 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64  nt of.** CPU and
139b0 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74   disk I/O need t
139c0 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65  o process the re
139d0 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20  quest using the 
139e0 73 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a  selected plan..*
139f0 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69  * Factors that i
13a00 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e  nfluence cost in
13a10 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  clude:.**.**    
13a20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64  *  The estimated
13a30 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
13a40 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
13a50 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a  rieved.  (The.**
13a60 20 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65         fewer the
13a70 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20   better.).**.** 
13a80 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72     *  Whether or
13a90 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73   not sorting mus
13aa0 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20  t occur..**.**  
13ab0 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
13ac0 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62  not there must b
13ad0 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75  e separate looku
13ae0 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ps in the.**    
13af0 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20     index and in 
13b00 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a  the main table..
13b10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77  **.** If there w
13b20 61 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  as an INDEXED BY
13b30 20 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70   clause (pSrc->p
13b40 49 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20  Index) attached 
13b50 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a  to the table in.
13b60 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
13b70 6d 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20  ment, then this 
13b80 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f  function only co
13b90 6e 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73  nsiders plans us
13ba0 69 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65  ing the .** name
13bb0 64 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73  d index. If no s
13bc0 75 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  uch plan is foun
13bd0 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
13be0 72 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20  rned cost is.** 
13bf0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20  SQLITE_BIG_DBL. 
13c00 49 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75  If a plan is fou
13c10 6e 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65  nd that uses the
13c20 20 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a   named index, .*
13c30 2a 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20  * then the cost 
13c40 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e  is calculated in
13c50 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a   the usual way..
13c60 2a 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49  **.** If a NOT I
13c70 4e 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70  NDEXED clause (p
13c80 53 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21  Src->notIndexed!
13c90 3d 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64  =0) was attached
13ca0 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a   to the table .*
13cb0 2a 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  * in the SELECT 
13cc0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20  statement, then 
13cd0 6e 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63  no indexes are c
13ce0 6f 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76  onsidered. Howev
13cf0 65 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65  er, the .** sele
13d00 63 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74  cted plan may st
13d10 69 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61  ill take advanta
13d20 67 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73  ge of the tables
13d30 20 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a   built-in rowid.
13d40 2a 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  ** index..*/.sta
13d50 74 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72  tic void bestBtr
13d60 65 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  eeIndex(.  Parse
13d70 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
13d80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
13d90 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
13da0 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
13db0 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
13dc0 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
13dd0 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
13de0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
13df0 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
13e00 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
13e10 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
13e20 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
13e30 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
13e40 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
13e50 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
13e60 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
13e70 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
13e80 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42    /* The ORDER B
13e90 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68  Y clause */.  Wh
13ea0 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20  ereCost *pCost  
13eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
13ec0 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70  est cost query p
13ed0 6c 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lan */.){.  int 
13ee0 69 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75  iCur = pSrc->iCu
13ef0 72 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63  rsor;   /* The c
13f00 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62  ursor of the tab
13f10 6c 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  le to be accesse
13f20 64 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50  d */.  Index *pP
13f30 72 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20  robe;           
13f40 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77     /* An index w
13f50 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
13f60 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
13f70 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
13f80 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72    /* Copy of pPr
13f90 6f 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72  obe, or zero for
13fa0 20 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20   IPK index */.  
13fb0 69 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20  int eqTermMask; 
13fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
13fd0 75 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76  urrent mask of v
13fe0 61 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70  alid equality op
13ff0 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
14000 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20   idxEqTermMask; 
14010 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14020 78 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  x mask of valid 
14030 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
14040 72 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50  rs */.  Index sP
14050 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
14060 20 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e      /* A fake in
14070 64 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  dex object for t
14080 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a  he primary key *
14090 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
140a0 20 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20   aiRowEstPk[2]; 
140b0 2f 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b  /* The aiRowEst[
140c0 5d 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  ] value for the 
140d0 73 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  sPk index */.  i
140e0 6e 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20  nt aiColumnPk = 
140f0 2d 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  -1;        /* Th
14100 65 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75  e aColumn[] valu
14110 65 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e  e for the sPk in
14120 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46  dex */.  int wsF
14130 6c 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  lagMask;        
14140 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20       /* Allowed 
14150 66 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e  flags in pCost->
14160 70 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a  plan.wsFlag */..
14170 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
14180 74 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f  the cost to a wo
14190 72 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a  rst-case value *
141a0 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74  /.  memset(pCost
141b0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f  , 0, sizeof(*pCo
141c0 73 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72  st));.  pCost->r
141d0 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
141e0 47 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20  G_DBL;..  /* If 
141f0 74 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69  the pSrc table i
14200 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c  s the right tabl
14210 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
14220 20 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74   then we may not
14230 0a 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64  .  ** use an ind
14240 65 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53  ex to satisfy IS
14250 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
14260 73 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e  s on that table.
14270 20 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62    This is.  ** b
14280 65 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d  ecause columns m
14290 69 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e  ight end up bein
142a0 67 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61  g NULL if the ta
142b0 62 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  ble does not mat
142c0 63 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63  ch -.  ** a circ
142d0 75 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74  umstance which t
142e0 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20  he index cannot 
142f0 68 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72  help us discover
14300 2e 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e  .  Ticket #2177.
14310 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63  .  */.  if( pSrc
14320 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ->jointype & JT_
14330 4c 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45  LEFT ){.    idxE
14340 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45  qTermMask = WO_E
14350 51 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65  Q|WO_IN;.  }else
14360 7b 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d  {.    idxEqTermM
14370 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49  ask = WO_EQ|WO_I
14380 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d  N|WO_ISNULL;.  }
14390 0a 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49  ..  if( pSrc->pI
143a0 6e 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41  ndex ){.    /* A
143b0 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  n INDEXED BY cla
143c0 75 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20  use specifies a 
143d0 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78  particular index
143e0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70   to use */.    p
143f0 49 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70  Idx = pProbe = p
14400 53 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  Src->pIndex;.   
14410 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28   wsFlagMask = ~(
14420 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
14430 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
14440 29 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73  );.    eqTermMas
14450 6b 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73  k = idxEqTermMas
14460 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  k;.  }else{.    
14470 2f 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49  /* There is no I
14480 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65  NDEXED BY clause
14490 2e 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65  .  Create a fake
144a0 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f   Index object to
144b0 0a 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e  .    ** represen
144c0 74 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  t the primary ke
144d0 79 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  y */.    Index *
144e0 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
144f0 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74         /* Any ot
14500 68 65 72 20 69 6e 64 65 78 20 6f 6e 20 74 68 65  her index on the
14510 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65   table */.    me
14520 6d 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69  mset(&sPk, 0, si
14530 7a 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20  zeof(Index));.  
14540 20 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20    sPk.nColumn = 
14550 31 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c  1;.    sPk.aiCol
14560 75 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50  umn = &aiColumnP
14570 6b 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77  k;.    sPk.aiRow
14580 45 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b  Est = aiRowEstPk
14590 3b 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b  ;.    aiRowEstPk
145a0 5b 31 5d 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b  [1] = 1;.    sPk
145b0 2e 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65  .onError = OE_Re
145c0 70 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70  place;.    sPk.p
145d0 54 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54  Table = pSrc->pT
145e0 61 62 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d  ab;.    pFirst =
145f0 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
14600 64 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72  dex;.    if( pSr
14610 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30  c->notIndexed==0
14620 20 29 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e   ){.      sPk.pN
14630 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
14640 20 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61    }.    /* The a
14650 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 69 73 20  iRowEstPk[0] is 
14660 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74  an estimate of t
14670 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
14680 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20  of rows in the. 
14690 20 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 47 65     ** table.  Ge
146a0 74 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  t this informati
146b0 6f 6e 20 66 72 6f 6d 20 74 68 65 20 41 4e 41 4c  on from the ANAL
146c0 59 5a 45 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  YZE information 
146d0 69 66 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20  if it is.    ** 
146e0 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 6e  available.  If n
146f0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 73  ot available, as
14700 73 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 31  sume the table 1
14710 20 6d 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 69 6e   million rows in
14720 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   size..    */.  
14730 20 20 69 66 28 20 70 46 69 72 73 74 20 29 7b 0a    if( pFirst ){.
14740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
14750 69 72 73 74 2d 3e 61 69 52 6f 77 45 73 74 21 3d  irst->aiRowEst!=
14760 30 20 29 3b 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  0 ); /* Allocate
14770 64 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  d together with 
14780 70 46 69 72 73 74 20 2a 2f 0a 20 20 20 20 20 20  pFirst */.      
14790 61 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20  aiRowEstPk[0] = 
147a0 70 46 69 72 73 74 2d 3e 61 69 52 6f 77 45 73 74  pFirst->aiRowEst
147b0 5b 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  [0];.    }else{.
147c0 20 20 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b        aiRowEstPk
147d0 5b 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20  [0] = 1000000;. 
147e0 20 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20     }.    pProbe 
147f0 3d 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c  = &sPk;.    wsFl
14800 61 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20  agMask = ~(.    
14810 20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e      WHERE_COLUMN
14820 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
14830 5f 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _EQ|WHERE_COLUMN
14840 5f 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55  _NULL|WHERE_COLU
14850 4d 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a  MN_RANGE.    );.
14860 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d      eqTermMask =
14870 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20   WO_EQ|WO_IN;.  
14880 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a    pIdx = 0;.  }.
14890 0a 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  .  /* Loop over 
148a0 61 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b  all indices look
148b0 69 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74  ing for the best
148c0 20 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f   one to use.  */
148d0 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b  .  for(; pProbe;
148e0 20 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72   pIdx=pProbe=pPr
148f0 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  obe->pNext){.   
14900 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
14910 69 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f  int * const aiRo
14920 77 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61  wEst = pProbe->a
14930 69 52 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75  iRowEst;.    dou
14940 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20  ble cost;       
14950 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74           /* Cost
14960 20 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65   of using pProbe
14970 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e   */.    double n
14980 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  Row;            
14990 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
149a0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
149b0 69 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  in result set */
149c0 0a 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20  .    int rev;   
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149e0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e   /* True to scan
149f0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
14a00 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46  r */.    int wsF
14a10 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69  lags = 0;.    Bi
14a20 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a  tmask used = 0;.
14a30 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  .    /* The foll
14a40 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20  owing variables 
14a50 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61  are populated ba
14a60 73 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65  sed on the prope
14a70 72 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  rties of.    ** 
14a80 73 63 61 6e 20 62 65 69 6e 67 20 65 76 61 6c 75  scan being evalu
14a90 61 74 65 64 2e 20 54 68 65 79 20 61 72 65 20 74  ated. They are t
14aa0 68 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65  hen used to dete
14ab0 72 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63 74  rmine the expect
14ac0 65 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61  ed.    ** cost a
14ad0 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  nd number of row
14ae0 73 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  s returned..    
14af0 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20  **.    **  nEq: 
14b00 0a 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65  .    **    Numbe
14b10 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65  r of equality te
14b20 72 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20  rms that can be 
14b30 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e  implemented usin
14b40 67 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20  g the index..   
14b50 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d   **.    **  nInM
14b60 75 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20  ul:  .    **    
14b70 54 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69  The "in-multipli
14b80 65 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20  er". This is an 
14b90 65 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20  estimate of how 
14ba0 6d 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74  many seek operat
14bb0 69 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20  ions .    **    
14bc0 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66  SQLite must perf
14bd0 6f 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78  orm on the index
14be0 20 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f   in question. Fo
14bf0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
14c00 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45  e .    **    WHE
14c10 52 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20  RE clause is:.  
14c20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
14c30 20 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20   WHERE a IN (1, 
14c40 32 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28  2, 3) AND b IN (
14c50 34 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a  4, 5, 6).    **.
14c60 20 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65      **    SQLite
14c70 20 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20   must perform 9 
14c80 6c 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e  lookups on an in
14c90 64 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73  dex on (a, b), s
14ca0 6f 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20  o nInMul is .   
14cb0 20 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e   **    set to 9.
14cc0 20 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20   Given the same 
14cd0 73 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65  schema and eithe
14ce0 72 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  r of the followi
14cf0 6e 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a  ng WHERE .    **
14d00 20 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20      clauses:.   
14d10 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
14d20 57 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20  WHERE a =  1.   
14d30 20 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61   **      WHERE a
14d40 20 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20   >= 2.    **.   
14d50 20 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73   **    nInMul is
14d60 20 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a   set to 1..    *
14d70 2a 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74  *.    **    If t
14d80 68 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48  here exists a WH
14d90 45 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ERE term of the 
14da0 66 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45  form "x IN (SELE
14db0 43 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a  CT ...)", then .
14dc0 20 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75      **    the su
14dd0 62 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75  b-select is assu
14de0 6d 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35  med to return 25
14df0 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75   rows for the pu
14e00 72 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a  rposes of .    *
14e10 2a 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67  *    determining
14e20 20 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a   nInMul..    **.
14e30 20 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20      **  bInEst: 
14e40 20 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20   .    **    Set 
14e50 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65  to true if there
14e60 20 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   was at least on
14e70 65 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20  e "x IN (SELECT 
14e80 2e 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20  ...)" term used 
14e90 0a 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65  .    **    in de
14ea0 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61  termining the va
14eb0 6c 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20  lue of nInMul.. 
14ec0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 42     **.    **  nB
14ed0 6f 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20  ound:.    **    
14ee0 41 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74  An estimate on t
14ef0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65  he amount of the
14f00 20 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74   table that must
14f10 20 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41   be searched.  A
14f20 0a 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65  .    **    value
14f30 20 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68   of 100 means th
14f40 65 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69  e entire table i
14f50 73 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e  s searched.  Ran
14f60 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ge constraints. 
14f70 20 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72     **    might r
14f80 65 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20  educe this to a 
14f90 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20  value less than 
14fa0 31 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  100 to indicate 
14fb0 74 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a  that only.    **
14fc0 20 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f      a fraction o
14fd0 66 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64  f the table need
14fe0 73 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e  s searching.  In
14ff0 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a   the absence of.
15000 20 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65      **    sqlite
15010 5f 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64  _stat2 ANALYZE d
15020 61 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e  ata, a single in
15030 65 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73  equality reduces
15040 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20   the search.    
15050 2a 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31  **    space to 1
15060 2f 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61  /3rd its origina
15070 6c 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78  l size.  So an x
15080 3e 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65  >? constraint re
15090 64 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20  duces.    **    
150a0 6e 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20 54  nBound to 33.  T
150b0 77 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  wo constraints (
150c0 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64  x>? AND x<?) red
150d0 75 63 65 20 6e 42 6f 75 6e 64 20 74 6f 20 31 31  uce nBound to 11
150e0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
150f0 20 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a   bSort:   .    *
15100 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72  *    Boolean. Tr
15110 75 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ue if there is a
15120 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  n ORDER BY claus
15130 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  e that will requ
15140 69 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20  ire an .    **  
15150 20 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20    external sort 
15160 28 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74  (i.e. scanning t
15170 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65  he index being e
15180 76 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f  valuated will no
15190 74 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72  t .    **    cor
151a0 72 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63  rectly order rec
151b0 6f 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20  ords)..    **.  
151c0 20 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a    **  bLookup: .
151d0 20 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61      **    Boolea
151e0 6e 2e 20 54 72 75 65 20 69 66 20 66 6f 72 20 65  n. True if for e
151f0 61 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 20  ach index entry 
15200 76 69 73 69 74 65 64 20 61 20 6c 6f 6f 6b 75 70  visited a lookup
15210 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   on the .    ** 
15220 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
15230 20 74 61 62 6c 65 20 62 2d 74 72 65 65 20 69 73   table b-tree is
15240 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
15250 69 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20  is always false 
15260 0a 20 20 20 20 2a 2a 20 20 20 20 66 6f 72 20 74  .    **    for t
15270 68 65 20 72 6f 77 69 64 20 69 6e 64 65 78 2e 20  he rowid index. 
15280 46 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65  For other indexe
15290 73 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e  s, it is true un
152a0 6c 65 73 73 20 61 6c 6c 20 74 68 65 20 0a 20 20  less all the .  
152b0 20 20 2a 2a 20 20 20 20 63 6f 6c 75 6d 6e 73 20    **    columns 
152c0 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65  of the table use
152d0 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
152e0 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72  statement are pr
152f0 65 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a  esent in .    **
15300 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 28 73      the index (s
15310 75 63 68 20 61 6e 20 69 6e 64 65 78 20 69 73 20  uch an index is 
15320 73 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69  sometimes descri
15330 62 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e  bed as a coverin
15340 67 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a  g index)..    **
15350 20 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c      For example,
15360 20 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78   given the index
15370 20 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20   on (a, b), the 
15380 73 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f  second of the fo
15390 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20  llowing .    ** 
153a0 20 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72     two queries r
153b0 65 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d  equires table b-
153c0 74 72 65 65 20 6c 6f 6f 6b 75 70 73 2c 20 62 75  tree lookups, bu
153d0 74 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73  t the first does
153e0 20 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   not..    **.   
153f0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
15400 53 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46  SELECT a, b    F
15410 52 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20  ROM tbl WHERE a 
15420 3d 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20  = 1;.    **     
15430 20 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61          SELECT a
15440 2c 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20  , b, c FROM tbl 
15450 57 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20  WHERE a = 1;.   
15460 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b   */.    int nEq;
15470 0a 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20  .    int bInEst 
15480 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e  = 0;.    int nIn
15490 4d 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  Mul = 1;.    int
154a0 20 6e 42 6f 75 6e 64 20 3d 20 31 30 30 3b 0a 20   nBound = 100;. 
154b0 20 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30     int bSort = 0
154c0 3b 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75  ;.    int bLooku
154d0 70 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 44  p = 0;..    /* D
154e0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
154f0 75 65 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e  ues of nEq and n
15500 49 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72  InMul */.    for
15510 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f  (nEq=0; nEq<pPro
15520 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71  be->nColumn; nEq
15530 2b 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  ++){.      Where
15540 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
15550 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
15560 6c 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  le term of the W
15570 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
15580 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72       int j = pPr
15590 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45  obe->aiColumn[nE
155a0 71 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  q];.      pTerm 
155b0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
155c0 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
155d0 79 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70  y, eqTermMask, p
155e0 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Idx);.      if( 
155f0 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b  pTerm==0 ) break
15600 3b 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20  ;.      wsFlags 
15610 7c 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  |= (WHERE_COLUMN
15620 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
15630 45 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  EQ);.      if( p
15640 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
15650 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
15660 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
15670 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
15680 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c         wsFlags |
15690 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  = WHERE_COLUMN_I
156a0 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45  N;.        if( E
156b0 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
156c0 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
156d0 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ct) ){.         
156e0 20 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20   nInMul *= 25;. 
156f0 20 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20           bInEst 
15700 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
15710 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e  se if( pExpr->x.
15720 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
15730 20 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78     nInMul *= pEx
15740 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78  pr->x.pList->nEx
15750 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  pr + 1;.        
15760 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
15770 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
15780 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29  or & WO_ISNULL )
15790 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
157a0 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
157b0 4e 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  N_NULL;.      }.
157c0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
157d0 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
157e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
157f0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
15800 6c 75 65 20 6f 66 20 6e 42 6f 75 6e 64 2e 20 2a  lue of nBound. *
15810 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50  /.    if( nEq<pP
15820 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
15830 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
15840 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
15850 6e 45 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  nEq];.      if( 
15860 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
15870 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
15880 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f   WO_LT|WO_LE|WO_
15890 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20  GT|WO_GE, pIdx) 
158a0 29 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65  ){.        Where
158b0 54 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e  Term *pTop = fin
158c0 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
158d0 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
158e0 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29  _LT|WO_LE, pIdx)
158f0 3b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  ;.        WhereT
15900 65 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64  erm *pBtm = find
15910 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
15920 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
15930 47 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b  GT|WO_GE, pIdx);
15940 0a 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61  .        whereRa
15950 6e 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73  ngeScanEst(pPars
15960 65 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20  e, pProbe, nEq, 
15970 70 42 74 6d 2c 20 70 54 6f 70 2c 20 26 6e 42 6f  pBtm, pTop, &nBo
15980 75 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66  und);.        if
15990 28 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20  ( pTop ){.      
159a0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
159b0 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a  HERE_TOP_LIMIT;.
159c0 20 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c            used |
159d0 3d 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69  = pTop->prereqRi
159e0 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ght;.        }. 
159f0 20 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20         if( pBtm 
15a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46  ){.          wsF
15a10 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54  lags |= WHERE_BT
15a20 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20  M_LIMIT;.       
15a30 20 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d     used |= pBtm-
15a40 3e 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20  >prereqRight;.  
15a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15a60 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52  wsFlags |= (WHER
15a70 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57  E_COLUMN_RANGE|W
15a80 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
15a90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15aa0 65 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d  else if( pProbe-
15ab0 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
15ac0 65 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63  e ){.      testc
15ad0 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
15ae0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29  HERE_COLUMN_IN )
15af0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
15b00 28 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  ( wsFlags & WHER
15b10 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b  E_COLUMN_NULL );
15b20 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c  .      if( (wsFl
15b30 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
15b40 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
15b50 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b  UMN_NULL))==0 ){
15b60 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
15b70 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45   |= WHERE_UNIQUE
15b80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15b90 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
15ba0 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
15bb0 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69  clause and the i
15bc0 6e 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69  ndex being consi
15bd0 64 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a  dered will.    *
15be0 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e  * naturally scan
15bf0 20 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71   rows in the req
15c00 75 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74  uired order, set
15c10 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
15c20 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e   flags.    ** in
15c30 20 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77   wsFlags. Otherw
15c40 69 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73  ise, if there is
15c50 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   an ORDER BY cla
15c60 75 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65  use but the inde
15c70 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63  x.    ** will sc
15c80 61 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66  an rows in a dif
15c90 66 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65  ferent order, se
15ca0 74 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69  t the bSort vari
15cb0 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  able.  */.    if
15cc0 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20  ( pOrderBy ){.  
15cd0 20 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73      if( (wsFlags
15ce0 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   & (WHERE_COLUMN
15cf0 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  _IN|WHERE_COLUMN
15d00 5f 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20  _NULL))==0.     
15d10 20 20 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49     && isSortingI
15d20 6e 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d  ndex(pParse,pWC-
15d30 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65  >pMaskSet,pProbe
15d40 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e  ,iCur,pOrderBy,n
15d50 45 71 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29  Eq,&rev).      )
15d60 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67  {.        wsFlag
15d70 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  s |= WHERE_ROWID
15d80 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c  _RANGE|WHERE_COL
15d90 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  UMN_RANGE|WHERE_
15da0 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20  ORDERBY;.       
15db0 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76   wsFlags |= (rev
15dc0 20 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53 45   ? WHERE_REVERSE
15dd0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c   : 0);.      }el
15de0 73 65 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72  se{.        bSor
15df0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  t = 1;.      }. 
15e00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15e10 63 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c  currently calcul
15e20 61 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f  ating the cost o
15e30 66 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  f using an index
15e40 20 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20   (not the IPK.  
15e50 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74    ** index), det
15e60 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65  ermine if all re
15e70 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61  quired column da
15e80 74 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ta may be obtain
15e90 65 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20  ed without .    
15ea0 2a 2a 20 73 65 65 6b 69 6e 67 20 74 6f 20 65 6e  ** seeking to en
15eb0 74 72 69 65 73 20 69 6e 20 74 68 65 20 6d 61 69  tries in the mai
15ec0 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66  n table (i.e. if
15ed0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20   the index is a 
15ee0 63 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20  covering.    ** 
15ef0 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71  index for this q
15f00 75 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c  uery). If it is,
15f10 20 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49   set the WHERE_I
15f20 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a  DX_ONLY flag in.
15f30 20 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20      ** wsFlags. 
15f40 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 74  Otherwise, set t
15f50 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61  he bLookup varia
15f60 62 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f  ble to true.  */
15f70 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
15f80 20 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20   wsFlags ){.    
15f90 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53    Bitmask m = pS
15fa0 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20  rc->colUsed;.   
15fb0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
15fc0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
15fd0 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
15fe0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
15ff0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
16000 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
16010 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
16020 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
16030 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
16040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
16050 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
16060 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
16070 20 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e   |= WHERE_IDX_ON
16080 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  LY;.      }else{
16090 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70  .        bLookup
160a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
160b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 42    }..    /**** B
160c0 65 67 69 6e 20 61 64 64 69 6e 67 20 75 70 20 74  egin adding up t
160d0 68 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67  he cost of using
160e0 20 74 68 69 73 20 69 6e 64 65 78 20 28 4e 65 65   this index (Nee
160f0 64 73 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 29  ds improvements)
16100 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45  .    **.    ** E
16110 73 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62  stimate the numb
16120 65 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75  er of rows of ou
16130 74 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 49 4e  tput.  For an IN
16140 20 6f 70 65 72 61 74 6f 72 2c 0a 20 20 20 20 2a   operator,.    *
16150 2a 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65  * do not let the
16160 20 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64   estimate exceed
16170 20 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69   half the rows i
16180 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  n the table..   
16190 20 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28   */.    nRow = (
161a0 64 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74  double)(aiRowEst
161b0 5b 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b  [nEq] * nInMul);
161c0 0a 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20  .    if( bInEst 
161d0 26 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45  && nRow*2>aiRowE
161e0 73 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e  st[0] ){.      n
161f0 52 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30  Row = aiRowEst[0
16200 5d 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75  ]/2;.      nInMu
16210 6c 20 3d 20 28 69 6e 74 29 28 6e 52 6f 77 20 2f  l = (int)(nRow /
16220 20 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 29 3b   aiRowEst[nEq]);
16230 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
16240 73 73 75 6d 65 20 63 6f 6e 73 74 61 6e 74 20 63  ssume constant c
16250 6f 73 74 20 74 6f 20 61 63 63 65 73 73 20 61 20  ost to access a 
16260 72 6f 77 20 61 6e 64 20 6c 6f 67 61 72 69 74 68  row and logarith
16270 6d 69 63 20 63 6f 73 74 20 74 6f 0a 20 20 20 20  mic cost to.    
16280 2a 2a 20 64 6f 20 61 20 62 69 6e 61 72 79 20 73  ** do a binary s
16290 65 61 72 63 68 2e 20 20 48 65 6e 63 65 2c 20 74  earch.  Hence, t
162a0 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 73 74 20  he initial cost 
162b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
162c0 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 72   output.    ** r
162d0 6f 77 73 20 70 6c 75 73 20 6c 6f 67 32 28 74 61  ows plus log2(ta
162e0 62 6c 65 2d 73 69 7a 65 29 20 74 69 6d 65 73 20  ble-size) times 
162f0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  the number of bi
16300 6e 61 72 79 20 73 65 61 72 63 68 65 73 2e 0a 20  nary searches.. 
16310 20 20 20 2a 2f 0a 20 20 20 20 63 6f 73 74 20 3d     */.    cost =
16320 20 6e 52 6f 77 20 2b 20 6e 49 6e 4d 75 6c 2a 65   nRow + nInMul*e
16330 73 74 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30  stLog(aiRowEst[0
16340 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 6a 75  ]);..    /* Adju
16350 73 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  st the number of
16360 20 72 6f 77 73 20 61 6e 64 20 74 68 65 20 63 6f   rows and the co
16370 73 74 20 64 6f 77 6e 77 61 72 64 20 74 6f 20 72  st downward to r
16380 65 66 6c 65 63 74 20 72 6f 77 73 0a 20 20 20 20  eflect rows.    
16390 2a 2a 20 74 68 61 74 20 61 72 65 20 65 78 63 6c  ** that are excl
163a0 75 64 65 64 20 62 79 20 72 61 6e 67 65 20 63 6f  uded by range co
163b0 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 2a  nstraints..    *
163c0 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 6e 52  /.    nRow = (nR
163d0 6f 77 20 2a 20 28 64 6f 75 62 6c 65 29 6e 42 6f  ow * (double)nBo
163e0 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65 29 31  und) / (double)1
163f0 30 30 3b 0a 20 20 20 20 63 6f 73 74 20 3d 20 28  00;.    cost = (
16400 63 6f 73 74 20 2a 20 28 64 6f 75 62 6c 65 29 6e  cost * (double)n
16410 42 6f 75 6e 64 29 20 2f 20 28 64 6f 75 62 6c 65  Bound) / (double
16420 29 31 30 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 64  )100;..    /* Ad
16430 64 20 69 6e 20 74 68 65 20 65 73 74 69 6d 61 74  d in the estimat
16440 65 64 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  ed cost of sorti
16450 6e 67 20 74 68 65 20 72 65 73 75 6c 74 0a 20 20  ng the result.  
16460 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 53 6f    */.    if( bSo
16470 72 74 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  rt ){.      cost
16480 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
16490 63 6f 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  cost);.    }..  
164a0 20 20 2f 2a 20 49 66 20 61 6c 6c 20 69 6e 66 6f    /* If all info
164b0 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 74  rmation can be t
164c0 61 6b 65 6e 20 64 69 72 65 63 74 6c 79 20 66 72  aken directly fr
164d0 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 77 65  om the index, we
164e0 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 64 6f   avoid.    ** do
164f0 69 6e 67 20 74 61 62 6c 65 20 6c 6f 6f 6b 75 70  ing table lookup
16500 73 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  s.  This reduces
16510 20 74 68 65 20 63 6f 73 74 20 62 79 20 68 61 6c   the cost by hal
16520 66 2e 20 20 28 4e 6f 74 20 72 65 61 6c 6c 79 20  f.  (Not really 
16530 2d 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6e 65  -.    ** this ne
16540 65 64 73 20 74 6f 20 62 65 20 66 69 78 65 64 2e  eds to be fixed.
16550 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ).    */.    if(
16560 20 70 49 64 78 20 26 26 20 62 4c 6f 6f 6b 75 70   pIdx && bLookup
16570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 73  ==0 ){.      cos
16580 74 20 2f 3d 20 28 64 6f 75 62 6c 65 29 32 3b 0a  t /= (double)2;.
16590 20 20 20 20 7d 0a 20 20 20 20 2f 2a 2a 2a 2a 20      }.    /**** 
165a0 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 74 68  Cost of using th
165b0 69 73 20 69 6e 64 65 78 20 68 61 73 20 6e 6f 77  is index has now
165c0 20 62 65 65 6e 20 63 6f 6d 70 75 74 65 64 20 2a   been computed *
165d0 2a 2a 2a 2f 0a 0a 20 20 20 20 57 48 45 52 45 54  ***/..    WHERET
165e0 52 41 43 45 28 28 0a 20 20 20 20 20 20 22 74 62  RACE((.      "tb
165f0 6c 3d 25 73 20 69 64 78 3d 25 73 20 6e 45 71 3d  l=%s idx=%s nEq=
16600 25 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 6e 42 6f  %d nInMul=%d nBo
16610 75 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20  und=%d bSort=%d 
16620 62 4c 6f 6f 6b 75 70 3d 25 64 22 0a 20 20 20 20  bLookup=%d".    
16630 20 20 22 20 77 73 46 6c 61 67 73 3d 25 64 20 20    " wsFlags=%d  
16640 20 28 6e 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74   (nRow=%.2f cost
16650 3d 25 2e 32 66 29 5c 6e 22 2c 0a 20 20 20 20 20  =%.2f)\n",.     
16660 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
16670 6d 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78  me, (pIdx ? pIdx
16680 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29  ->zName : "ipk")
16690 2c 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49  , .      nEq, nI
166a0 6e 4d 75 6c 2c 20 6e 42 6f 75 6e 64 2c 20 62 53  nMul, nBound, bS
166b0 6f 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73  ort, bLookup, ws
166c0 46 6c 61 67 73 2c 20 6e 52 6f 77 2c 20 63 6f 73  Flags, nRow, cos
166d0 74 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 2f  t.    ));..    /
166e0 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20  * If this index 
166f0 69 73 20 74 68 65 20 62 65 73 74 20 77 65 20 68  is the best we h
16700 61 76 65 20 73 65 65 6e 20 73 6f 20 66 61 72 2c  ave seen so far,
16710 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 69   then record thi
16720 73 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 61  s.    ** index a
16730 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 20 74  nd its cost in t
16740 68 65 20 70 43 6f 73 74 20 73 74 72 75 63 74 75  he pCost structu
16750 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
16760 66 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46  f( (!pIdx || wsF
16770 6c 61 67 73 29 20 26 26 20 63 6f 73 74 3c 70 43  lags) && cost<pC
16780 6f 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20  ost->rCost ){.  
16790 20 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74      pCost->rCost
167a0 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70   = cost;.      p
167b0 43 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f  Cost->nRow = nRo
167c0 77 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  w;.      pCost->
167d0 75 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20  used = used;.   
167e0 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77     pCost->plan.w
167f0 73 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67  sFlags = (wsFlag
16800 73 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20  s&wsFlagMask);. 
16810 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e       pCost->plan
16820 2e 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20  .nEq = nEq;.    
16830 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e    pCost->plan.u.
16840 70 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20  pIdx = pIdx;.   
16850 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
16860 65 72 65 20 77 61 73 20 61 6e 20 49 4e 44 45 58  ere was an INDEX
16870 45 44 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ED BY clause, th
16880 65 6e 20 6f 6e 6c 79 20 74 68 61 74 20 6f 6e 65  en only that one
16890 20 69 6e 64 65 78 20 69 73 0a 20 20 20 20 2a 2a   index is.    **
168a0 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 2a 2f 0a   considered. */.
168b0 20 20 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49      if( pSrc->pI
168c0 6e 64 65 78 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ndex ) break;.. 
168d0 20 20 20 2f 2a 20 52 65 73 65 74 20 6d 61 73 6b     /* Reset mask
168e0 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 69  s for the next i
168f0 6e 64 65 78 20 69 6e 20 74 68 65 20 6c 6f 6f 70  ndex in the loop
16900 20 2a 2f 0a 20 20 20 20 77 73 46 6c 61 67 4d 61   */.    wsFlagMa
16910 73 6b 20 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57  sk = ~(WHERE_ROW
16920 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
16930 44 5f 52 41 4e 47 45 29 3b 0a 20 20 20 20 65 71  D_RANGE);.    eq
16940 54 65 72 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71  TermMask = idxEq
16950 54 65 72 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20  TermMask;.  }.. 
16960 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
16970 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  no ORDER BY clau
16980 73 65 20 61 6e 64 20 74 68 65 20 53 51 4c 49 54  se and the SQLIT
16990 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 66  E_ReverseOrder f
169a0 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c  lag.  ** is set,
169b0 20 74 68 65 6e 20 72 65 76 65 72 73 65 20 74 68   then reverse th
169c0 65 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65  e order that the
169d0 20 69 6e 64 65 78 20 77 69 6c 6c 20 62 65 20 73   index will be s
169e0 63 61 6e 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20  canned.  ** in. 
169f0 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
16a00 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 74 65 73   application tes
16a10 74 69 6e 67 2c 20 74 6f 20 68 65 6c 70 20 66 69  ting, to help fi
16a20 6e 64 20 63 61 73 65 73 0a 20 20 2a 2a 20 77 68  nd cases.  ** wh
16a30 65 72 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  ere application 
16a40 62 65 68 61 76 69 6f 75 72 20 64 65 70 65 6e 64  behaviour depend
16a50 73 20 6f 6e 20 74 68 65 20 28 75 6e 64 65 66 69  s on the (undefi
16a60 6e 65 64 29 20 6f 72 64 65 72 20 74 68 61 74 0a  ned) order that.
16a70 20 20 2a 2a 20 53 51 4c 69 74 65 20 6f 75 74 70    ** SQLite outp
16a80 75 74 73 20 72 6f 77 73 20 69 6e 20 69 6e 20 74  uts rows in in t
16a90 68 65 20 61 62 73 65 6e 63 65 20 6f 66 20 61 6e  he absence of an
16aa0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
16ab0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72  .  */.  if( !pOr
16ac0 64 65 72 42 79 20 26 26 20 70 50 61 72 73 65 2d  derBy && pParse-
16ad0 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
16ae0 49 54 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72  ITE_ReverseOrder
16af0 20 29 7b 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70   ){.    pCost->p
16b00 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57  lan.wsFlags |= W
16b10 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20  HERE_REVERSE;.  
16b20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  }..  assert( pOr
16b30 64 65 72 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d  derBy || (pCost-
16b40 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
16b50 45 52 45 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20  ERE_ORDERBY)==0 
16b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  );.  assert( pCo
16b70 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d  st->plan.u.pIdx=
16b80 3d 30 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c  =0 || (pCost->pl
16b90 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
16ba0 5f 52 4f 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b  _ROWID_EQ)==0 );
16bb0 0a 20 20 61 73 73 65 72 74 28 20 70 53 72 63 2d  .  assert( pSrc-
16bc0 3e 70 49 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20  >pIndex==0 .    
16bd0 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61     || pCost->pla
16be0 6e 2e 75 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20  n.u.pIdx==0 .   
16bf0 20 20 20 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c      || pCost->pl
16c00 61 6e 2e 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d  an.u.pIdx==pSrc-
16c10 3e 70 49 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20  >pIndex .  );.. 
16c20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
16c30 73 74 20 69 6e 64 65 78 20 69 73 3a 20 25 73 5c  st index is: %s\
16c40 6e 22 2c 20 0a 20 20 20 20 28 70 43 6f 73 74 2d  n", .    (pCost-
16c50 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70  >plan.u.pIdx ? p
16c60 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
16c70 78 2d 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22  x->zName : "ipk"
16c80 29 0a 20 20 29 29 3b 0a 20 20 0a 20 20 62 65 73  ).  ));.  .  bes
16c90 74 4f 72 43 6c 61 75 73 65 49 6e 64 65 78 28 70  tOrClauseIndex(p
16ca0 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63  Parse, pWC, pSrc
16cb0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64  , notReady, pOrd
16cc0 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20  erBy, pCost);.  
16cd0 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
16ce0 61 67 73 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73  ags |= eqTermMas
16cf0 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  k;.}../*.** Find
16d00 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
16d10 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 61  for accessing ta
16d20 62 6c 65 20 70 53 72 63 2d 3e 70 54 61 62 2e 20  ble pSrc->pTab. 
16d30 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 62 65 73  Write the.** bes
16d40 74 20 71 75 65 72 79 20 70 6c 61 6e 20 61 6e 64  t query plan and
16d50 20 69 74 73 20 63 6f 73 74 20 69 6e 74 6f 20 74   its cost into t
16d60 68 65 20 57 68 65 72 65 43 6f 73 74 20 6f 62 6a  he WhereCost obj
16d70 65 63 74 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a  ect supplied .**
16d80 20 61 73 20 74 68 65 20 6c 61 73 74 20 70 61 72   as the last par
16d90 61 6d 65 74 65 72 2e 20 54 68 69 73 20 66 75 6e  ameter. This fun
16da0 63 74 69 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c  ction may calcul
16db0 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 0a  ate the cost of.
16dc0 2a 2a 20 62 6f 74 68 20 72 65 61 6c 20 61 6e 64  ** both real and
16dd0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 73   virtual table s
16de0 63 61 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cans..*/.static 
16df0 76 6f 69 64 20 62 65 73 74 49 6e 64 65 78 28 0a  void bestIndex(.
16e00 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
16e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e20 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
16e30 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 43  text */.  WhereC
16e40 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
16e50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
16e60 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
16e70 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
16e80 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68  em *pSrc,  /* Th
16e90 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  e FROM clause te
16ea0 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  rm to search */.
16eb0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
16ec0 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dy,           /*
16ed0 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72 73   Mask of cursors
16ee0 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61 76   that are not av
16ef0 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70  ailable */.  Exp
16f00 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
16f10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
16f20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
16f30 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20 2a  */.  WhereCost *
16f40 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20 20  pCost           
16f50 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
16f60 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b  query plan */.){
16f70 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
16f80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
16f90 45 0a 20 20 69 66 28 20 49 73 56 69 72 74 75 61  E.  if( IsVirtua
16fa0 6c 28 70 53 72 63 2d 3e 70 54 61 62 29 20 29 7b  l(pSrc->pTab) ){
16fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  .    sqlite3_ind
16fc0 65 78 5f 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a  ex_info *p = 0;.
16fd0 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49      bestVirtualI
16fe0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
16ff0 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79  , pSrc, notReady
17000 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73  , pOrderBy, pCos
17010 74 2c 20 26 70 29 3b 0a 20 20 20 20 69 66 28 20  t, &p);.    if( 
17020 70 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  p->needToFreeIdx
17030 53 74 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Str ){.      sql
17040 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 69 64 78  ite3_free(p->idx
17050 53 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Str);.    }.    
17060 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 50  sqlite3DbFree(pP
17070 61 72 73 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20  arse->db, p);.  
17080 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b  }else.#endif.  {
17090 0a 20 20 20 20 62 65 73 74 42 74 72 65 65 49 6e  .    bestBtreeIn
170a0 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c  dex(pParse, pWC,
170b0 20 70 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c   pSrc, notReady,
170c0 20 70 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74   pOrderBy, pCost
170d0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
170e0 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
170f0 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
17100 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
17110 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
17120 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
17130 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
17140 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
17150 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
17160 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
17170 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
17180 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
17190 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
171a0 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
171b0 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
171c0 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
171d0 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
171e0 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
171f0 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
17200 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
17210 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
17220 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
17230 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
17240 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
17250 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
17260 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
17270 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
17280 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
17290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
172a0 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
172b0 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
172c0 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
172d0 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
172e0 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
172f0 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
17300 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
17310 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
17320 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
17330 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
17340 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
17350 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
17360 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
17370 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
17380 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
17390 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
173a0 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
173b0 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
173c0 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
173d0 6f 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20  on.  When terms 
173e0 61 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a  are satisfied.**
173f0 20 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20   by indices, we 
17400 64 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20  disable them to 
17410 70 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e  prevent redundan
17420 74 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69  t tests in the i
17430 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57  nner.** loop.  W
17440 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20  e would get the 
17450 63 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20  correct results 
17460 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20  if nothing were 
17470 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a  ever disabled,.*
17480 2a 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68  * but joins migh
17490 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73  t run a little s
174a0 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63  lower.  The tric
174b0 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20  k is to disable 
174c0 61 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65  as much.** as we
174d0 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73   can without dis
174e0 61 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e  abling too much.
174f0 20 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64    If we disabled
17500 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65   in (1), we'd ge
17510 74 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61  t.** the wrong a
17520 6e 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b  nswer.  See tick
17530 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74  et #813..*/.stat
17540 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54  ic void disableT
17550 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a  erm(WhereLevel *
17560 70 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72  pLevel, WhereTer
17570 6d 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28  m *pTerm){.  if(
17580 20 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20   pTerm.      && 
17590 41 4c 57 41 59 53 28 28 70 54 65 72 6d 2d 3e 77  ALWAYS((pTerm->w
175a0 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  tFlags & TERM_CO
175b0 44 45 44 29 3d 3d 30 29 0a 20 20 20 20 20 20 26  DED)==0).      &
175c0 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
175d0 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
175e0 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
175f0 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
17600 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
17610 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c  pTerm->wtFlags |
17620 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
17630 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61    if( pTerm->iPa
17640 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  rent>=0 ){.     
17650 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68   WhereTerm *pOth
17660 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43  er = &pTerm->pWC
17670 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65  ->a[pTerm->iPare
17680 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28  nt];.      if( (
17690 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64  --pOther->nChild
176a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
176b0 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
176c0 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20  el, pOther);.   
176d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
176e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20  ../*.** Code an 
176f0 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f 70 63 6f  OP_Affinity opco
17700 64 65 20 74 6f 20 61 70 70 6c 79 20 74 68 65 20  de to apply the 
17710 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
17720 73 74 72 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74  string zAff.** t
17730 6f 20 74 68 65 20 6e 20 72 65 67 69 73 74 65 72  o the n register
17740 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 61  s starting at ba
17750 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65  se. .**.** Buffe
17760 72 20 7a 41 66 66 20 77 61 73 20 61 6c 6c 6f 63  r zAff was alloc
17770 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ated using sqlit
17780 65 33 44 62 4d 61 6c 6c 6f 63 28 29 2e 20 49 74  e3DbMalloc(). It
17790 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70   is the .** resp
177a0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
177b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61  is function to a
177c0 72 72 61 6e 67 65 20 66 6f 72 20 69 74 20 74 6f  rrange for it to
177d0 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a   be eventually.*
177e0 2a 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71  * freed using sq
177f0 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 0a 2a  lite3DbFree()..*
17800 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
17810 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
17820 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
17830 6e 74 20 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20  nt base, int n, 
17840 63 68 61 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56  char *zAff){.  V
17850 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
17860 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
17870 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  ( v!=0 );.  sqli
17880 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17890 20 4f 50 5f 41 66 66 69 6e 69 74 79 2c 20 62 61   OP_Affinity, ba
178a0 73 65 2c 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65  se, n);.  sqlite
178b0 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
178c0 20 2d 31 2c 20 7a 41 66 66 2c 20 50 34 5f 44 59   -1, zAff, P4_DY
178d0 4e 41 4d 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  NAMIC);.  sqlite
178e0 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e 69  3ExprCacheAffini
178f0 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c  tyChange(pParse,
17900 20 62 61 73 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f   base, n);.}.../
17910 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
17920 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
17930 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
17940 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
17950 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
17960 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
17970 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
17980 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
17990 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
179a0 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
179b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
179c0 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
179d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
179e0 65 66 74 20 69 6e 20 72 65 67 69 73 74 65 72 20  eft in register 
179f0 69 52 65 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iReg..**.** For 
17a00 61 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20  a constraint of 
17a10 74 68 65 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c  the form X=expr,
17a20 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
17a30 69 73 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  is evaluated and
17a40 20 69 74 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69   its.** result i
17a50 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74  s left on the st
17a60 61 63 6b 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72  ack.  For constr
17a70 61 69 6e 74 73 20 6f 66 20 74 68 65 20 66 6f 72  aints of the for
17a80 6d 20 58 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20  m X IN (...).** 
17a90 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
17aa0 73 20 75 70 20 61 20 6c 6f 6f 70 20 74 68 61 74  s up a loop that
17ab0 20 77 69 6c 6c 20 69 74 65 72 61 74 65 20 6f 76   will iterate ov
17ac0 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66  er all values of
17ad0 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   X..*/.static in
17ae0 74 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  t codeEqualityTe
17af0 72 6d 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  rm(.  Parse *pPa
17b00 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
17b10 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
17b20 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
17b30 2a 70 54 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65  *pTerm,   /* The
17b40 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
17b50 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
17b60 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65  coded */.  Where
17b70 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f  Level *pLevel, /
17b80 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
17b90 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
17ba0 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
17bb0 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 72 67  n */.  int iTarg
17bc0 65 74 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74  et         /* At
17bd0 74 65 6d 70 74 20 74 6f 20 6c 65 61 76 65 20 72  tempt to leave r
17be0 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
17bf0 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
17c00 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
17c10 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
17c20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
17c30 62 65 3b 0a 20 20 69 6e 74 20 69 52 65 67 3b 20  be;.  int iReg; 
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c50 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
17c60 64 69 6e 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a  ding results */.
17c70 0a 20 20 61 73 73 65 72 74 28 20 69 54 61 72 67  .  assert( iTarg
17c80 65 74 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 58  et>0 );.  if( pX
17c90 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20  ->op==TK_EQ ){. 
17ca0 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74 65     iReg = sqlite
17cb0 33 45 78 70 72 43 6f 64 65 54 61 72 67 65 74 28  3ExprCodeTarget(
17cc0 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
17cd0 68 74 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20  ht, iTarget);.  
17ce0 7d 65 6c 73 65 20 69 66 28 20 70 58 2d 3e 6f 70  }else if( pX->op
17cf0 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20  ==TK_ISNULL ){. 
17d00 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67 65     iReg = iTarge
17d10 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
17d20 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e  beAddOp2(v, OP_N
17d30 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23  ull, 0, iReg);.#
17d40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17d50 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
17d60 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 65 54 79  lse{.    int eTy
17d70 70 65 3b 0a 20 20 20 20 69 6e 74 20 69 54 61 62  pe;.    int iTab
17d80 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c  ;.    struct InL
17d90 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61  oop *pIn;..    a
17da0 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
17db0 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 69 52 65 67  K_IN );.    iReg
17dc0 20 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20   = iTarget;.    
17dd0 65 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46  eType = sqlite3F
17de0 69 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73  indInIndex(pPars
17df0 65 2c 20 70 58 2c 20 30 29 3b 0a 20 20 20 20 69  e, pX, 0);.    i
17e00 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65  Tab = pX->iTable
17e10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
17e20 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65  eAddOp2(v, OP_Re
17e30 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a  wind, iTab, 0);.
17e40 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 76      assert( pLev
17e50 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
17e60 20 26 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45   & WHERE_IN_ABLE
17e70 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
17e80 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20  el->u.in.nIn==0 
17e90 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
17ea0 3e 61 64 64 72 4e 78 74 20 3d 20 73 71 6c 69 74  >addrNxt = sqlit
17eb0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
17ec0 76 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  v);.    }.    pL
17ed0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b  evel->u.in.nIn++
17ee0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  ;.    pLevel->u.
17ef0 69 6e 2e 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20  in.aInLoop =.   
17f00 20 20 20 20 73 71 6c 69 74 65 33 44 62 52 65 61      sqlite3DbRea
17f10 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 72 73  llocOrFree(pPars
17f20 65 2d 3e 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  e->db, pLevel->u
17f30 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20  .in.aInLoop,.   
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f             sizeo
17f60 66 28 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61  f(pLevel->u.in.a
17f70 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65  InLoop[0])*pLeve
17f80 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20  l->u.in.nIn);.  
17f90 20 20 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e    pIn = pLevel->
17fa0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  u.in.aInLoop;.  
17fb0 20 20 69 66 28 20 70 49 6e 20 29 7b 0a 20 20 20    if( pIn ){.   
17fc0 20 20 20 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     pIn += pLevel
17fd0 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a  ->u.in.nIn - 1;.
17fe0 20 20 20 20 20 20 70 49 6e 2d 3e 69 43 75 72 20        pIn->iCur 
17ff0 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 69 66  = iTab;.      if
18000 28 20 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45  ( eType==IN_INDE
18010 58 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  X_ROWID ){.     
18020 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f     pIn->addrInTo
18030 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  p = sqlite3VdbeA
18040 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69  ddOp2(v, OP_Rowi
18050 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29 3b 0a  d, iTab, iReg);.
18060 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18070 20 20 20 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e       pIn->addrIn
18080 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Top = sqlite3Vdb
18090 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
180a0 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
180b0 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
180c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
180d0 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
180e0 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
180f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
18100 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30  el->u.in.nIn = 0
18110 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
18120 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
18130 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b  (pLevel, pTerm);
18140 0a 20 20 72 65 74 75 72 6e 20 69 52 65 67 3b 0a  .  return iReg;.
18150 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
18160 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
18170 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d   evaluate all ==
18180 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69   and IN constrai
18190 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e  nts for an.** in
181a0 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75 65 73  dex.  The values
181b0 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61   for all constra
181c0 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20 6f 6e  ints are left on
181d0 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
181e0 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63  * For example, c
181f0 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20 74 31  onsider table t1
18200 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69  (a,b,c,d,e,f) wi
18210 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c 62 2c  th index i1(a,b,
18220 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  c)..** Suppose t
18230 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
18240 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35 20 41  is this:  a==5 A
18250 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 20  ND b IN (1,2,3) 
18260 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c 31 30  AND c>5 AND c<10
18270 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20 68 61  .** The index ha
18280 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74 68 72  s as many as thr
18290 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73  ee equality cons
182a0 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69 6e 20  traints, but in 
182b0 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c  this.** example,
182c0 20 74 68 65 20 74 68 69 72 64 20 22 63 22 20 76   the third "c" v
182d0 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65 71 75  alue is an inequ
182e0 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20  ality.  So only 
182f0 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  two .** constrai
18300 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e 20 20  nts are coded.  
18310 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
18320 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  l generate code 
18330 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61  to evaluate.** a
18340 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28 31 2c  ==5 and b IN (1,
18350 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72 72 65  2,3).  The curre
18360 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 61 20  nt values for a 
18370 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20 73 74  and b will be st
18380 6f 72 65 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65  ored.** in conse
18390 63 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73  cutive registers
183a0 20 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 6f   and the index o
183b0 66 20 74 68 65 20 66 69 72 73 74 20 72 65 67 69  f the first regi
183c0 73 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ster is returned
183d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65  ..**.** In the e
183e0 78 61 6d 70 6c 65 20 61 62 6f 76 65 20 6e 45 71  xample above nEq
183f0 3d 3d 32 2e 20 20 42 75 74 20 74 68 69 73 20 73  ==2.  But this s
18400 75 62 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  ubroutine works 
18410 66 6f 72 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a  for any value.**
18420 20 6f 66 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e   of nEq includin
18430 67 20 30 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c  g 0.  If nEq==0,
18440 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18450 20 6e 65 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e   nearly a no-op.
18460 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 74 68 69  .** The only thi
18470 6e 67 20 69 74 20 64 6f 65 73 20 69 73 20 61 6c  ng it does is al
18480 6c 6f 63 61 74 65 20 74 68 65 20 70 4c 65 76 65  locate the pLeve
18490 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63  l->iMem memory c
184a0 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ell..**.** This 
184b0 72 6f 75 74 69 6e 65 20 61 6c 77 61 79 73 20 61  routine always a
184c0 6c 6c 6f 63 61 74 65 73 20 61 74 20 6c 65 61 73  llocates at leas
184d0 74 20 6f 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t one memory cel
184e0 6c 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a  l and returns.**
184f0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
18500 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20  at memory cell. 
18510 54 68 65 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a  The code that.**
18520 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
18530 69 6e 65 20 77 69 6c 6c 20 75 73 65 20 74 68 61  ine will use tha
18540 74 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  t memory cell to
18550 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
18560 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
18570 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
18580 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
18590 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
185a0 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
185b0 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
185c0 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
185d0 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
185e0 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
185f0 0a 2a 2a 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42  .** use..**.** B
18600 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
18610 20 2a 70 7a 41 66 66 20 69 73 20 73 65 74 20 74   *pzAff is set t
18620 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
18630 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
18640 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20  .** copy of the 
18650 63 6f 6c 75 6d 6e 20 61 66 66 69 6e 69 74 79 20  column affinity 
18660 73 74 72 69 6e 67 20 6f 66 20 74 68 65 20 69 6e  string of the in
18670 64 65 78 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  dex allocated us
18680 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62  ing.** sqlite3Db
18690 4d 61 6c 6c 6f 63 28 29 2e 20 45 78 63 65 70 74  Malloc(). Except
186a0 2c 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  , entries in the
186b0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 74 72   copy of the str
186c0 69 6e 67 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ing associated.*
186d0 2a 20 77 69 74 68 20 65 71 75 61 6c 69 74 79 20  * with equality 
186e0 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 68 61 74  constraints that
186f0 20 75 73 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69   use NONE affini
18700 74 79 20 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a  ty are set to.**
18710 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
18720 2e 20 54 68 69 73 20 69 73 20 74 6f 20 64 65 61  . This is to dea
18730 6c 20 77 69 74 68 20 53 51 4c 20 73 75 63 68 20  l with SQL such 
18740 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  as the following
18750 3a 0a 2a 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45  :.**.**   CREATE
18760 20 54 41 42 4c 45 20 74 31 28 61 20 54 45 58 54   TABLE t1(a TEXT
18770 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 29   PRIMARY KEY, b)
18780 3b 0a 2a 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e  ;.**   SELECT ..
18790 2e 20 46 52 4f 4d 20 74 31 20 41 53 20 74 32 2c  . FROM t1 AS t2,
187a0 20 74 31 20 57 48 45 52 45 20 74 31 2e 61 20 3d   t1 WHERE t1.a =
187b0 20 74 32 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20   t2.b;.**.** In 
187c0 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
187d0 65 2c 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  e, the index on 
187e0 74 31 28 61 29 20 68 61 73 20 54 45 58 54 20 61  t1(a) has TEXT a
187f0 66 66 69 6e 69 74 79 2e 20 42 75 74 20 73 69 6e  ffinity. But sin
18800 63 65 0a 2a 2a 20 74 68 65 20 72 69 67 68 74 20  ce.** the right 
18810 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
18820 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
18830 61 69 6e 74 20 28 74 32 2e 62 29 20 68 61 73 20  aint (t2.b) has 
18840 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a  NONE affinity,.*
18850 2a 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20  * no conversion 
18860 73 68 6f 75 6c 64 20 62 65 20 61 74 74 65 6d 70  should be attemp
18870 74 65 64 20 62 65 66 6f 72 65 20 75 73 69 6e 67  ted before using
18880 20 61 20 74 32 2e 62 20 76 61 6c 75 65 20 61 73   a t2.b value as
18890 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65   part of.** a ke
188a0 79 20 74 6f 20 73 65 61 72 63 68 20 74 68 65 20  y to search the 
188b0 69 6e 64 65 78 2e 20 48 65 6e 63 65 20 74 68 65  index. Hence the
188c0 20 66 69 72 73 74 20 62 79 74 65 20 69 6e 20 74   first byte in t
188d0 68 65 20 72 65 74 75 72 6e 65 64 20 61 66 66 69  he returned affi
188e0 6e 69 74 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69  nity.** string i
188f0 6e 20 74 68 69 73 20 65 78 61 6d 70 6c 65 20 77  n this example w
18900 6f 75 6c 64 20 62 65 20 73 65 74 20 74 6f 20 53  ould be set to S
18910 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a  QLITE_AFF_NONE..
18920 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
18930 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
18940 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ms(.  Parse *pPa
18950 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
18960 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
18970 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
18980 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69  pLevel,   /* Whi
18990 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f  ch nested loop o
189a0 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20 61 72  f the FROM we ar
189b0 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68  e coding */.  Wh
189c0 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
189d0 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
189e0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42 69 74   clause */.  Bit
189f0 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20  mask notReady,  
18a00 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61 72 74     /* Which part
18a10 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65 20 6e  s of FROM have n
18a20 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f 64 65  ot yet been code
18a30 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  d */.  int nExtr
18a40 61 52 65 67 2c 20 20 20 20 20 20 20 20 2f 2a 20  aReg,        /* 
18a50 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
18a60 72 65 67 69 73 74 65 72 73 20 74 6f 20 61 6c 6c  registers to all
18a70 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20  ocate */.  char 
18a80 2a 2a 70 7a 41 66 66 20 20 20 20 20 20 20 20 20  **pzAff         
18a90 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 74 6f 20   /* OUT: Set to 
18aa0 70 6f 69 6e 74 20 74 6f 20 61 66 66 69 6e 69 74  point to affinit
18ab0 79 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20  y string */.){. 
18ac0 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65   int nEq = pLeve
18ad0 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f  l->plan.nEq;   /
18ae0 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
18af0 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61  == or IN constra
18b00 69 6e 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a  ints to code */.
18b10 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
18b20 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 20 20 20  se->pVdbe;      
18b30 2f 2a 20 54 68 65 20 76 6d 20 75 6e 64 65 72 20  /* The vm under 
18b40 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
18b50 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b70 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62 65 69  /* The index bei
18b80 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68 69 73  ng used for this
18b90 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69   loop */.  int i
18ba0 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54  Cur = pLevel->iT
18bb0 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68 65 20  abCur;   /* The 
18bc0 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61  cursor of the ta
18bd0 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ble */.  WhereTe
18be0 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
18bf0 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
18c00 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  le constraint te
18c10 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20  rm */.  int j;  
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18c40 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
18c50 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20  egBase;         
18c60 20 20 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65           /* Base
18c70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20 20 69   register */.  i
18c80 6e 74 20 6e 52 65 67 3b 20 20 20 20 20 20 20 20  nt nReg;        
18c90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18ca0 4e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 73 74  Number of regist
18cb0 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ers to allocate 
18cc0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 66 66 3b  */.  char *zAff;
18cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ce0 20 20 20 2f 2a 20 41 66 66 69 6e 69 74 79 20 73     /* Affinity s
18cf0 74 72 69 6e 67 20 74 6f 20 72 65 74 75 72 6e 20  tring to return 
18d00 2a 2f 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f  */..  /* This mo
18d10 64 75 6c 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  dule is only cal
18d20 6c 65 64 20 6f 6e 20 71 75 65 72 79 20 70 6c 61  led on query pla
18d30 6e 73 20 74 68 61 74 20 75 73 65 20 61 6e 20 69  ns that use an i
18d40 6e 64 65 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ndex. */.  asser
18d50 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  t( pLevel->plan.
18d60 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
18d70 49 4e 44 45 58 45 44 20 29 3b 0a 20 20 70 49 64  INDEXED );.  pId
18d80 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
18d90 2e 75 2e 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46  .u.pIdx;..  /* F
18da0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
18db0 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20  ny memory cells 
18dc0 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74 68 65  we will need the
18dd0 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e  n allocate them.
18de0 0a 20 20 2a 2f 0a 20 20 72 65 67 42 61 73 65 20  .  */.  regBase 
18df0 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b  = pParse->nMem +
18e00 20 31 3b 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65   1;.  nReg = pLe
18e10 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20  vel->plan.nEq + 
18e20 6e 45 78 74 72 61 52 65 67 3b 0a 20 20 70 50 61  nExtraReg;.  pPa
18e30 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65  rse->nMem += nRe
18e40 67 3b 0a 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c  g;..  zAff = sql
18e50 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50 61  ite3DbStrDup(pPa
18e60 72 73 65 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33  rse->db, sqlite3
18e70 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
18e80 28 76 2c 20 70 49 64 78 29 29 3b 0a 20 20 69 66  (v, pIdx));.  if
18e90 28 20 21 7a 41 66 66 20 29 7b 0a 20 20 20 20 70  ( !zAff ){.    p
18ea0 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
18eb0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
18ec0 0a 0a 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20  ..  /* Evaluate 
18ed0 74 68 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  the equality con
18ee0 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
18ef0 61 73 73 65 72 74 28 20 70 49 64 78 2d 3e 6e 43  assert( pIdx->nC
18f00 6f 6c 75 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20  olumn>=nEq );.  
18f10 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20  for(j=0; j<nEq; 
18f20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 31  j++){.    int r1
18f30 3b 0a 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49  ;.    int k = pI
18f40 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b  dx->aiColumn[j];
18f50 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e  .    pTerm = fin
18f60 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
18f70 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c   k, notReady, pL
18f80 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
18f90 67 73 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69  gs, pIdx);.    i
18fa0 66 28 20 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d  f( NEVER(pTerm==
18fb0 30 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  0) ) break;.    
18fc0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
18fd0 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  wtFlags & TERM_C
18fe0 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ODED)==0 );.    
18ff0 72 31 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74  r1 = codeEqualit
19000 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
19010 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67  erm, pLevel, reg
19020 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28  Base+j);.    if(
19030 20 72 31 21 3d 72 65 67 42 61 73 65 2b 6a 20 29   r1!=regBase+j )
19040 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52 65 67  {.      if( nReg
19050 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==1 ){.        s
19060 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
19070 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67  pReg(pParse, reg
19080 42 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Base);.        r
19090 65 67 42 61 73 65 20 3d 20 72 31 3b 0a 20 20 20  egBase = r1;.   
190a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
190b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
190c0 4f 70 32 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c  Op2(v, OP_SCopy,
190d0 20 72 31 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b   r1, regBase+j);
190e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
190f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
19100 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
19110 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  WO_ISNULL );.   
19120 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
19130 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f  ->eOperator & WO
19140 5f 49 4e 20 29 3b 0a 20 20 20 20 69 66 28 20 28  _IN );.    if( (
19150 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
19160 20 26 20 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f   & (WO_ISNULL|WO
19170 5f 49 4e 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  _IN))==0 ){.    
19180 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19190 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
191a0 2c 20 72 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65  , regBase+j, pLe
191b0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
191c0 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 0a 20       if( zAff . 
191d0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
191e0 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
191f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  pTerm->pExpr->pR
19200 69 67 68 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d  ight, zAff[j])==
19210 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
19220 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
19230 20 7a 41 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54   zAff[j] = SQLIT
19240 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
19250 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
19260 2a 70 7a 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20  *pzAff = zAff;. 
19270 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65 3b   return regBase;
19280 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
19290 74 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  te code for the 
192a0 73 74 61 72 74 20 6f 66 20 74 68 65 20 69 4c 65  start of the iLe
192b0 76 65 6c 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74  vel-th loop in t
192c0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  he WHERE clause.
192d0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** implementatio
192e0 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  n described by p
192f0 57 49 6e 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63  WInfo..*/.static
19300 20 42 69 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65   Bitmask codeOne
19310 4c 6f 6f 70 53 74 61 72 74 28 0a 20 20 57 68 65  LoopStart(.  Whe
19320 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20  reInfo *pWInfo, 
19330 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e    /* Complete in
19340 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
19350 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
19360 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c   */.  int iLevel
19370 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
19380 69 63 68 20 6c 65 76 65 6c 20 6f 66 20 70 57 49  ich level of pWI
19390 6e 66 6f 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20  nfo->a[] should 
193a0 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31  be coded */.  u1
193b0 36 20 77 63 74 72 6c 46 6c 61 67 73 2c 20 20 20  6 wctrlFlags,   
193c0 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65     /* One of the
193d0 20 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64   WHERE_* flags d
193e0 65 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65  efined in sqlite
193f0 49 6e 74 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61  Int.h */.  Bitma
19400 73 6b 20 6e 6f 74 52 65 61 64 79 20 20 20 20 20  sk notReady     
19410 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 73 20  /* Which tables 
19420 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 61 76  are currently av
19430 61 69 6c 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ailable */.){.  
19440 69 6e 74 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20  int j, k;       
19450 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
19460 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
19470 43 75 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Cur;            
19480 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
19490 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
194a0 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4e 78   */.  int addrNx
194b0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  t;         /* Wh
194c0 65 72 65 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63  ere to jump to c
194d0 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68 65  ontinue with the
194e0 20 6e 65 78 74 20 49 4e 20 63 61 73 65 20 2a 2f   next IN case */
194f0 0a 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65  .  int omitTable
19500 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
19510 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
19520 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e  dex only */.  in
19530 74 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20  t bRev;         
19540 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
19550 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
19560 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
19570 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
19580 70 4c 65 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20  pLevel;  /* The 
19590 77 68 65 72 65 20 6c 65 76 65 6c 20 74 6f 20 62  where level to b
195a0 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65  e coded */.  Whe
195b0 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20  reClause *pWC;  
195c0 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69    /* Decompositi
195d0 6f 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  on of the entire
195e0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
195f0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
19600 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
19610 20 20 20 2f 2a 20 41 20 57 48 45 52 45 20 63 6c     /* A WHERE cl
19620 61 75 73 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50  ause term */.  P
19630 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
19640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19650 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
19660 74 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20  t */.  Vdbe *v; 
19670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 72         /* The pr
19690 65 70 61 72 65 64 20 73 74 6d 74 20 75 6e 64 65  epared stmt unde
196a0 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20  r constructions 
196b0 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
196c0 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
196d0 65 6d 3b 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61  em;  /* FROM cla
196e0 75 73 65 20 74 65 72 6d 20 62 65 69 6e 67 20 63  use term being c
196f0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64  oded */.  int ad
19700 64 72 42 72 6b 3b 20 20 20 20 20 20 20 20 20 20  drBrk;          
19710 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
19720 70 20 68 65 72 65 20 74 6f 20 62 72 65 61 6b 20  p here to break 
19730 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
19740 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 43 6f 6e  */.  int addrCon
19750 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
19760 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
19770 65 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  e to continue wi
19780 74 68 20 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f  th next cycle */
19790 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 52 65 67  .  int iRowidReg
197a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
197b0 52 6f 77 69 64 20 69 73 20 73 74 6f 72 65 64 20  Rowid is stored 
197c0 69 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72  in this register
197d0 2c 20 69 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f  , if not zero */
197e0 0a 20 20 69 6e 74 20 69 52 65 6c 65 61 73 65 52  .  int iReleaseR
197f0 65 67 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  eg = 0;      /* 
19800 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 74 6f  Temp register to
19810 20 66 72 65 65 20 62 65 66 6f 72 65 20 72 65 74   free before ret
19820 75 72 6e 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61  urning */..  pPa
19830 72 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50  rse = pWInfo->pP
19840 61 72 73 65 3b 0a 20 20 76 20 3d 20 70 50 61 72  arse;.  v = pPar
19850 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 70 57 43  se->pVdbe;.  pWC
19860 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a   = pWInfo->pWC;.
19870 20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e    pLevel = &pWIn
19880 66 6f 2d 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20  fo->a[iLevel];. 
19890 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 57 49   pTabItem = &pWI
198a0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61  nfo->pTabList->a
198b0 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
198c0 0a 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  .  iCur = pTabIt
198d0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62  em->iCursor;.  b
198e0 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70  Rev = (pLevel->p
198f0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
19900 45 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b  ERE_REVERSE)!=0;
19910 0a 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28  .  omitTable = (
19920 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
19930 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58  lags & WHERE_IDX
19940 5f 4f 4e 4c 59 29 21 3d 30 20 0a 20 20 20 20 20  _ONLY)!=0 .     
19950 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
19960 6c 61 67 73 20 26 20 57 48 45 52 45 5f 46 4f 52  lags & WHERE_FOR
19970 43 45 5f 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20  CE_TABLE)==0;.. 
19980 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
19990 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
199a0 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
199b0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
199c0 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
199d0 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
199e0 6f 20 61 64 64 72 42 72 6b 20 74 6f 20 62 72 65  o addrBrk to bre
199f0 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70  ak out of a loop
19a00 2e 0a 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63  ..  ** Jump to c
19a10 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
19a20 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
19a30 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
19a40 68 65 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  he.  ** loop..  
19a50 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 68 65  **.  ** When the
19a60 72 65 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72  re is an IN oper
19a70 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f 20 68 61  ator, we also ha
19a80 76 65 20 61 20 22 61 64 64 72 4e 78 74 22 20 6c  ve a "addrNxt" l
19a90 61 62 65 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d  abel that.  ** m
19aa0 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65  eans to continue
19ab0 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49   with the next I
19ac0 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74  N value combinat
19ad0 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ion.  When.  ** 
19ae0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 49 4e 20  there are no IN 
19af0 6f 70 65 72 61 74 6f 72 73 20 69 6e 20 74 68 65  operators in the
19b00 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
19b10 65 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  e "addrNxt" labe
19b20 6c 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 73 61  l.  ** is the sa
19b30 6d 65 20 61 73 20 22 61 64 64 72 42 72 6b 22 2e  me as "addrBrk".
19b40 0a 20 20 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20  .  */.  addrBrk 
19b50 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  = pLevel->addrBr
19b60 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  k = pLevel->addr
19b70 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  Nxt = sqlite3Vdb
19b80 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19b90 20 61 64 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76   addrCont = pLev
19ba0 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73  el->addrCont = s
19bb0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
19bc0 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66  bel(v);..  /* If
19bd0 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69 67   this is the rig
19be0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
19bf0 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61  FT OUTER JOIN, a
19c00 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a  llocate and.  **
19c10 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
19c20 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
19c30 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
19c40 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
19c50 0a 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65  .  ** row of the
19c60 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74   left table of t
19c70 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20  he join..  */.  
19c80 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
19c90 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
19ca0 5b 30 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a  [0].jointype & J
19cb0 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20  T_LEFT)!=0 ){.  
19cc0 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a    pLevel->iLeftJ
19cd0 6f 69 6e 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  oin = ++pParse->
19ce0 6e 4d 65 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65  nMem;.    sqlite
19cf0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19d00 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c  P_Integer, 0, pL
19d10 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
19d20 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
19d30 74 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54  t((v, "init LEFT
19d40 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66   JOIN no-match f
19d50 6c 61 67 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66  lag"));.  }..#if
19d60 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19d70 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
19d80 69 66 28 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c  if(  (pLevel->pl
19d90 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
19da0 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
19db0 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  !=0 ){.    /* Ca
19dc0 73 65 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65  se 0:  The table
19dd0 20 69 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61   is a virtual-ta
19de0 62 6c 65 2e 20 20 55 73 65 20 74 68 65 20 56 46  ble.  Use the VF
19df0 69 6c 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a  ilter and VNext.
19e00 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
19e10 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
19e20 74 61 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ta..    */.    i
19e30 6e 74 20 69 52 65 67 3b 20 20 20 2f 2a 20 50 33  nt iReg;   /* P3
19e40 20 56 61 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46   Value for OP_VF
19e50 69 6c 74 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c  ilter */.    sql
19e60 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
19e70 2a 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76  *pVtabIdx = pLev
19e80 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62  el->plan.u.pVtab
19e90 49 64 78 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  Idx;.    int nCo
19ea0 6e 73 74 72 61 69 6e 74 20 3d 20 70 56 74 61 62  nstraint = pVtab
19eb0 49 64 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  Idx->nConstraint
19ec0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 71 6c  ;.    struct sql
19ed0 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
19ee0 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
19ef0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
19f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
19f30 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
19f40 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75  ;.    const stru
19f50 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
19f60 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f  _constraint *aCo
19f70 6e 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20  nstraint =.     
19f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19fa0 20 20 20 20 20 20 20 20 20 20 20 70 56 74 61 62             pVtab
19fb0 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  Idx->aConstraint
19fc0 3b 0a 0a 20 20 20 20 69 52 65 67 20 3d 20 73 71  ;..    iReg = sq
19fd0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
19fe0 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
19ff0 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f  raint+2);.    fo
1a000 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74  r(j=1; j<=nConst
1a010 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
1a020 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43     for(k=0; k<nC
1a030 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b  onstraint; k++){
1a040 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73  .        if( aUs
1a050 61 67 65 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78  age[k].argvIndex
1a060 3d 3d 6a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==j ){.         
1a070 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
1a080 6e 73 74 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72  nstraint[k].iTer
1a090 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
1a0a0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1a0b0 64 65 28 70 50 61 72 73 65 2c 20 70 57 43 2d 3e  de(pParse, pWC->
1a0c0 61 5b 69 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e  a[iTerm].pExpr->
1a0d0 70 52 69 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31  pRight, iReg+j+1
1a0e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
1a0f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
1a100 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a110 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29  k==nConstraint )
1a120 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1a130 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a140 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
1a150 72 2c 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78  r, pVtabIdx->idx
1a160 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20 20 20 20  Num, iReg);.    
1a170 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a180 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1a190 20 6a 2d 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20   j-1, iReg+1);. 
1a1a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1a1b0 64 4f 70 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74  dOp4(v, OP_VFilt
1a1c0 65 72 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72  er, iCur, addrBr
1a1d0 6b 2c 20 69 52 65 67 2c 20 70 56 74 61 62 49 64  k, iReg, pVtabId
1a1e0 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20 20 20 20  x->idxStr,.     
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65 64 54   pVtabIdx->needT
1a210 6f 46 72 65 65 49 64 78 53 74 72 20 3f 20 50 34  oFreeIdxStr ? P4
1a220 5f 4d 50 52 49 4e 54 46 20 3a 20 50 34 5f 53 54  _MPRINTF : P4_ST
1a230 41 54 49 43 29 3b 0a 20 20 20 20 70 56 74 61 62  ATIC);.    pVtab
1a240 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  Idx->needToFreeI
1a250 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 66  dxStr = 0;.    f
1a260 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
1a270 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
1a280 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a 5d     if( aUsage[j]
1a290 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  .omit ){.       
1a2a0 20 69 6e 74 20 69 54 65 72 6d 20 3d 20 61 43 6f   int iTerm = aCo
1a2b0 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72  nstraint[j].iTer
1a2c0 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20  mOffset;.       
1a2d0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1a2e0 76 65 6c 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65  vel, &pWC->a[iTe
1a2f0 72 6d 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rm]);.      }.  
1a300 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e    }.    pLevel->
1a310 6f 70 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20  op = OP_VNext;. 
1a320 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1a330 69 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  iCur;.    pLevel
1a340 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1a350 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a360 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c  ;.    sqlite3Rel
1a370 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28 70 50  easeTempRange(pP
1a380 61 72 73 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e  arse, iReg, nCon
1a390 73 74 72 61 69 6e 74 2b 32 29 3b 0a 20 20 7d 65  straint+2);.  }e
1a3a0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
1a3b0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
1a3c0 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28  LTABLE */..  if(
1a3d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1a3e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
1a3f0 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a  WID_EQ ){.    /*
1a400 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61 6e   Case 1:  We can
1a410 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72 65   directly refere
1a420 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77  nce a single row
1a430 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1a440 20 20 20 20 20 20 20 20 20 20 65 71 75 61 6c 69            equali
1a450 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
1a460 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
1a470 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a  field.  Or.    *
1a480 2a 20 20 20 20 20 20 20 20 20 20 77 65 20 72 65  *          we re
1a490 66 65 72 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65  ference multiple
1a4a0 20 72 6f 77 73 20 75 73 69 6e 67 20 61 20 22 72   rows using a "r
1a4b0 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20  owid IN (...)". 
1a4c0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63     **          c
1a4d0 6f 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f  onstruct..    */
1a4e0 0a 20 20 20 20 69 52 65 6c 65 61 73 65 52 65 67  .    iReleaseReg
1a4f0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a500 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a510 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
1a520 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
1a530 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
1a540 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20  Q|WO_IN, 0);.   
1a550 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1a560 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1a570 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30   pTerm->pExpr!=0
1a580 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a590 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
1a5a0 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 61  r==iCur );.    a
1a5b0 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
1a5c0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 52 6f 77 69  ==0 );.    iRowi
1a5d0 64 52 65 67 20 3d 20 63 6f 64 65 45 71 75 61 6c  dReg = codeEqual
1a5e0 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
1a5f0 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69  pTerm, pLevel, i
1a600 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 20 20 20  ReleaseReg);.   
1a610 20 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65   addrNxt = pLeve
1a620 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a 20 20 20 20  l->addrNxt;.    
1a630 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a640 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e  2(v, OP_MustBeIn
1a650 74 2c 20 69 52 6f 77 69 64 52 65 67 2c 20 61 64  t, iRowidReg, ad
1a660 64 72 4e 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  drNxt);.    sqli
1a670 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
1a680 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
1a690 43 75 72 2c 20 61 64 64 72 4e 78 74 2c 20 69 52  Cur, addrNxt, iR
1a6a0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 73 71  owidReg);.    sq
1a6b0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 53 74  lite3ExprCacheSt
1a6c0 6f 72 65 28 70 50 61 72 73 65 2c 20 69 43 75 72  ore(pParse, iCur
1a6d0 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29  , -1, iRowidReg)
1a6e0 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e  ;.    VdbeCommen
1a6f0 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
1a700 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
1a710 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20  P_Noop;.  }else 
1a720 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1a730 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1a740 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a  _ROWID_RANGE ){.
1a750 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20      /* Case 2:  
1a760 57 65 20 68 61 76 65 20 61 6e 20 69 6e 65 71 75  We have an inequ
1a770 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
1a780 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
1a790 49 44 20 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f  ID field..    */
1a7a0 0a 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20  .    int testOp 
1a7b0 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69  = OP_Noop;.    i
1a7c0 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 69 6e  nt start;.    in
1a7d0 74 20 6d 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20  t memEndValue = 
1a7e0 30 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d  0;.    WhereTerm
1a7f0 20 2a 70 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b   *pStart, *pEnd;
1a800 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d  ..    assert( om
1a810 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20  itTable==0 );.  
1a820 20 20 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54    pStart = findT
1a830 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
1a840 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  1, notReady, WO_
1a850 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20  GT|WO_GE, 0);.  
1a860 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
1a870 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
1a880 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
1a890 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
1a8a0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
1a8b0 20 20 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74    pTerm = pStart
1a8c0 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74 20 3d  ;.      pStart =
1a8d0 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e   pEnd;.      pEn
1a8e0 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d  d = pTerm;.    }
1a8f0 0a 20 20 20 20 69 66 28 20 70 53 74 61 72 74 20  .    if( pStart 
1a900 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
1a910 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  X;             /
1a920 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1a930 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
1a940 65 20 73 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f  e start bound */
1a950 0a 20 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72  .      int r1, r
1a960 54 65 6d 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  Temp;        /* 
1a970 52 65 67 69 73 74 65 72 73 20 66 6f 72 20 68 6f  Registers for ho
1a980 6c 64 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  lding the start 
1a990 62 6f 75 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20  boundary */..   
1a9a0 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
1a9b0 69 6e 67 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70  ing constant map
1a9c0 73 20 54 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e  s TK_xx codes in
1a9d0 74 6f 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  to corresponding
1a9e0 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 65 6b 20   .      ** seek 
1a9f0 6f 70 63 6f 64 65 73 2e 20 20 49 74 20 64 65 70  opcodes.  It dep
1aa00 65 6e 64 73 20 6f 6e 20 61 20 70 61 72 74 69 63  ends on a partic
1aa10 75 6c 61 72 20 6f 72 64 65 72 69 6e 67 20 6f 66  ular ordering of
1aa20 20 54 4b 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a   TK_xx.      */.
1aa30 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 61        const u8 a
1aa40 4d 6f 76 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20  MoveOp[] = {.   
1aa50 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54          /* TK_GT
1aa60 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a   */  OP_SeekGt,.
1aa70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
1aa80 5f 4c 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LE */  OP_SeekL
1aa90 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,.           /*
1aaa0 20 54 4b 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65   TK_LT */  OP_Se
1aab0 65 6b 4c 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ekLt,.          
1aac0 20 2f 2a 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50   /* TK_GE */  OP
1aad0 5f 53 65 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b  _SeekGe.      };
1aae0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
1aaf0 4b 5f 4c 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b  K_LE==TK_GT+1 );
1ab00 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
1ab10 72 65 20 74 68 65 20 6f 72 64 65 72 69 6e 67 2e  re the ordering.
1ab20 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
1ab30 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b  t( TK_LT==TK_GT+
1ab40 32 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e  2 );      /*  ..
1ab50 2e 20 6f 66 20 74 68 65 20 54 4b 5f 78 78 20 76  . of the TK_xx v
1ab60 61 6c 75 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20  alues... */.    
1ab70 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
1ab80 3d 54 4b 5f 47 54 2b 33 20 29 3b 20 20 20 20 20  =TK_GT+3 );     
1ab90 20 2f 2a 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72   /*  ... is corr
1aba0 65 63 63 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20  ecct. */..      
1abb0 70 58 20 3d 20 70 53 74 61 72 74 2d 3e 70 45 78  pX = pStart->pEx
1abc0 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pr;.      assert
1abd0 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
1abe0 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74 2d   assert( pStart-
1abf0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
1ac00 72 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  r );.      r1 = 
1ac10 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1ac20 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  emp(pParse, pX->
1ac30 70 52 69 67 68 74 2c 20 26 72 54 65 6d 70 29 3b  pRight, &rTemp);
1ac40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1ac50 62 65 41 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76  beAddOp3(v, aMov
1ac60 65 4f 70 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54  eOp[pX->op-TK_GT
1ac70 5d 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  ], iCur, addrBrk
1ac80 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 56 64 62  , r1);.      Vdb
1ac90 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
1aca0 22 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  "));.      sqlit
1acb0 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
1acc0 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
1acd0 2c 20 72 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r1, 1);.      
1ace0 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
1acf0 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 54  mpReg(pParse, rT
1ad00 65 6d 70 29 3b 0a 20 20 20 20 20 20 64 69 73 61  emp);.      disa
1ad10 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1ad20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c  pStart);.    }el
1ad30 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
1ad40 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 62  3VdbeAddOp2(v, b
1ad50 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20  Rev ? OP_Last : 
1ad60 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c  OP_Rewind, iCur,
1ad70 20 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d   addrBrk);.    }
1ad80 0a 20 20 20 20 69 66 28 20 70 45 6e 64 20 29 7b  .    if( pEnd ){
1ad90 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b  .      Expr *pX;
1ada0 0a 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e 64  .      pX = pEnd
1adb0 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61  ->pExpr;.      a
1adc0 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
1add0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
1ade0 6e 64 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  nd->leftCursor==
1adf0 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 6d 65  iCur );.      me
1ae00 6d 45 6e 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50  mEndValue = ++pP
1ae10 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
1ae20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1ae30 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
1ae40 69 67 68 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75  ight, memEndValu
1ae50 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 58  e);.      if( pX
1ae60 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
1ae70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
1ae80 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
1ae90 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20   bRev ? OP_Le : 
1aea0 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c  OP_Ge;.      }el
1aeb0 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74  se{.        test
1aec0 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
1aed0 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
1aee0 20 7d 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65   }.      disable
1aef0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e  Term(pLevel, pEn
1af00 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  d);.    }.    st
1af10 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
1af20 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
1af30 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
1af40 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
1af50 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
1af60 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
1af70 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
1af80 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 70  2 = start;.    p
1af90 4c 65 76 65 6c 2d 3e 70 35 20 3d 20 28 70 53 74  Level->p5 = (pSt
1afa0 61 72 74 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d  art==0 && pEnd==
1afb0 30 29 20 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28  0) ?1:0;.    if(
1afc0 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
1afd0 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64   ){.      iRowid
1afe0 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65  Reg = iReleaseRe
1aff0 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65  g = sqlite3GetTe
1b000 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20  mpReg(pParse);. 
1b010 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1b020 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
1b030 69 64 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  id, iCur, iRowid
1b040 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1b050 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1b060 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1b070 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1b080 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b090 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
1b0a0 70 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20  p, memEndValue, 
1b0b0 61 64 64 72 42 72 6b 2c 20 69 52 6f 77 69 64 52  addrBrk, iRowidR
1b0c0 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1b0d0 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76  e3VdbeChangeP5(v
1b0e0 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  , SQLITE_AFF_NUM
1b0f0 45 52 49 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55  ERIC | SQLITE_JU
1b100 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  MPIFNULL);.    }
1b110 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65  .  }else if( pLe
1b120 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
1b130 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d  s & (WHERE_COLUM
1b140 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f  N_RANGE|WHERE_CO
1b150 4c 55 4d 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20  LUMN_EQ) ){.    
1b160 2f 2a 20 43 61 73 65 20 33 3a 20 41 20 73 63 61  /* Case 3: A sca
1b170 6e 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78  n using an index
1b180 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1b190 20 20 20 20 20 20 20 20 54 68 65 20 57 48 45 52          The WHER
1b1a0 45 20 63 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e  E clause may con
1b1b0 74 61 69 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  tain zero or mor
1b1c0 65 20 65 71 75 61 6c 69 74 79 20 0a 20 20 20 20  e equality .    
1b1d0 2a 2a 20 20 20 20 20 20 20 20 20 74 65 72 6d 73  **         terms
1b1e0 20 28 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f   ("==" or "IN" o
1b1f0 70 65 72 61 74 6f 72 73 29 20 74 68 61 74 20 72  perators) that r
1b200 65 66 65 72 20 74 6f 20 74 68 65 20 4e 0a 20 20  efer to the N.  
1b210 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c 65 66    **         lef
1b220 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f  t-most columns o
1b230 66 20 74 68 65 20 69 6e 64 65 78 2e 20 49 74 20  f the index. It 
1b240 6d 61 79 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e  may also contain
1b250 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1b260 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  inequality const
1b270 72 61 69 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d  raints (>, <, >=
1b280 20 6f 72 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69   or <=) on the i
1b290 6e 64 65 78 65 64 0a 20 20 20 20 2a 2a 20 20 20  ndexed.    **   
1b2a0 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61        column tha
1b2b0 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f  t immediately fo
1b2c0 6c 6c 6f 77 73 20 74 68 65 20 4e 20 65 71 75 61  llows the N equa
1b2d0 6c 69 74 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20  lities. Only .  
1b2e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
1b2f0 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
1b300 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
1b310 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
1b320 73 74 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20  st must.    **  
1b330 20 20 20 20 20 20 20 75 73 65 20 74 68 65 20 22         use the "
1b340 3d 3d 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65  ==" and "IN" ope
1b350 72 61 74 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d  rators. For exam
1b360 70 6c 65 2c 20 69 66 20 74 68 65 20 0a 20 20 20  ple, if the .   
1b370 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 64 65   **         inde
1b380 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c  x is on (x,y,z),
1b390 20 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   then the follow
1b3a0 69 6e 67 20 63 6c 61 75 73 65 73 20 61 72 65 20  ing clauses are 
1b3b0 61 6c 6c 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  all .    **     
1b3c0 20 20 20 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20      optimized:. 
1b3d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1b3e0 20 20 20 20 20 20 20 20 78 3d 35 0a 20 20 20 20          x=5.    
1b3f0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d  **            x=
1b400 35 20 41 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a  5 AND y=10.    *
1b410 2a 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35  *            x=5
1b420 20 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a   AND y<10.    **
1b430 20 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20              x=5 
1b440 41 4e 44 20 79 3e 35 20 41 4e 44 20 79 3c 31 30  AND y>5 AND y<10
1b450 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1b460 20 20 20 78 3d 35 20 41 4e 44 20 79 3d 35 20 41     x=5 AND y=5 A
1b470 4e 44 20 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a  ND z<=10.    **.
1b480 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
1b490 68 65 20 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20  he z<10 term of 
1b4a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  the following ca
1b4b0 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 6f 6e  nnot be used, on
1b4c0 6c 79 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  ly.    **       
1b4d0 20 20 74 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a    the x=5 term:.
1b4e0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1b4f0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
1b500 20 7a 3c 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20   z<10.    **.   
1b510 20 2a 2a 20 20 20 20 20 20 20 20 20 4e 20 6d 61   **         N ma
1b520 79 20 62 65 20 7a 65 72 6f 20 69 66 20 74 68 65  y be zero if the
1b530 72 65 20 61 72 65 20 69 6e 65 71 75 61 6c 69 74  re are inequalit
1b540 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20  y constraints.. 
1b550 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 49 66     **         If
1b560 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 69 6e   there are no in
1b570 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b580 69 6e 74 73 2c 20 74 68 65 6e 20 4e 20 69 73 20  ints, then N is 
1b590 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  at.    **       
1b5a0 20 20 6c 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20    least one..   
1b5b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
1b5c0 20 20 20 54 68 69 73 20 63 61 73 65 20 69 73 20     This case is 
1b5d0 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 20 74  also used when t
1b5e0 68 65 72 65 20 61 72 65 20 6e 6f 20 57 48 45 52  here are no WHER
1b5f0 45 20 63 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20  E clause.    ** 
1b600 20 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69          constrai
1b610 6e 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78  nts but an index
1b620 20 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79   is selected any
1b630 77 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20  way, in order.  
1b640 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
1b650 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
1b660 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
1b670 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
1b680 2e 0a 20 20 20 20 2a 2f 20 20 0a 20 20 20 20 69  ..    */  .    i
1b690 6e 74 20 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20  nt aStartOp[] = 
1b6a0 7b 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  {.      0,.     
1b6b0 20 30 2c 0a 20 20 20 20 20 20 4f 50 5f 52 65 77   0,.      OP_Rew
1b6c0 69 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ind,           /
1b6d0 2a 20 32 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e  * 2: (!start_con
1b6e0 73 74 72 61 69 6e 74 73 20 26 26 20 73 74 61 72  straints && star
1b6f0 74 45 71 20 26 26 20 20 21 62 52 65 76 29 20 2a  tEq &&  !bRev) *
1b700 2f 0a 20 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c  /.      OP_Last,
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b720 33 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74  3: (!start_const
1b730 72 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45  raints && startE
1b740 71 20 26 26 20 20 20 62 52 65 76 29 20 2a 2f 0a  q &&   bRev) */.
1b750 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c        OP_SeekGt,
1b760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34 3a             /* 4:
1b770 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69   (start_constrai
1b780 6e 74 73 20 20 26 26 20 21 73 74 61 72 74 45 71  nts  && !startEq
1b790 20 26 26 20 21 62 52 65 76 29 20 2a 2f 0a 20 20   && !bRev) */.  
1b7a0 20 20 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20      OP_SeekLt,  
1b7b0 20 20 20 20 20 20 20 20 20 2f 2a 20 35 3a 20 28           /* 5: (
1b7c0 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b7d0 73 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26  s  && !startEq &
1b7e0 26 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20 20  &  bRev) */.    
1b7f0 20 20 4f 50 5f 53 65 65 6b 47 65 2c 20 20 20 20    OP_SeekGe,    
1b800 20 20 20 20 20 20 20 2f 2a 20 36 3a 20 28 73 74         /* 6: (st
1b810 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20  art_constraints 
1b820 20 26 26 20 20 73 74 61 72 74 45 71 20 26 26 20   &&  startEq && 
1b830 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1b840 4f 50 5f 53 65 65 6b 4c 65 20 20 20 20 20 20 20  OP_SeekLe       
1b850 20 20 20 20 20 2f 2a 20 37 3a 20 28 73 74 61 72       /* 7: (star
1b860 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26  t_constraints  &
1b870 26 20 20 73 74 61 72 74 45 71 20 26 26 20 20 62  &  startEq &&  b
1b880 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1b890 20 20 20 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20     int aEndOp[] 
1b8a0 3d 20 7b 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f  = {.      OP_Noo
1b8b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
1b8c0 2a 20 30 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74  * 0: (!end_const
1b8d0 72 61 69 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20  raints) */.     
1b8e0 20 4f 50 5f 49 64 78 47 45 2c 20 20 20 20 20 20   OP_IdxGE,      
1b8f0 20 20 20 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64        /* 1: (end
1b900 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20  _constraints && 
1b910 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1b920 4f 50 5f 49 64 78 4c 54 20 20 20 20 20 20 20 20  OP_IdxLT        
1b930 20 20 20 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f       /* 2: (end_
1b940 63 6f 6e 73 74 72 61 69 6e 74 73 20 26 26 20 62  constraints && b
1b950 52 65 76 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20  Rev) */.    };. 
1b960 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
1b970 76 65 6c 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20  vel->plan.nEq;. 
1b980 20 20 20 69 6e 74 20 69 73 4d 69 6e 51 75 65 72     int isMinQuer
1b990 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
1b9a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
1b9b0 20 6f 70 74 69 6d 69 7a 65 64 20 53 45 4c 45 43   optimized SELEC
1b9c0 54 20 6d 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20  T min(x).. */.  
1b9d0 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20    int regBase;  
1b9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b9f0 2a 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20  * Base register 
1ba00 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69  holding constrai
1ba10 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20  nt values */.   
1ba20 20 69 6e 74 20 72 31 3b 20 20 20 20 20 20 20 20   int r1;        
1ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba40 20 54 65 6d 70 20 72 65 67 69 73 74 65 72 20 2a   Temp register *
1ba50 2f 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20  /.    WhereTerm 
1ba60 2a 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 30  *pRangeStart = 0
1ba70 3b 20 20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79  ;  /* Inequality
1ba80 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 72   constraint at r
1ba90 61 6e 67 65 20 73 74 61 72 74 20 2a 2f 0a 20 20  ange start */.  
1baa0 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52 61    WhereTerm *pRa
1bab0 6e 67 65 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f  ngeEnd = 0;    /
1bac0 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  * Inequality con
1bad0 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67 65  straint at range
1bae0 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20   end */.    int 
1baf0 73 74 61 72 74 45 71 3b 20 20 20 20 20 20 20 20  startEq;        
1bb00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
1bb10 20 69 66 20 72 61 6e 67 65 20 73 74 61 72 74 20   if range start 
1bb20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c  uses ==, >= or <
1bb30 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64  = */.    int end
1bb40 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
1bb50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1bb60 20 72 61 6e 67 65 20 65 6e 64 20 75 73 65 73 20   range end uses 
1bb70 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a  ==, >= or <= */.
1bb80 20 20 20 20 69 6e 74 20 73 74 61 72 74 5f 63 6f      int start_co
1bb90 6e 73 74 72 61 69 6e 74 73 3b 20 20 20 20 20 20  nstraints;      
1bba0 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 72 61 6e   /* Start of ran
1bbb0 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  ge is constraine
1bbc0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f  d */.    int nCo
1bbd0 6e 73 74 72 61 69 6e 74 3b 20 20 20 20 20 20 20  nstraint;       
1bbe0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1bbf0 6f 66 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65  of constraint te
1bc00 72 6d 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  rms */.    Index
1bc10 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
1bc20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65 20  /* The index we 
1bc30 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f  will be using */
1bc40 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75 72  .    int iIdxCur
1bc50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
1bc60 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
1bc70 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
1bc80 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
1bc90 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72  = 0;   /* Number
1bca0 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73 74   of extra regist
1bcb0 65 72 73 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20  ers needed */.  
1bcc0 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20    int op;       
1bcd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 74 72 75         /* Instru
1bce0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a  ction opcode */.
1bcf0 20 20 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 0a      char *zAff;.
1bd00 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
1bd10 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
1bd20 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20 70  .    iIdxCur = p
1bd30 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
1bd40 20 20 20 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69      k = pIdx->ai
1bd50 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20  Column[nEq];    
1bd60 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69   /* Column for i
1bd70 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1bd80 61 69 6e 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a  aints */..    /*
1bd90 20 49 66 20 74 68 69 73 20 6c 6f 6f 70 20 73 61   If this loop sa
1bda0 74 69 73 66 69 65 73 20 61 20 73 6f 72 74 20 6f  tisfies a sort o
1bdb0 72 64 65 72 20 28 70 4f 72 64 65 72 42 79 29 20  rder (pOrderBy) 
1bdc0 72 65 71 75 65 73 74 20 74 68 61 74 20 0a 20 20  request that .  
1bdd0 20 20 2a 2a 20 77 61 73 20 70 61 73 73 65 64 20    ** was passed 
1bde0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
1bdf0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20   to implement a 
1be00 22 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e  "SELECT min(x) .
1be10 2e 2e 22 20 0a 20 20 20 20 2a 2a 20 71 75 65 72  .." .    ** quer
1be20 79 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  y, then the call
1be30 65 72 20 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c  er will only all
1be40 6f 77 20 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72  ow the loop to r
1be50 75 6e 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20  un for.    ** a 
1be60 73 69 6e 67 6c 65 20 69 74 65 72 61 74 69 6f 6e  single iteration
1be70 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
1be80 74 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 20  t the first row 
1be90 72 65 74 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20  returned.    ** 
1bea0 73 68 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20  should not have 
1beb0 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f  a NULL value sto
1bec0 72 65 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63  red in 'x'. If c
1bed0 6f 6c 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20  olumn 'x' is.   
1bee0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
1bef0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
1bf00 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1bf10 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
1bf20 78 2c 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 72  x,.    ** this r
1bf30 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73 70 65  equires some spe
1bf40 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20  cial handling.. 
1bf50 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 77     */.    if( (w
1bf60 63 74 72 6c 46 6c 61 67 73 26 57 48 45 52 45 5f  ctrlFlags&WHERE_
1bf70 4f 52 44 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a  ORDERBY_MIN)!=0.
1bf80 20 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d       && (pLevel-
1bf90 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 26 57 48  >plan.wsFlags&WH
1bfa0 45 52 45 5f 4f 52 44 45 52 42 59 29 0a 20 20 20  ERE_ORDERBY).   
1bfb0 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
1bfc0 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a  umn>nEq).    ){.
1bfd0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1bfe0 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
1bff0 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20  ==1 ); */.      
1c000 2f 2a 20 61 73 73 65 72 74 28 20 70 4f 72 64 65  /* assert( pOrde
1c010 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
1c020 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
1c030 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b  aiColumn[nEq] );
1c040 20 2a 2f 0a 20 20 20 20 20 20 69 73 4d 69 6e 51   */.      isMinQ
1c050 75 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  uery = 1;.      
1c060 6e 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20  nExtraReg = 1;. 
1c070 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e     }..    /* Fin
1c080 64 20 61 6e 79 20 69 6e 65 71 75 61 6c 69 74 79  d any inequality
1c090 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d   constraint term
1c0a0 73 20 66 6f 72 20 74 68 65 20 73 74 61 72 74 20  s for the start 
1c0b0 61 6e 64 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20  and end .    ** 
1c0c0 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20 0a 20  of the range. . 
1c0d0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1c0e0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1c0f0 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c  gs & WHERE_TOP_L
1c100 49 4d 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52  IMIT ){.      pR
1c110 61 6e 67 65 45 6e 64 20 3d 20 66 69 6e 64 54 65  angeEnd = findTe
1c120 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
1c130 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c   notReady, (WO_L
1c140 54 7c 57 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b  T|WO_LE), pIdx);
1c150 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1c160 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1c170 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
1c180 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1c190 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  _BTM_LIMIT ){.  
1c1a0 20 20 20 20 70 52 61 6e 67 65 53 74 61 72 74 20      pRangeStart 
1c1b0 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1c1c0 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
1c1d0 79 2c 20 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29  y, (WO_GT|WO_GE)
1c1e0 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
1c1f0 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1c200 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65    }..    /* Gene
1c210 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
1c220 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72  luate all constr
1c230 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67  aint terms using
1c240 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a   == or IN.    **
1c250 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 76   and store the v
1c260 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
1c270 65 72 6d 73 20 69 6e 20 61 6e 20 61 72 72 61 79  erms in an array
1c280 20 6f 66 20 72 65 67 69 73 74 65 72 73 0a 20 20   of registers.  
1c290 20 20 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74    ** starting at
1c2a0 20 72 65 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f   regBase..    */
1c2b0 0a 20 20 20 20 72 65 67 42 61 73 65 20 3d 20 63  .    regBase = c
1c2c0 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
1c2d0 72 6d 73 28 0a 20 20 20 20 20 20 20 20 70 50 61  rms(.        pPa
1c2e0 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43  rse, pLevel, pWC
1c2f0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 6e 45 78 74  , notReady, nExt
1c300 72 61 52 65 67 2c 20 26 7a 41 66 66 0a 20 20 20  raReg, &zAff.   
1c310 20 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74 20   );.    addrNxt 
1c320 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78  = pLevel->addrNx
1c330 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  t;..    /* If we
1c340 20 61 72 65 20 64 6f 69 6e 67 20 61 20 72 65 76   are doing a rev
1c350 65 72 73 65 20 6f 72 64 65 72 20 73 63 61 6e 20  erse order scan 
1c360 6f 6e 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20  on an ascending 
1c370 69 6e 64 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a  index, or.    **
1c380 20 61 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72   a forward order
1c390 20 73 63 61 6e 20 6f 6e 20 61 20 64 65 73 63 65   scan on a desce
1c3a0 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74  nding index, int
1c3b0 65 72 63 68 61 6e 67 65 20 74 68 65 20 0a 20 20  erchange the .  
1c3c0 20 20 2a 2a 20 73 74 61 72 74 20 61 6e 64 20 65    ** start and e
1c3d0 6e 64 20 74 65 72 6d 73 20 28 70 52 61 6e 67 65  nd terms (pRange
1c3e0 53 74 61 72 74 20 61 6e 64 20 70 52 61 6e 67 65  Start and pRange
1c3f0 45 6e 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  End)..    */.   
1c400 20 69 66 28 20 62 52 65 76 3d 3d 28 70 49 64 78   if( bRev==(pIdx
1c410 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71  ->aSortOrder[nEq
1c420 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43  ]==SQLITE_SO_ASC
1c430 29 20 29 7b 0a 20 20 20 20 20 20 53 57 41 50 28  ) ){.      SWAP(
1c440 57 68 65 72 65 54 65 72 6d 20 2a 2c 20 70 52 61  WhereTerm *, pRa
1c450 6e 67 65 45 6e 64 2c 20 70 52 61 6e 67 65 53 74  ngeEnd, pRangeSt
1c460 61 72 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  art);.    }..   
1c470 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67   testcase( pRang
1c480 65 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65  eStart && pRange
1c490 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72  Start->eOperator
1c4a0 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20   & WO_LE );.    
1c4b0 74 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65  testcase( pRange
1c4c0 53 74 61 72 74 20 26 26 20 70 52 61 6e 67 65 53  Start && pRangeS
1c4d0 74 61 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20  tart->eOperator 
1c4e0 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74  & WO_GE );.    t
1c4f0 65 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 45  estcase( pRangeE
1c500 6e 64 20 26 26 20 70 52 61 6e 67 65 45 6e 64 2d  nd && pRangeEnd-
1c510 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
1c520 4c 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  LE );.    testca
1c530 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20 26 26  se( pRangeEnd &&
1c540 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65   pRangeEnd->eOpe
1c550 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b  rator & WO_GE );
1c560 0a 20 20 20 20 73 74 61 72 74 45 71 20 3d 20 21  .    startEq = !
1c570 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 70  pRangeStart || p
1c580 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f 70 65  RangeStart->eOpe
1c590 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57  rator & (WO_LE|W
1c5a0 4f 5f 47 45 29 3b 0a 20 20 20 20 65 6e 64 45 71  O_GE);.    endEq
1c5b0 20 3d 20 20 20 21 70 52 61 6e 67 65 45 6e 64 20   =   !pRangeEnd 
1c5c0 7c 7c 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  || pRangeEnd->eO
1c5d0 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
1c5e0 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 73 74 61  |WO_GE);.    sta
1c5f0 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1c600 20 70 52 61 6e 67 65 53 74 61 72 74 20 7c 7c 20   pRangeStart || 
1c610 6e 45 71 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53  nEq>0;..    /* S
1c620 65 65 6b 20 74 68 65 20 69 6e 64 65 78 20 63 75  eek the index cu
1c630 72 73 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rsor to the star
1c640 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 2e 20  t of the range. 
1c650 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  */.    nConstrai
1c660 6e 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66  nt = nEq;.    if
1c670 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 29 7b  ( pRangeStart ){
1c680 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
1c690 67 68 74 20 3d 20 70 52 61 6e 67 65 53 74 61 72  ght = pRangeStar
1c6a0 74 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t->pExpr->pRight
1c6b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1c6c0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
1c6d0 70 52 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b  pRight, regBase+
1c6e0 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nEq);.      sqli
1c6f0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1c700 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42   OP_IsNull, regB
1c710 61 73 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74  ase+nEq, addrNxt
1c720 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66  );.      if( zAf
1c730 66 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  f .       && sql
1c740 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
1c750 69 74 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66  ity(pRight, zAff
1c760 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 29 3d 3d  [nConstraint])==
1c770 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a  SQLITE_AFF_NONE.
1c780 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
1c790 20 2f 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f   /* Since the co
1c7a0 6d 70 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62  mparison is to b
1c7b0 65 20 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68  e performed with
1c7c0 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20   no conversions 
1c7d0 61 70 70 6c 69 65 64 0a 20 20 20 20 20 20 20 20  applied.        
1c7e0 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e  ** to the operan
1c7f0 64 73 2c 20 73 65 74 20 74 68 65 20 61 66 66 69  ds, set the affi
1c800 6e 69 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f  nity to apply to
1c810 20 70 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20   pRight to .    
1c820 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46      ** SQLITE_AF
1c830 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20  F_NONE.  */.    
1c840 20 20 20 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72      zAff[nConstr
1c850 61 69 6e 74 5d 20 3d 20 53 51 4c 49 54 45 5f 41  aint] = SQLITE_A
1c860 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  FF_NONE;.      }
1c870 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69  .      nConstrai
1c880 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  nt++;.    }else 
1c890 69 66 28 20 69 73 4d 69 6e 51 75 65 72 79 20 29  if( isMinQuery )
1c8a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c8b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1c8c0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
1c8d0 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f  +nEq);.      nCo
1c8e0 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20  nstraint++;.    
1c8f0 20 20 73 74 61 72 74 45 71 20 3d 20 30 3b 0a 20    startEq = 0;. 
1c900 20 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74       start_const
1c910 72 61 69 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20  raints = 1;.    
1c920 7d 0a 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41  }.    codeApplyA
1c930 66 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20  ffinity(pParse, 
1c940 72 65 67 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72  regBase, nConstr
1c950 61 69 6e 74 2c 20 7a 41 66 66 29 3b 0a 20 20 20  aint, zAff);.   
1c960 20 6f 70 20 3d 20 61 53 74 61 72 74 4f 70 5b 28   op = aStartOp[(
1c970 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1c980 73 3c 3c 32 29 20 2b 20 28 73 74 61 72 74 45 71  s<<2) + (startEq
1c990 3c 3c 31 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20  <<1) + bRev];.  
1c9a0 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 30 20    assert( op!=0 
1c9b0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1c9c0 20 6f 70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29   op==OP_Rewind )
1c9d0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c9e0 6f 70 3d 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20  op==OP_Last );. 
1c9f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1ca00 3d 4f 50 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20  =OP_SeekGt );.  
1ca10 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1ca20 4f 50 5f 53 65 65 6b 47 65 20 29 3b 0a 20 20 20  OP_SeekGe );.   
1ca30 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1ca40 50 5f 53 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20  P_SeekLe );.    
1ca50 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
1ca60 5f 53 65 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73  _SeekLt );.    s
1ca70 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1ca80 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
1ca90 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73   addrNxt, regBas
1caa0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1cab0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1cac0 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e  _INT_TO_PTR(nCon
1cad0 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54  straint), P4_INT
1cae0 33 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  32);..    /* Loa
1caf0 64 20 74 68 65 20 76 61 6c 75 65 20 66 6f 72 20  d the value for 
1cb00 74 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  the inequality c
1cb10 6f 6e 73 74 72 61 69 6e 74 20 61 74 20 74 68 65  onstraint at the
1cb20 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 20 20   end of the.    
1cb30 2a 2a 20 72 61 6e 67 65 20 28 69 66 20 61 6e 79  ** range (if any
1cb40 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43  )..    */.    nC
1cb50 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b  onstraint = nEq;
1cb60 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65 45  .    if( pRangeE
1cb70 6e 64 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72  nd ){.      Expr
1cb80 20 2a 70 52 69 67 68 74 20 3d 20 70 52 61 6e 67   *pRight = pRang
1cb90 65 45 6e 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69  eEnd->pExpr->pRi
1cba0 67 68 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ght;.      sqlit
1cbb0 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76  e3ExprCacheRemov
1cbc0 65 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  e(pParse, regBas
1cbd0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73 71  e+nEq);.      sq
1cbe0 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
1cbf0 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20 72 65  arse, pRight, re
1cc00 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20  gBase+nEq);.    
1cc10 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1cc20 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c  Op2(v, OP_IsNull
1cc30 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 61  , regBase+nEq, a
1cc40 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20 7a  ddrNxt);.      z
1cc50 41 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Aff = sqlite3DbS
1cc60 74 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62  trDup(pParse->db
1cc70 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 69  , zAff);.      i
1cc80 66 28 20 7a 41 66 66 20 0a 20 20 20 20 20 20 20  f( zAff .       
1cc90 26 26 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72  && sqlite3Compar
1cca0 65 41 66 66 69 6e 69 74 79 28 70 52 69 67 68 74  eAffinity(pRight
1ccb0 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69  , zAff[nConstrai
1ccc0 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nt])==SQLITE_AFF
1ccd0 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 29 7b 0a 20  _NONE.      ){. 
1cce0 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
1ccf0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
1cd00 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72 6d 65  s to be performe
1cd10 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72  d with no conver
1cd20 73 69 6f 6e 73 20 61 70 70 6c 69 65 64 0a 20 20  sions applied.  
1cd30 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
1cd40 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20 74 68  operands, set th
1cd50 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 61 70  e affinity to ap
1cd60 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20 74 6f  ply to pRight to
1cd70 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c   .        ** SQL
1cd80 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a  ITE_AFF_NONE.  *
1cd90 2f 0a 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6e  /.        zAff[n
1cda0 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20 53 51  Constraint] = SQ
1cdb0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
1cdc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 64       }.      cod
1cdd0 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70  eApplyAffinity(p
1cde0 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c 20  Parse, regBase, 
1cdf0 6e 45 71 2b 31 2c 20 7a 41 66 66 29 3b 0a 20 20  nEq+1, zAff);.  
1ce00 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
1ce10 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
1ce20 20 54 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70   Top of the loop
1ce30 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65   body */.    pLe
1ce40 76 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65  vel->p2 = sqlite
1ce50 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1ce60 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  (v);..    /* Che
1ce70 63 6b 20 69 66 20 74 68 65 20 69 6e 64 65 78 20  ck if the index 
1ce80 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 20 74  cursor is past t
1ce90 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  he end of the ra
1cea0 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d  nge. */.    op =
1ceb0 20 61 45 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45   aEndOp[(pRangeE
1cec0 6e 64 20 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20  nd || nEq) * (1 
1ced0 2b 20 62 52 65 76 29 5d 3b 0a 20 20 20 20 74 65  + bRev)];.    te
1cee0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e  stcase( op==OP_N
1cef0 6f 6f 70 20 29 3b 0a 20 20 20 20 74 65 73 74 63  oop );.    testc
1cf00 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47  ase( op==OP_IdxG
1cf10 45 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  E );.    testcas
1cf20 65 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20  e( op==OP_IdxLT 
1cf30 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 21 3d 4f  );.    if( op!=O
1cf40 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
1cf50 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1cf60 34 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72  4(v, op, iIdxCur
1cf70 2c 20 61 64 64 72 4e 78 74 2c 20 72 65 67 42 61  , addrNxt, regBa
1cf80 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1cfa0 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43  TE_INT_TO_PTR(nC
1cfb0 6f 6e 73 74 72 61 69 6e 74 29 2c 20 50 34 5f 49  onstraint), P4_I
1cfc0 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 73 71 6c  NT32);.      sql
1cfd0 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
1cfe0 28 76 2c 20 65 6e 64 45 71 21 3d 62 52 65 76 20  (v, endEq!=bRev 
1cff0 3f 31 3a 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ?1:0);.    }..  
1d000 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
1d010 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e  e inequality con
1d020 73 74 72 61 69 6e 74 73 2c 20 63 68 65 63 6b 20  straints, check 
1d030 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 0a 20  that the value. 
1d040 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62     ** of the tab
1d050 6c 65 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74  le column that t
1d060 68 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  he inequality co
1d070 6e 74 72 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e  ntrains is not N
1d080 55 4c 4c 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69  ULL..    ** If i
1d090 74 20 69 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68  t is, jump to th
1d0a0 65 20 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e  e next iteration
1d0b0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
1d0c0 20 20 2a 2f 0a 20 20 20 20 72 31 20 3d 20 73 71    */.    r1 = sq
1d0d0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1d0e0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 74 65 73  pParse);.    tes
1d0f0 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
1d100 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1d110 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b  ERE_BTM_LIMIT );
1d120 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1d130 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1d140 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50 5f  ags & WHERE_TOP_
1d150 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 69 66 28  LIMIT );.    if(
1d160 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
1d170 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f 42  Flags & (WHERE_B
1d180 54 4d 5f 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54  TM_LIMIT|WHERE_T
1d190 4f 50 5f 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20  OP_LIMIT) ){.   
1d1a0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1d1b0 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
1d1c0 6e 2c 20 69 49 64 78 43 75 72 2c 20 6e 45 71 2c  n, iIdxCur, nEq,
1d1d0 20 72 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69   r1);.      sqli
1d1e0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1d1f0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20   OP_IsNull, r1, 
1d200 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d  addrCont);.    }
1d210 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65  .    sqlite3Rele
1d220 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1d230 65 2c 20 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  e, r1);..    /* 
1d240 53 65 65 6b 20 74 68 65 20 74 61 62 6c 65 20 63  Seek the table c
1d250 75 72 73 6f 72 2c 20 69 66 20 72 65 71 75 69 72  ursor, if requir
1d260 65 64 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c  ed */.    disabl
1d270 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52  eTerm(pLevel, pR
1d280 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20 20 20  angeStart);.    
1d290 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
1d2a0 65 6c 2c 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a  el, pRangeEnd);.
1d2b0 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
1d2c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 52 6f 77  le ){.      iRow
1d2d0 69 64 52 65 67 20 3d 20 69 52 65 6c 65 61 73 65  idReg = iRelease
1d2e0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
1d2f0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1d300 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
1d310 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
1d320 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
1d330 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1d340 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1d350 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1d360 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1d370 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1d380 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1d390 76 2c 20 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72  v, OP_Seek, iCur
1d3a0 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 20 20 2f  , iRowidReg);  /
1d3b0 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
1d3c0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  */.    }..    /*
1d3d0 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73 74   Record the inst
1d3e0 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f 20  ruction used to 
1d3f0 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
1d400 6f 70 2e 20 44 69 73 61 62 6c 65 20 0a 20 20 20  op. Disable .   
1d410 20 2a 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65   ** WHERE clause
1d420 20 74 65 72 6d 73 20 6d 61 64 65 20 72 65 64 75   terms made redu
1d430 6e 64 61 6e 74 20 62 79 20 74 68 65 20 69 6e 64  ndant by the ind
1d440 65 78 20 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20  ex range scan.. 
1d450 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c     */.    pLevel
1d460 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
1d470 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
1d480 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20  .    pLevel->p1 
1d490 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c  = iIdxCur;.  }el
1d4a0 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  se..#ifndef SQLI
1d4b0 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d  TE_OMIT_OR_OPTIM
1d4c0 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c  IZATION.  if( pL
1d4d0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1d4e0 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54 49  gs & WHERE_MULTI
1d4f0 5f 4f 52 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _OR ){.    /* Ca
1d500 73 65 20 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f  se 4:  Two or mo
1d510 72 65 20 73 65 70 61 72 61 74 65 6c 79 20 69 6e  re separately in
1d520 64 65 78 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e  dexed terms conn
1d530 65 63 74 65 64 20 62 79 20 4f 52 0a 20 20 20 20  ected by OR.    
1d540 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c  **.    ** Exampl
1d550 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e:.    **.    **
1d560 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1d570 74 31 28 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20  t1(a,b,c,d);.   
1d580 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1d590 45 58 20 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a  EX i1 ON t1(a);.
1d5a0 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1d5b0 49 4e 44 45 58 20 69 32 20 4f 4e 20 74 31 28 62  INDEX i2 ON t1(b
1d5c0 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41  );.    **   CREA
1d5d0 54 45 20 49 4e 44 45 58 20 69 33 20 4f 4e 20 74  TE INDEX i3 ON t
1d5e0 31 28 63 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  1(c);.    **.   
1d5f0 20 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46   **   SELECT * F
1d600 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3d 35  ROM t1 WHERE a=5
1d610 20 4f 52 20 62 3d 37 20 4f 52 20 28 63 3d 31 31   OR b=7 OR (c=11
1d620 20 41 4e 44 20 64 3d 31 33 29 0a 20 20 20 20 2a   AND d=13).    *
1d630 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68 65 20  *.    ** In the 
1d640 65 78 61 6d 70 6c 65 2c 20 74 68 65 72 65 20 61  example, there a
1d650 72 65 20 74 68 72 65 65 20 69 6e 64 65 78 65 64  re three indexed
1d660 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64   terms connected
1d670 20 62 79 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54   by OR..    ** T
1d680 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f  he top of the lo
1d690 6f 70 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68  op looks like th
1d6a0 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  is:.    **.    *
1d6b0 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c 20  *          Null 
1d6c0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
1d6d0 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74 68         # Zero th
1d6e0 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67 20  e rowset in reg 
1d6f0 31 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  1.    **.    ** 
1d700 54 68 65 6e 2c 20 66 6f 72 20 65 61 63 68 20 69  Then, for each i
1d710 6e 64 65 78 65 64 20 74 65 72 6d 2c 20 74 68 65  ndexed term, the
1d720 20 66 6f 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20   following. The 
1d730 61 72 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20  arguments to.   
1d740 20 2a 2a 20 52 6f 77 53 65 74 54 65 73 74 20 61   ** RowSetTest a
1d750 72 65 20 73 75 63 68 20 74 68 61 74 20 74 68 65  re such that the
1d760 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 63 75   rowid of the cu
1d770 72 72 65 6e 74 20 72 6f 77 20 69 73 20 69 6e 73  rrent row is ins
1d780 65 72 74 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74  erted.    ** int
1d790 6f 20 74 68 65 20 52 6f 77 53 65 74 2e 20 49 66  o the RowSet. If
1d7a0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 70   it is already p
1d7b0 72 65 73 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20  resent, control 
1d7c0 73 6b 69 70 73 20 74 68 65 0a 20 20 20 20 2a 2a  skips the.    **
1d7d0 20 47 6f 73 75 62 20 6f 70 63 6f 64 65 20 61 6e   Gosub opcode an
1d7e0 64 20 6a 75 6d 70 73 20 73 74 72 61 69 67 68 74  d jumps straight
1d7f0 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e   to the code gen
1d800 65 72 61 74 65 64 20 62 79 20 57 68 65 72 65 45  erated by WhereE
1d810 6e 64 28 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nd()..    **.   
1d820 20 2a 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74   **        sqlit
1d830 65 33 57 68 65 72 65 42 65 67 69 6e 28 3c 74 65  e3WhereBegin(<te
1d840 72 6d 3e 29 0a 20 20 20 20 2a 2a 20 20 20 20 20  rm>).    **     
1d850 20 20 20 20 20 52 6f 77 53 65 74 54 65 73 74 20       RowSetTest 
1d860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d870 20 23 20 49 6e 73 65 72 74 20 72 6f 77 69 64 20   # Insert rowid 
1d880 69 6e 74 6f 20 72 6f 77 73 65 74 0a 20 20 20 20  into rowset.    
1d890 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f 73 75  **          Gosu
1d8a0 62 20 20 20 20 20 20 32 20 41 0a 20 20 20 20 2a  b      2 A.    *
1d8b0 2a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  *        sqlite3
1d8c0 57 68 65 72 65 45 6e 64 28 29 0a 20 20 20 20 2a  WhereEnd().    *
1d8d0 2a 0a 20 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69  *.    ** Followi
1d8e0 6e 67 20 74 68 65 20 61 62 6f 76 65 2c 20 63 6f  ng the above, co
1d8f0 64 65 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  de to terminate 
1d900 74 68 65 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20  the loop. Label 
1d910 41 2c 20 74 68 65 20 74 61 72 67 65 74 0a 20 20  A, the target.  
1d920 20 20 2a 2a 20 6f 66 20 74 68 65 20 47 6f 73 75    ** of the Gosu
1d930 62 20 61 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74  b above, jumps t
1d940 6f 20 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f  o the instructio
1d950 6e 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  n right after th
1d960 65 20 47 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20  e Goto..    **. 
1d970 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e     **          N
1d980 75 6c 6c 20 20 20 20 20 20 20 31 20 20 20 20 20  ull       1     
1d990 20 20 20 20 20 20 20 20 20 20 20 23 20 5a 65 72             # Zer
1d9a0 6f 20 74 68 65 20 72 6f 77 73 65 74 20 69 6e 20  o the rowset in 
1d9b0 72 65 67 20 31 0a 20 20 20 20 2a 2a 20 20 20 20  reg 1.    **    
1d9c0 20 20 20 20 20 20 47 6f 74 6f 20 20 20 20 20 20        Goto      
1d9d0 20 42 20 20 20 20 20 20 20 20 20 20 20 20 20 20   B              
1d9e0 20 20 23 20 54 68 65 20 6c 6f 6f 70 20 69 73 20    # The loop is 
1d9f0 66 69 6e 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a  finished..    **
1da00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 41 3a  .    **       A:
1da10 20 3c 6c 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20   <loop body>    
1da20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 52               # R
1da30 65 74 75 72 6e 20 64 61 74 61 2c 20 77 68 61 74  eturn data, what
1da40 65 76 65 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ever..    **.   
1da50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 65 74   **          Ret
1da60 75 72 6e 20 20 20 20 20 32 20 20 20 20 20 20 20  urn     2       
1da70 20 20 20 20 20 20 20 20 20 23 20 4a 75 6d 70 20           # Jump 
1da80 62 61 63 6b 20 74 6f 20 74 68 65 20 47 6f 73 75  back to the Gosu
1da90 62 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  b.    **.    ** 
1daa0 20 20 20 20 20 20 42 3a 20 3c 61 66 74 65 72 20        B: <after 
1dab0 74 68 65 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a  the loop>.    **
1dac0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 57 68 65 72  .    */.    Wher
1dad0 65 43 6c 61 75 73 65 20 2a 70 4f 72 57 63 3b 20  eClause *pOrWc; 
1dae0 20 20 20 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61     /* The OR-cla
1daf0 75 73 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69  use broken out i
1db00 6e 74 6f 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a  nto subterms */.
1db10 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
1db20 46 69 6e 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69  Final;     /* Fi
1db30 6e 61 6c 20 73 75 62 74 65 72 6d 20 77 69 74 68  nal subterm with
1db40 69 6e 20 74 68 65 20 4f 52 2d 63 6c 61 75 73 65  in the OR-clause
1db50 2e 20 2a 2f 0a 20 20 20 20 53 72 63 4c 69 73 74  . */.    SrcList
1db60 20 6f 6e 65 54 61 62 3b 20 20 20 20 20 20 20 20   oneTab;        
1db70 2f 2a 20 53 68 6f 72 74 65 6e 65 64 20 74 61 62  /* Shortened tab
1db80 6c 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20  le list */..    
1db90 69 6e 74 20 72 65 67 52 65 74 75 72 6e 20 3d 20  int regReturn = 
1dba0 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20  ++pParse->nMem; 
1dbb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1dbc0 69 73 74 65 72 20 75 73 65 64 20 77 69 74 68 20  ister used with 
1dbd0 4f 50 5f 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20  OP_Gosub */.    
1dbe0 69 6e 74 20 72 65 67 52 6f 77 73 65 74 20 3d 20  int regRowset = 
1dbf0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1dc00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
1dc10 69 73 74 65 72 20 66 6f 72 20 52 6f 77 53 65 74  ister for RowSet
1dc20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69   object */.    i
1dc30 6e 74 20 72 65 67 52 6f 77 69 64 20 3d 20 30 3b  nt regRowid = 0;
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
1dc60 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77  ster holding row
1dc70 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  id */.    int iL
1dc80 6f 6f 70 42 6f 64 79 20 3d 20 73 71 6c 69 74 65  oopBody = sqlite
1dc90 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1dca0 29 3b 20 20 2f 2a 20 53 74 61 72 74 20 6f 66 20  );  /* Start of 
1dcb0 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20  loop body */.   
1dcc0 20 69 6e 74 20 69 52 65 74 49 6e 69 74 3b 20 20   int iRetInit;  
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1dcf0 64 72 65 73 73 20 6f 66 20 72 65 67 52 65 74 75  dress of regRetu
1dd00 72 6e 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69  rn init */.    i
1dd10 6e 74 20 69 69 3b 0a 20 20 20 0a 20 20 20 20 70  nt ii;.   .    p
1dd20 54 65 72 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  Term = pLevel->p
1dd30 6c 61 6e 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20  lan.u.pTerm;.   
1dd40 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
1dd50 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1dd60 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
1dd70 72 3d 3d 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20  r==WO_OR );.    
1dd80 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
1dd90 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f  wtFlags & TERM_O
1dda0 52 49 4e 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20  RINFO)!=0 );.   
1ddb0 20 70 4f 72 57 63 20 3d 20 26 70 54 65 72 6d 2d   pOrWc = &pTerm-
1ddc0 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a  >u.pOrInfo->wc;.
1ddd0 20 20 20 20 70 46 69 6e 61 6c 20 3d 20 26 70 4f      pFinal = &pO
1dde0 72 57 63 2d 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54  rWc->a[pOrWc->nT
1ddf0 65 72 6d 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20  erm-1];..    /* 
1de00 53 65 74 20 75 70 20 61 20 53 72 63 4c 69 73 74  Set up a SrcList
1de10 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6a 75 73 74   containing just
1de20 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
1de30 20 73 63 61 6e 6e 65 64 20 62 79 20 74 68 69 73   scanned by this
1de40 20 6c 6f 6f 70 2e 20 2a 2f 0a 20 20 20 20 6f 6e   loop. */.    on
1de50 65 54 61 62 2e 6e 53 72 63 20 3d 20 31 3b 0a 20  eTab.nSrc = 1;. 
1de60 20 20 20 6f 6e 65 54 61 62 2e 6e 41 6c 6c 6f 63     oneTab.nAlloc
1de70 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62   = 1;.    oneTab
1de80 2e 61 5b 30 5d 20 3d 20 2a 70 54 61 62 49 74 65  .a[0] = *pTabIte
1de90 6d 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  m;..    /* Initi
1dea0 61 6c 69 7a 65 20 74 68 65 20 72 6f 77 73 65 74  alize the rowset
1deb0 20 72 65 67 69 73 74 65 72 20 74 6f 20 63 6f 6e   register to con
1dec0 74 61 69 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51  tain NULL. An SQ
1ded0 4c 20 4e 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a  L NULL is .    *
1dee0 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20  * equivalent to 
1def0 61 6e 20 65 6d 70 74 79 20 72 6f 77 73 65 74 2e  an empty rowset.
1df00 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
1df10 6c 73 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 72  lso initialize r
1df20 65 67 52 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74  egReturn to cont
1df30 61 69 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  ain the address 
1df40 6f 66 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  of the instructi
1df50 6f 6e 20 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64  on .    ** immed
1df60 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
1df70 20 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 20 61   the OP_Return a
1df80 74 20 74 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20  t the bottom of 
1df90 74 68 65 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20  the loop. This. 
1dfa0 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
1dfb0 64 20 69 6e 20 61 20 66 65 77 20 6f 62 73 63 75  d in a few obscu
1dfc0 72 65 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73  re LEFT JOIN cas
1dfd0 65 73 20 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c  es where control
1dfe0 20 6a 75 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76   jumps.    ** ov
1dff0 65 72 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  er the top of th
1e000 65 20 6c 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20  e loop into the 
1e010 62 6f 64 79 20 6f 66 20 69 74 2e 20 49 6e 20 74  body of it. In t
1e020 68 69 73 20 63 61 73 65 20 74 68 65 20 0a 20 20  his case the .  
1e030 20 20 2a 2a 20 63 6f 72 72 65 63 74 20 72 65 73    ** correct res
1e040 70 6f 6e 73 65 20 66 6f 72 20 74 68 65 20 65 6e  ponse for the en
1e050 64 2d 6f 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28  d-of-loop code (
1e060 74 68 65 20 4f 50 5f 52 65 74 75 72 6e 29 20 69  the OP_Return) i
1e070 73 20 74 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c  s to .    ** fal
1e080 6c 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  l through to the
1e090 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
1e0a0 6e 2c 20 6a 75 73 74 20 61 73 20 61 6e 20 4f 50  n, just as an OP
1e0b0 5f 4e 65 78 74 20 64 6f 65 73 20 69 66 0a 20 20  _Next does if.  
1e0c0 20 20 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61    ** called on a
1e0d0 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
1e0e0 63 75 72 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  cursor..    */. 
1e0f0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1e100 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1e110 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1e120 20 20 20 20 20 20 72 65 67 52 6f 77 73 65 74 20        regRowset 
1e130 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  = ++pParse->nMem
1e140 3b 0a 20 20 20 20 20 20 72 65 67 52 6f 77 69 64  ;.      regRowid
1e150 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
1e160 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1e170 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1e180 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77  _Null, 0, regRow
1e190 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  set);.    }.    
1e1a0 69 52 65 74 49 6e 69 74 20 3d 20 73 71 6c 69 74  iRetInit = sqlit
1e1b0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1e1c0 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
1e1d0 65 67 52 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20  egReturn);..    
1e1e0 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72  for(ii=0; ii<pOr
1e1f0 57 63 2d 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29  Wc->nTerm; ii++)
1e200 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  {.      WhereTer
1e210 6d 20 2a 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f  m *pOrTerm = &pO
1e220 72 57 63 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20  rWc->a[ii];.    
1e230 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c    if( pOrTerm->l
1e240 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
1e250 7c 7c 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  || pOrTerm->eOpe
1e260 72 61 74 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b  rator==WO_AND ){
1e270 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 49 6e  .        WhereIn
1e280 66 6f 20 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20  fo *pSubWInfo;  
1e290 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
1e2a0 66 6f 72 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65  for single OR-te
1e2b0 72 6d 20 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20  rm scan */.     
1e2c0 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
1e2d0 67 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  gh table entries
1e2e0 20 74 68 61 74 20 6d 61 74 63 68 20 74 65 72 6d   that match term
1e2f0 20 70 4f 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20   pOrTerm. */.   
1e300 20 20 20 20 20 70 53 75 62 57 49 6e 66 6f 20 3d       pSubWInfo =
1e310 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
1e320 69 6e 28 70 50 61 72 73 65 2c 20 26 6f 6e 65 54  in(pParse, &oneT
1e330 61 62 2c 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78  ab, pOrTerm->pEx
1e340 70 72 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  pr, 0,.         
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
1e360 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c  HERE_OMIT_OPEN |
1e370 20 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53   WHERE_OMIT_CLOS
1e380 45 20 7c 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  E | WHERE_FORCE_
1e390 54 41 42 4c 45 29 3b 0a 20 20 20 20 20 20 20 20  TABLE);.        
1e3a0 69 66 28 20 70 53 75 62 57 49 6e 66 6f 20 29 7b  if( pSubWInfo ){
1e3b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1e3c0 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1e3d0 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1e3e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1e3f0 20 20 20 20 69 6e 74 20 69 53 65 74 20 3d 20 28      int iSet = (
1e400 28 69 69 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72  (ii==pOrWc->nTer
1e410 6d 2d 31 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20  m-1)?-1:ii);.   
1e420 20 20 20 20 20 20 20 20 20 69 6e 74 20 72 3b 0a           int r;.
1e430 20 20 20 20 20 20 20 20 20 20 20 20 72 20 3d 20              r = 
1e440 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47  sqlite3ExprCodeG
1e450 65 74 43 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c  etColumn(pParse,
1e460 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c   pTabItem->pTab,
1e470 20 2d 31 2c 20 69 43 75 72 2c 20 0a 20 20 20 20   -1, iCur, .    
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4a0 20 20 20 20 20 72 65 67 52 6f 77 69 64 2c 20 30       regRowid, 0
1e4b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e4c0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1e4d0 28 76 2c 20 4f 50 5f 52 6f 77 53 65 74 54 65 73  (v, OP_RowSetTes
1e4e0 74 2c 20 72 65 67 52 6f 77 73 65 74 2c 0a 20 20  t, regRowset,.  
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e510 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
1e520 64 72 28 76 29 2b 32 2c 0a 20 20 20 20 20 20 20  dr(v)+2,.       
1e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e540 20 20 20 20 20 20 20 72 2c 20 53 51 4c 49 54 45         r, SQLITE
1e550 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 69 53 65 74  _INT_TO_PTR(iSet
1e560 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20  ), P4_INT32);.  
1e570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e580 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e590 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75  ddOp2(v, OP_Gosu
1e5a0 62 2c 20 72 65 67 52 65 74 75 72 6e 2c 20 69 4c  b, regReturn, iL
1e5b0 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20  oopBody);..     
1e5c0 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 20 74       /* Finish t
1e5d0 68 65 20 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20  he loop through 
1e5e0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
1e5f0 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
1e600 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
1e610 20 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65      sqlite3Where
1e620 45 6e 64 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a  End(pSubWInfo);.
1e630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e640 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
1e650 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
1e660 76 2c 20 69 52 65 74 49 6e 69 74 2c 20 73 71 6c  v, iRetInit, sql
1e670 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
1e680 64 64 72 28 76 29 29 3b 0a 20 20 20 20 2f 2a 20  ddr(v));.    /* 
1e690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1e6a0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1e6b0 20 72 65 67 52 6f 77 73 65 74 29 3b 20 2a 2f 0a   regRowset); */.
1e6c0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1e6d0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1e6e0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
1e6f0 72 42 72 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74  rBrk);.    sqlit
1e700 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
1e710 65 6c 28 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  el(v, iLoopBody)
1e720 3b 0a 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  ;..    pLevel->o
1e730 70 20 3d 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20  p = OP_Return;. 
1e740 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
1e750 72 65 67 52 65 74 75 72 6e 3b 0a 20 20 20 20 64  regReturn;.    d
1e760 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
1e770 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c  l, pTerm);.  }el
1e780 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
1e790 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49  ITE_OMIT_OR_OPTI
1e7a0 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b  MIZATION */..  {
1e7b0 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20  .    /* Case 5: 
1e7c0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
1e7d0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
1e7e0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
1e7f0 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  e.    **        
1e800 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
1e810 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20 20 20  tire table..    
1e820 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  */.    static co
1e830 6e 73 74 20 75 38 20 61 53 74 65 70 5b 5d 20 3d  nst u8 aStep[] =
1e840 20 7b 20 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50   { OP_Next, OP_P
1e850 72 65 76 20 7d 3b 0a 20 20 20 20 73 74 61 74 69  rev };.    stati
1e860 63 20 63 6f 6e 73 74 20 75 38 20 61 53 74 61 72  c const u8 aStar
1e870 74 5b 5d 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e  t[] = { OP_Rewin
1e880 64 2c 20 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20  d, OP_Last };.  
1e890 20 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d    assert( bRev==
1e8a0 30 20 7c 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a  0 || bRev==1 );.
1e8b0 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
1e8c0 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
1e8d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74  pLevel->op = aSt
1e8e0 65 70 5b 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c  ep[bRev];.    pL
1e8f0 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
1e900 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1e910 3d 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62  = 1 + sqlite3Vdb
1e920 65 41 64 64 4f 70 32 28 76 2c 20 61 53 74 61 72  eAddOp2(v, aStar
1e930 74 5b 62 52 65 76 5d 2c 20 69 43 75 72 2c 20 61  t[bRev], iCur, a
1e940 64 64 72 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65  ddrBrk);.    pLe
1e950 76 65 6c 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45  vel->p5 = SQLITE
1e960 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
1e970 53 43 41 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20  SCAN_STEP;.  }. 
1e980 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
1e990 74 4d 61 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b  tMask(pWC->pMask
1e9a0 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f  Set, iCur);..  /
1e9b0 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
1e9c0 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
1e9d0 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
1e9e0 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
1e9f0 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75  .  ** computed u
1ea00 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
1ea10 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
1ea20 20 20 2a 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20    */.  k = 0;.  
1ea30 66 6f 72 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61  for(pTerm=pWC->a
1ea40 2c 20 6a 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  , j=pWC->nTerm; 
1ea50 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b  j>0; j--, pTerm+
1ea60 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  +){.    Expr *pE
1ea70 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1ea80 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
1ea90 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b   TERM_VIRTUAL );
1eaa0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1eab0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1eac0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1ead0 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77 74 46    if( pTerm->wtF
1eae0 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52  lags & (TERM_VIR
1eaf0 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29  TUAL|TERM_CODED)
1eb00 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1eb10 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
1eb20 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64  reqAll & notRead
1eb30 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  y)!=0 ) continue
1eb40 3b 0a 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d  ;.    pE = pTerm
1eb50 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 61 73 73  ->pExpr;.    ass
1eb60 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
1eb70 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
1eb80 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70 72  eftJoin && !Expr
1eb90 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20  HasProperty(pE, 
1eba0 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
1ebb0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1ebc0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1ebd0 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1ebe0 72 73 65 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e  rse, pE, addrCon
1ebf0 74 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  t, SQLITE_JUMPIF
1ec00 4e 55 4c 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31  NULL);.    k = 1
1ec10 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46  ;.    pTerm->wtF
1ec20 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
1ec30 45 44 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f  ED;.  }..  /* Fo
1ec40 72 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a  r a LEFT OUTER J
1ec50 4f 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f  OIN, generate co
1ec60 64 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63  de that will rec
1ec70 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1ec80 74 0a 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20  t.  ** at least 
1ec90 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
1eca0 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
1ecb0 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
1ecc0 74 61 62 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20  table.  .  */.  
1ecd0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66  if( pLevel->iLef
1ece0 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65  tJoin ){.    pLe
1ecf0 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 20 3d  vel->addrFirst =
1ed00 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
1ed10 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
1ed20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1ed30 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(v, OP_Integer,
1ed40 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
1ed50 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64 62 65  tJoin);.    Vdbe
1ed60 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 72 65 63  Comment((v, "rec
1ed70 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69  ord LEFT JOIN hi
1ed80 74 22 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  t"));.    sqlite
1ed90 33 45 78 70 72 43 61 63 68 65 43 6c 65 61 72 28  3ExprCacheClear(
1eda0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 66 6f 72  pParse);.    for
1edb0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1edc0 3d 30 3b 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d  =0; j<pWC->nTerm
1edd0 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
1ede0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1edf0 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20   pTerm->wtFlags 
1ee00 26 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 29  & TERM_VIRTUAL )
1ee10 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1ee20 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73  ( pTerm->wtFlags
1ee30 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b   & TERM_CODED );
1ee40 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
1ee50 2d 3e 77 74 46 6c 61 67 73 20 26 20 28 54 45 52  ->wtFlags & (TER
1ee60 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
1ee70 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
1ee80 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
1ee90 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
1eea0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
1eeb0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
1eec0 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70 45  ssert( pTerm->pE
1eed0 78 70 72 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  xpr );.      sql
1eee0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1eef0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70  pParse, pTerm->p
1ef00 45 78 70 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20  Expr, addrCont, 
1ef10 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1ef20 4c 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  L);.      pTerm-
1ef30 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d  >wtFlags |= TERM
1ef40 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20  _CODED;.    }.  
1ef50 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61  }.  sqlite3Relea
1ef60 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  seTempReg(pParse
1ef70 2c 20 69 52 65 6c 65 61 73 65 52 65 67 29 3b 0a  , iReleaseReg);.
1ef80 0a 20 20 72 65 74 75 72 6e 20 6e 6f 74 52 65 61  .  return notRea
1ef90 64 79 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dy;.}..#if defin
1efa0 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1efb0 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
1efc0 69 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  ing variable hol
1efd0 64 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69  ds a text descri
1efe0 70 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70  ption of query p
1eff0 6c 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lan generated.**
1f000 20 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63   by the most rec
1f010 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
1f020 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e  te3WhereBegin().
1f030 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57    Each call to W
1f040 68 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65  hereBegin.** ove
1f050 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
1f060 69 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f  ious.  This info
1f070 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20  rmation is used 
1f080 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a  for testing and.
1f090 2a 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  ** analysis only
1f0a0 2e 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65  ..*/.char sqlite
1f0b0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53  3_query_plan[BMS
1f0c0 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74  *2*40];  /* Text
1f0d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a   of the join */.
1f0e0 73 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61  static int nQPla
1f0f0 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  n = 0;          
1f100 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65      /* Next free
1f110 20 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f   slow in _query_
1f120 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69  plan[] */..#endi
1f130 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  f /* SQLITE_TEST
1f140 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   */.../*.** Free
1f150 20 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72   a WhereInfo str
1f160 75 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63  ucture.*/.static
1f170 20 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46   void whereInfoF
1f180 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ree(sqlite3 *db,
1f190 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e   WhereInfo *pWIn
1f1a0 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66  fo){.  if( pWInf
1f1b0 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  o ){.    int i;.
1f1c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
1f1d0 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
1f1e0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1f1f0 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
1f200 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  Info = pWInfo->a
1f210 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  [i].pIdxInfo;.  
1f220 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b      if( pInfo ){
1f230 0a 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 65  .        /* asse
1f240 72 74 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  rt( pInfo->needT
1f250 6f 46 72 65 65 49 64 78 53 74 72 3d 3d 30 20 7c  oFreeIdxStr==0 |
1f260 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
1f270 65 64 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20  ed ); */.       
1f280 20 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64   if( pInfo->need
1f290 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a  ToFreeIdxStr ){.
1f2a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f2b0 33 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64  3_free(pInfo->id
1f2c0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  xStr);.        }
1f2d0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f2e0 44 62 46 72 65 65 28 64 62 2c 20 70 49 6e 66 6f  DbFree(db, pInfo
1f2f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1f300 0a 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65  .    whereClause
1f310 43 6c 65 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57  Clear(pWInfo->pW
1f320 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  C);.    sqlite3D
1f330 62 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  bFree(db, pWInfo
1f340 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
1f350 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62 65   Generate the be
1f360 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
1f370 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48 45  oop used for WHE
1f380 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
1f390 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74  sing..** The ret
1f3a0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70  urn value is a p
1f3b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61  ointer to an opa
1f3c0 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74 68  que structure th
1f3d0 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69  at contains.** i
1f3e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65  nformation neede
1f3f0 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74  d to terminate t
1f400 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c  he loop.  Later,
1f410 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1f420 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69  tine.** should i
1f430 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65  nvoke sqlite3Whe
1f440 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68 65  reEnd() with the
1f450 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1f460 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   this function.*
1f470 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
1f480 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52 45  mplete the WHERE
1f490 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
1f4a0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1f4b0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
1f4c0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1f4d0 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  ns NULL..**.** T
1f4e0 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69 73  he basic idea is
1f4f0 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20   to do a nested 
1f500 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66  loop, one loop f
1f510 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e  or each table in
1f520 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61  .** the FROM cla
1f530 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e  use of a select.
1f540 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50    (INSERT and UP
1f550 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20  DATE statements 
1f560 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20  are the.** same 
1f570 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74 68  as a SELECT with
1f580 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74   only a single t
1f590 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1f5a0 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a   clause.)  For.*
1f5b0 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  * example, if th
1f5c0 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a  e SQL is this:.*
1f5d0 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43  *.**       SELEC
1f5e0 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c  T * FROM t1, t2,
1f5f0 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a   t3 WHERE ...;.*
1f600 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f  *.** Then the co
1f610 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73 20  de generated is 
1f620 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b  conceptually lik
1f630 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  e the following:
1f640 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65  .**.**      fore
1f650 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64  ach row1 in t1 d
1f660 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64  o       \    Cod
1f670 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
1f680 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
1f690 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20  w2 in t2 do     
1f6a0 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
1f6b0 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20  hereBegin().**  
1f6c0 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
1f6d0 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20  row3 in t3 do   
1f6e0 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  /.**            
1f6f0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
1f700 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
1f710 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64          \    Cod
1f720 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20  e generated.**  
1f730 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f750 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57   |-- by sqlite3W
1f760 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20  hereEnd().**    
1f770 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a                /.
1f790 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
1f7a0 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20  the loops might 
1f7b0 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e  not be nested in
1f7c0 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68   the order in wh
1f7d0 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65  ich they.** appe
1f7e0 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  ar in the FROM c
1f7f0 6c 61 75 73 65 20 69 66 20 61 20 64 69 66 66 65  lause if a diffe
1f800 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65  rent order is be
1f810 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b  tter able to mak
1f820 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69  e.** use of indi
1f830 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20  ces.  Note also 
1f840 74 68 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e  that when the IN
1f850 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65 61 72   operator appear
1f860 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52  s in.** the WHER
1f870 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67  E clause, it mig
1f880 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64  ht result in add
1f890 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c  itional nested l
1f8a0 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e  oops for.** scan
1f8b0 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c  ning through all
1f8c0 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72   values on the r
1f8d0 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  ight-hand side o
1f8e0 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20  f the IN..**.** 
1f8f0 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65 20  There are Btree 
1f900 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74  cursors associat
1f910 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61 62  ed with each tab
1f920 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75 72  le.  t1 uses cur
1f930 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54  sor.** number pT
1f940 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75  abList->a[0].iCu
1f950 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74  rsor.  t2 uses t
1f960 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69  he cursor pTabLi
1f970 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72  st->a[1].iCursor
1f980 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74  ..** And so fort
1f990 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  h.  This routine
1f9a0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
1f9b0 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44  to open those VD
1f9c0 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e  BE cursors.** an
1f9d0 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  d sqlite3WhereEn
1f9e0 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74 68  d() generates th
1f9f0 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20  e code to close 
1fa00 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  them..**.** The 
1fa10 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74 65  code that sqlite
1fa20 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67 65  3WhereBegin() ge
1fa30 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20 74  nerates leaves t
1fa40 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64  he cursors named
1fa50 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20  .** in pTabList 
1fa60 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69  pointing at thei
1fa70 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  r appropriate en
1fa80 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e  tries.  The [...
1fa90 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73  ] code.** can us
1faa0 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20  e OP_Column and 
1fab0 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73  OP_Rowid opcodes
1fac0 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72   on these cursor
1fad0 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20  s to extract.** 
1fae0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61  data from the va
1faf0 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20  rious tables of 
1fb00 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20  the loop..**.** 
1fb10 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
1fb20 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68  use is empty, th
1fb30 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20  e foreach loops 
1fb40 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20 74  must each scan t
1fb50 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74  heir.** entire t
1fb60 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74  ables.  Thus a t
1fb70 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73  hree-way join is
1fb80 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61   an O(N^3) opera
1fb90 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a  tion.  But if.**
1fba0 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76 65   the tables have
1fbb0 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
1fbc0 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20  re are terms in 
1fbd0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1fbe0 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74   that.** refer t
1fbf0 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c  o those indices,
1fc00 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c   a complete tabl
1fc10 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76  e scan can be av
1fc20 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a  oided and the.**
1fc30 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d   code will run m
1fc40 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73  uch faster.  Mos
1fc50 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66  t of the work of
1fc60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1fc70 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20   checking.** to 
1fc80 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72 65  see if there are
1fc90 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63 61   indices that ca
1fca0 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70 65  n be used to spe
1fcb0 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a  ed up the loop..
1fcc0 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74  **.** Terms of t
1fcd0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1fce0 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f  are also used to
1fcf0 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77   limit which row
1fd00 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61  s actually.** ma
1fd10 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e  ke it to the "..
1fd20 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ." in the middle
1fd30 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41   of the loop.  A
1fd40 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65 61  fter each "forea
1fd50 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66  ch",.** terms of
1fd60 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1fd70 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20  e that use only 
1fd80 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f  terms in that lo
1fd90 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20  op and outer.** 
1fda0 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61  loops are evalua
1fdb0 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65  ted and if false
1fdc0 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20   a jump is made 
1fdd0 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65  around all subse
1fde0 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c  quent.** inner l
1fdf0 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20  oops (or around 
1fe00 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65  the "..." if the
1fe10 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69 74   test occurs wit
1fe20 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a  hin the inner-.*
1fe30 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a  * most loop).**.
1fe40 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a  ** OUTER JOINS.*
1fe50 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f  *.** An outer jo
1fe60 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20  in of tables t1 
1fe70 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70  and t2 is concep
1fe80 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66  tally coded as f
1fe90 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1fea0 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e   foreach row1 in
1feb0 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66   t1 do.**      f
1fec0 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20  lag = 0.**      
1fed0 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20  foreach row2 in 
1fee0 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20  t2 do.**        
1fef0 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20  start:.**       
1ff00 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20     ....**       
1ff10 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20     flag = 1.**  
1ff20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20      end.**      
1ff30 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a  if flag==0 then.
1ff40 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74  **        move t
1ff50 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74  he row2 cursor t
1ff60 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20  o a null row.** 
1ff70 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72         goto star
1ff80 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20  t.**      fi.** 
1ff90 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44     end.**.** ORD
1ffa0 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f  ER BY CLAUSE PRO
1ffb0 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70  CESSING.**.** *p
1ffc0 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70 6f  pOrderBy is a po
1ffd0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44  inter to the ORD
1ffe0 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20  ER BY clause of 
1fff0 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  a SELECT stateme
20000 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20  nt,.** if there 
20010 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72  is one.  If ther
20020 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59  e is no ORDER BY
20030 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68   clause or if th
20040 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
20050 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20   called from an 
20060 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
20070 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e   statement, then
20080 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55   ppOrderBy is NU
20090 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  LL..**.** If an 
200a0 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
200b0 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61  d so that the na
200c0 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64  tural output ord
200d0 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a  er of the table.
200e0 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65  ** scan is corre
200f0 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52  ct for the ORDER
20100 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e   BY clause, then
20110 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20 75   that index is u
20120 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72  sed and.** *ppOr
20130 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f 20  derBy is set to 
20140 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61  NULL.  This is a
20150 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  n optimization t
20160 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a  hat prevents an.
20170 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73  ** unnecessary s
20180 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c  ort of the resul
20190 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65  t set if an inde
201a0 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  x appropriate fo
201b0 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  r the.** ORDER B
201c0 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79  Y clause already
201d0 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49   exists..**.** I
201e0 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  f the where clau
201f0 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20  se loops cannot 
20200 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70  be arranged to p
20210 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72 65  rovide the corre
20220 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64  ct.** output ord
20230 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70  er, then the *pp
20240 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68 61  OrderBy is uncha
20250 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e  nged..*/.WhereIn
20260 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65  fo *sqlite3Where
20270 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a  Begin(.  Parse *
20280 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f  pParse,        /
20290 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e  * The parser con
202a0 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73  text */.  SrcLis
202b0 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
202c0 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c  /* A list of all
202d0 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63   tables to be sc
202e0 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20  anned */.  Expr 
202f0 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20 20  *pWhere,        
20300 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
20310 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
20320 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20  st **ppOrderBy, 
20330 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63  /* An ORDER BY c
20340 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a  lause, or NULL *
20350 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46 6c 61  /.  u16 wctrlFla
20360 67 73 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  gs        /* One
20370 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a 20   of the WHERE_* 
20380 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69 6e  flags defined in
20390 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a   sqliteInt.h */.
203a0 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
203b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203c0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
203d0 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 57 49  */.  int nByteWI
203e0 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  nfo;            
203f0 2f 2a 20 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c  /* Num. bytes al
20400 6c 6f 63 61 74 65 64 20 66 6f 72 20 57 68 65 72  located for Wher
20410 65 49 6e 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a  eInfo struct */.
20420 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49    WhereInfo *pWI
20430 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  nfo;         /* 
20440 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  Will become the 
20450 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
20460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  this function */
20470 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
20480 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a  rse->pVdbe;   /*
20490 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61 74   The virtual dat
204a0 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a  abase engine */.
204b0 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
204c0 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
204d0 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
204e0 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
204f0 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61  ned */.  WhereMa
20500 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b  skSet *pMaskSet;
20510 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
20520 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a  ssion mask set *
20530 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
20540 2a 70 57 43 3b 20 20 20 20 20 20 20 20 20 20 20  *pWC;           
20550 20 20 20 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69      /* Decomposi
20560 74 69 6f 6e 20 6f 66 20 74 68 65 20 57 48 45 52  tion of the WHER
20570 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
20580 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
20590 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a  m *pTabItem;  /*
205a0 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20   A single entry 
205b0 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f  from pTabList */
205c0 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
205d0 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
205e0 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c     /* A single l
205f0 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e  evel in the pWIn
20600 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  fo list */.  int
20610 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20   iFrom;         
20620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20630 46 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f  First unused FRO
20640 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74  M clause element
20650 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61   */.  int andFla
20660 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
20670 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69   /* AND-ed combi
20680 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57  nation of all pW
20690 43 2d 3e 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a  C->a[].wtFlags *
206a0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
206b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
206c0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
206d0 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54  ction */..  /* T
206e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61 62  he number of tab
206f0 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  les in the FROM 
20700 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65  clause is limite
20710 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72 20  d by the number 
20720 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e 20  of.  ** bits in 
20730 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a  a Bitmask .  */.
20740 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d 3e    if( pTabList->
20750 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20  nSrc>BMS ){.    
20760 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
20770 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
20780 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
20790 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20  join", BMS);.   
207a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
207b0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
207c0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  d initialize the
207d0 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
207e0 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
207f0 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72  ecome the.  ** r
20800 65 74 75 72 6e 20 76 61 6c 75 65 2e 20 41 20 73  eturn value. A s
20810 69 6e 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e  ingle allocation
20820 20 69 73 20 75 73 65 64 20 74 6f 20 73 74 6f 72   is used to stor
20830 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 0a  e the WhereInfo.
20840 20 20 2a 2a 20 73 74 72 75 63 74 2c 20 74 68 65    ** struct, the
20850 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 57 68 65   contents of Whe
20860 72 65 49 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20  reInfo.a[], the 
20870 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
20880 63 74 75 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74  cture.  ** and t
20890 68 65 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  he WhereMaskSet 
208a0 73 74 72 75 63 74 75 72 65 2e 20 53 69 6e 63 65  structure. Since
208b0 20 57 68 65 72 65 43 6c 61 75 73 65 20 63 6f 6e   WhereClause con
208c0 74 61 69 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a  tains an 8-byte.
208d0 20 20 2a 2a 20 66 69 65 6c 64 20 28 74 79 70 65    ** field (type
208e0 20 42 69 74 6d 61 73 6b 29 20 69 74 20 6d 75 73   Bitmask) it mus
208f0 74 20 62 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20  t be aligned on 
20900 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61  an 8-byte bounda
20910 72 79 20 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20  ry on.  ** some 
20920 61 72 63 68 69 74 65 63 74 75 72 65 73 2e 20 48  architectures. H
20930 65 6e 63 65 20 74 68 65 20 52 4f 55 4e 44 38 28  ence the ROUND8(
20940 29 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20  ) below..  */.  
20950 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
20960 0a 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20  .  nByteWInfo = 
20970 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 57 68  ROUND8(sizeof(Wh
20980 65 72 65 49 6e 66 6f 29 2b 28 70 54 61 62 4c 69  ereInfo)+(pTabLi
20990 73 74 2d 3e 6e 53 72 63 2d 31 29 2a 73 69 7a 65  st->nSrc-1)*size
209a0 6f 66 28 57 68 65 72 65 4c 65 76 65 6c 29 29 3b  of(WhereLevel));
209b0 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
209c0 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
209d0 64 62 2c 20 0a 20 20 20 20 20 20 6e 42 79 74 65  db, .      nByte
209e0 57 49 6e 66 6f 20 2b 20 0a 20 20 20 20 20 20 73  WInfo + .      s
209f0 69 7a 65 6f 66 28 57 68 65 72 65 43 6c 61 75 73  izeof(WhereClaus
20a00 65 29 20 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f  e) +.      sizeo
20a10 66 28 57 68 65 72 65 4d 61 73 6b 53 65 74 29 0a  f(WhereMaskSet).
20a20 20 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d    );.  if( db->m
20a30 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
20a40 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67     goto whereBeg
20a50 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70  inError;.  }.  p
20a60 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20  WInfo->nLevel = 
20a70 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a  pTabList->nSrc;.
20a80 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65    pWInfo->pParse
20a90 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49   = pParse;.  pWI
20aa0 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20  nfo->pTabList = 
20ab0 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e  pTabList;.  pWIn
20ac0 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c  fo->iBreak = sql
20ad0 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
20ae0 6c 28 76 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  l(v);.  pWInfo->
20af0 70 57 43 20 3d 20 70 57 43 20 3d 20 28 57 68 65  pWC = pWC = (Whe
20b00 72 65 43 6c 61 75 73 65 20 2a 29 26 28 28 75 38  reClause *)&((u8
20b10 20 2a 29 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65   *)pWInfo)[nByte
20b20 57 49 6e 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f  WInfo];.  pWInfo
20b30 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 3d 20 77  ->wctrlFlags = w
20b40 63 74 72 6c 46 6c 61 67 73 3b 0a 20 20 70 4d 61  ctrlFlags;.  pMa
20b50 73 6b 53 65 74 20 3d 20 28 57 68 65 72 65 4d 61  skSet = (WhereMa
20b60 73 6b 53 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a  skSet*)&pWC[1];.
20b70 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20  .  /* Split the 
20b80 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74  WHERE clause int
20b90 6f 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78  o separate subex
20ba0 70 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20  pressions where 
20bb0 65 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70  each.  ** subexp
20bc0 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
20bd0 61 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f  ated by an AND o
20be0 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20  perator..  */.  
20bf0 69 6e 69 74 4d 61 73 6b 53 65 74 28 70 4d 61 73  initMaskSet(pMas
20c00 6b 53 65 74 29 3b 0a 20 20 77 68 65 72 65 43 6c  kSet);.  whereCl
20c10 61 75 73 65 49 6e 69 74 28 70 57 43 2c 20 70 50  auseInit(pWC, pP
20c20 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b  arse, pMaskSet);
20c30 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
20c40 64 65 43 6f 6e 73 74 61 6e 74 73 28 70 50 61 72  deConstants(pPar
20c50 73 65 2c 20 70 57 68 65 72 65 29 3b 0a 20 20 77  se, pWhere);.  w
20c60 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70  hereSplit(pWC, p
20c70 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
20c80 20 20 20 20 0a 20 20 2f 2a 20 53 70 65 63 69 61      .  /* Specia
20c90 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20  l case: a WHERE 
20ca0 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63  clause that is c
20cb0 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61  onstant.  Evalua
20cc0 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72  te the.  ** expr
20cd0 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65  ession and eithe
20ce0 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20  r jump over all 
20cf0 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66  of the code or f
20d00 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20  all thru..  */. 
20d10 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28   if( pWhere && (
20d20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pTabList->nSrc==
20d30 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72  0 || sqlite3Expr
20d40 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69  IsConstantNotJoi
20d50 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  n(pWhere)) ){.  
20d60 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
20d70 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
20d80 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
20d90 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50  eak, SQLITE_JUMP
20da0 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68  IFNULL);.    pWh
20db0 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
20dc0 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74 20  /* Assign a bit 
20dd0 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73 6b  from the bitmask
20de0 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20 69   to every term i
20df0 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
20e00 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  e..  **.  ** Whe
20e10 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74 6d  n assigning bitm
20e20 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46 52  ask values to FR
20e30 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f 72  OM clause cursor
20e40 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20 20  s, it must be.  
20e50 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61 74  ** the case that
20e60 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69 74   if X is the bit
20e70 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74  mask for the N-t
20e80 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  h FROM clause te
20e90 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65  rm then.  ** the
20ea0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
20eb0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
20ec0 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f  ms to the left o
20ed0 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a  f the N-th term.
20ee0 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20 20    ** is (X-1).  
20ef0 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 66   An expression f
20f00 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75 73  rom the ON claus
20f10 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e  e of a LEFT JOIN
20f20 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74   can use.  ** it
20f30 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f 69  s Expr.iRightJoi
20f40 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f 20  nTable value to 
20f50 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73 6b  find the bitmask
20f60 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61   of the right ta
20f70 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  ble.  ** of the 
20f80 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74 69  join.  Subtracti
20f90 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20  ng one from the 
20fa0 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74 6d  right table bitm
20fb0 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a 2a  ask gives a.  **
20fc0 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c   bitmask for all
20fd0 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c   tables to the l
20fe0 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  eft of the join.
20ff0 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62 69    Knowing the bi
21000 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61  tmask.  ** for a
21010 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65  ll tables to the
21020 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74 20   left of a left 
21030 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e  join is importan
21040 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31 35  t.  Ticket #3015
21050 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66  ..  **.  ** Conf
21060 69 67 75 72 65 20 74 68 65 20 57 68 65 72 65 43  igure the WhereC
21070 6c 61 75 73 65 2e 76 6d 61 73 6b 20 76 61 72 69  lause.vmask vari
21080 61 62 6c 65 20 73 6f 20 74 68 61 74 20 62 69 74  able so that bit
21090 73 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  s that correspon
210a0 64 0a 20 20 2a 2a 20 74 6f 20 76 69 72 74 75 61  d.  ** to virtua
210b0 6c 20 74 61 62 6c 65 20 63 75 72 73 6f 72 73 20  l table cursors 
210c0 61 72 65 20 73 65 74 2e 20 54 68 69 73 20 69 73  are set. This is
210d0 20 75 73 65 64 20 74 6f 20 73 65 6c 65 63 74 69   used to selecti
210e0 76 65 6c 79 20 64 69 73 61 62 6c 65 20 0a 20 20  vely disable .  
210f0 2a 2a 20 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20  ** the OR-to-IN 
21100 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69  transformation i
21110 6e 20 65 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54  n exprAnalyzeOrT
21120 65 72 6d 28 29 2e 20 49 74 20 69 73 20 6e 6f 74  erm(). It is not
21130 20 68 65 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77   helpful .  ** w
21140 69 74 68 20 76 69 72 74 75 61 6c 20 74 61 62 6c  ith virtual tabl
21150 65 73 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  es..  */.  asser
21160 74 28 20 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30  t( pWC->vmask==0
21170 20 26 26 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d   && pMaskSet->n=
21180 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  =0 );.  for(i=0;
21190 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
211a0 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65  c; i++){.    cre
211b0 61 74 65 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  ateMask(pMaskSet
211c0 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
211d0 2e 69 43 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64  .iCursor);.#ifnd
211e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
211f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
21200 69 66 28 20 41 4c 57 41 59 53 28 70 54 61 62 4c  if( ALWAYS(pTabL
21210 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20  ist->a[i].pTab) 
21220 26 26 20 49 73 56 69 72 74 75 61 6c 28 70 54 61  && IsVirtual(pTa
21230 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
21240 29 20 29 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e  ) ){.      pWC->
21250 76 6d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61  vmask |= ((Bitma
21260 73 6b 29 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20  sk)1 << i);.    
21270 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66  }.#endif.  }.#if
21280 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a  ndef NDEBUG.  {.
21290 20 20 20 20 42 69 74 6d 61 73 6b 20 74 6f 54 68      Bitmask toTh
212a0 65 4c 65 66 74 20 3d 20 30 3b 0a 20 20 20 20 66  eLeft = 0;.    f
212b0 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
212c0 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
212d0 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
212e0 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  = getMask(pMaskS
212f0 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
21300 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  i].iCursor);.   
21310 20 20 20 61 73 73 65 72 74 28 20 28 6d 2d 31 29     assert( (m-1)
21320 3d 3d 74 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20  ==toTheLeft );. 
21330 20 20 20 20 20 74 6f 54 68 65 4c 65 66 74 20 7c       toTheLeft |
21340 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = m;.    }.  }.#
21350 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c  endif..  /* Anal
21360 79 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  yze all of the s
21370 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
21380 4e 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e  Note that exprAn
21390 61 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20  alyze() might.  
213a0 2a 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75  ** add new virtu
213b0 61 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68  al terms onto th
213c0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45  e end of the WHE
213d0 52 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64  RE clause.  We d
213e0 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20  o not.  ** want 
213f0 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65  to analyze these
21400 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20   virtual terms, 
21410 73 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69  so start analyzi
21420 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20  ng at the end.  
21430 2a 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77  ** and work forw
21440 61 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  ard so that the 
21450 61 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65  added virtual te
21460 72 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72  rms are never pr
21470 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ocessed..  */.  
21480 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
21490 54 61 62 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20  TabList, pWC);. 
214a0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
214b0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
214c0 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f  o whereBeginErro
214d0 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f  r;.  }..  /* Cho
214e0 73 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  se the best inde
214f0 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63  x to use for eac
21500 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  h table in the F
21510 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a  ROM clause..  **
21520 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
21530 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c  fills in the fol
21540 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20  lowing fields:. 
21550 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66   **.  **   pWInf
21560 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20  o->a[].pIdx     
21570 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73   The index to us
21580 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c  e for this level
21590 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20   of the loop..  
215a0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
215b0 2e 77 73 46 6c 61 67 73 20 20 20 57 48 45 52 45  .wsFlags   WHERE
215c0 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63  _xxx flags assoc
215d0 69 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a  iated with pIdx.
215e0 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
215f0 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65  [].nEq       The
21600 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e   number of == an
21610 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
21620 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
21630 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68  a[].iFrom     Wh
21640 69 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ich term of the 
21650 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62  FROM clause is b
21660 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20  eing coded.  ** 
21670 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54    pWInfo->a[].iT
21680 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42 45  abCur   The VDBE
21690 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20   cursor for the 
216a0 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20  database table. 
216b0 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
216c0 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65 20  ].iIdxCur   The 
216d0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
216e0 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20  the index.  **  
216f0 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65   pWInfo->a[].pTe
21700 72 6d 20 20 20 20 20 57 68 65 6e 20 77 73 46 6c  rm     When wsFl
21710 61 67 73 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20  ags==WO_OR, the 
21720 4f 52 2d 63 6c 61 75 73 65 20 74 65 72 6d 0a 20  OR-clause term. 
21730 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f   **.  ** This lo
21740 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20  op also figures 
21750 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20  out the nesting 
21760 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20  order of tables 
21770 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a  in the FROM.  **
21780 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
21790 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
217a0 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74  mask)0;.  pTabIt
217b0 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
217c0 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  ;.  pLevel = pWI
217d0 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61  nfo->a;.  andFla
217e0 67 73 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45  gs = ~0;.  WHERE
217f0 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
21800 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c  mizer Start ***\
21810 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46  n"));.  for(i=iF
21820 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  rom=0, pLevel=pW
21830 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
21840 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
21850 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57  pLevel++){.    W
21860 68 65 72 65 43 6f 73 74 20 62 65 73 74 50 6c 61  hereCost bestPla
21870 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f  n;         /* Mo
21880 73 74 20 65 66 66 69 63 69 65 6e 74 20 70 6c 61  st efficient pla
21890 6e 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  n seen so far */
218a0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
218b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218c0 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52   /* Index for FR
218d0 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61 62  OM table at pTab
218e0 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Item */.    int 
218f0 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
21900 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
21910 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d  ooping over FROM
21920 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69   tables */.    i
21930 6e 74 20 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20  nt bestJ = -1;  
21940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21950 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a  e value of j */.
21960 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20      Bitmask m;  
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21980 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65  /* Bitmask value
21990 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20   for j or bestJ 
219a0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 4f 70 74  */.    int isOpt
219b0 69 6d 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  imal;           
219c0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 66     /* Iterator f
219d0 6f 72 20 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f  or optimal/non-o
219e0 70 74 69 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f  ptimal search */
219f0 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 65  ..    memset(&be
21a00 73 74 50 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f  stPlan, 0, sizeo
21a10 66 28 62 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20  f(bestPlan));.  
21a20 20 20 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74    bestPlan.rCost
21a30 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
21a40 4c 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20  L;..    /* Loop 
21a50 74 68 72 6f 75 67 68 20 74 68 65 20 72 65 6d 61  through the rema
21a60 69 6e 69 6e 67 20 65 6e 74 72 69 65 73 20 69 6e  ining entries in
21a70 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
21a80 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 20 20 20   to find the.   
21a90 20 2a 2a 20 6e 65 78 74 20 6e 65 73 74 65 64 20   ** next nested 
21aa0 6c 6f 6f 70 2e 20 54 68 65 20 46 52 4f 4d 20 63  loop. The FROM c
21ab0 6c 61 75 73 65 20 65 6e 74 72 69 65 73 20 6d 61  lause entries ma
21ac0 79 20 62 65 20 69 74 65 72 61 74 65 64 20 74 68  y be iterated th
21ad0 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 65 69 74  rough.    ** eit
21ae0 68 65 72 20 6f 6e 63 65 20 6f 72 20 74 77 69 63  her once or twic
21af0 65 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  e. .    **.    *
21b00 2a 20 54 68 65 20 66 69 72 73 74 20 69 74 65 72  * The first iter
21b10 61 74 69 6f 6e 2c 20 77 68 69 63 68 20 69 73 20  ation, which is 
21b20 61 6c 77 61 79 73 20 70 65 72 66 6f 72 6d 65 64  always performed
21b30 2c 20 73 65 61 72 63 68 65 73 20 66 6f 72 20 74  , searches for t
21b40 68 65 0a 20 20 20 20 2a 2a 20 46 52 4f 4d 20 63  he.    ** FROM c
21b50 6c 61 75 73 65 20 65 6e 74 72 79 20 74 68 61 74  lause entry that
21b60 20 70 65 72 6d 69 74 73 20 74 68 65 20 6c 6f 77   permits the low
21b70 65 73 74 2d 63 6f 73 74 2c 20 22 6f 70 74 69 6d  est-cost, "optim
21b80 61 6c 22 20 73 63 61 6e 2e 20 49 6e 0a 20 20 20  al" scan. In.   
21b90 20 2a 2a 20 74 68 69 73 20 63 6f 6e 74 65 78 74   ** this context
21ba0 20 61 6e 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   an optimal scan
21bb0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 75 73 65   is one that use
21bc0 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 61 74  s the same strat
21bd0 65 67 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  egy.    ** for t
21be0 68 65 20 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c  he given FROM cl
21bf0 61 75 73 65 20 65 6e 74 72 79 20 61 73 20 77 6f  ause entry as wo
21c00 75 6c 64 20 62 65 20 73 65 6c 65 63 74 65 64 20  uld be selected 
21c10 69 66 20 74 68 65 20 65 6e 74 72 79 0a 20 20 20  if the entry.   
21c20 20 2a 2a 20 77 65 72 65 20 75 73 65 64 20 61 73   ** were used as
21c30 20 74 68 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e   the innermost n
21c40 65 73 74 65 64 20 6c 6f 6f 70 2e 20 20 49 6e 20  ested loop.  In 
21c50 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 74  other words, a t
21c60 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 63  able.    ** is c
21c70 68 6f 73 65 6e 20 73 75 63 68 20 74 68 61 74 20  hosen such that 
21c80 74 68 65 20 63 6f 73 74 20 6f 66 20 72 75 6e 6e  the cost of runn
21c90 69 6e 67 20 74 68 61 74 20 74 61 62 6c 65 20 63  ing that table c
21ca0 61 6e 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  annot be reduced
21cb0 0a 20 20 20 20 2a 2a 20 62 79 20 77 61 69 74 69  .    ** by waiti
21cc0 6e 67 20 66 6f 72 20 6f 74 68 65 72 20 74 61 62  ng for other tab
21cd0 6c 65 73 20 74 6f 20 72 75 6e 20 66 69 72 73 74  les to run first
21ce0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21cf0 54 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  The second itera
21d00 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 70 65 72  tion is only per
21d10 66 6f 72 6d 65 64 20 69 66 20 6e 6f 20 6f 70 74  formed if no opt
21d20 69 6d 61 6c 20 73 63 61 6e 20 73 74 72 61 74 65  imal scan strate
21d30 67 69 65 73 0a 20 20 20 20 2a 2a 20 77 65 72 65  gies.    ** were
21d40 20 66 6f 75 6e 64 20 62 79 20 74 68 65 20 66 69   found by the fi
21d50 72 73 74 2e 20 54 68 69 73 20 69 74 65 72 61 74  rst. This iterat
21d60 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 73  ion is used to s
21d70 65 61 72 63 68 20 66 6f 72 20 74 68 65 0a 20 20  earch for the.  
21d80 20 20 2a 2a 20 6c 6f 77 65 73 74 20 63 6f 73 74    ** lowest cost
21d90 20 73 63 61 6e 20 6f 76 65 72 61 6c 6c 2e 0a 20   scan overall.. 
21da0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 72 65     **.    ** Pre
21db0 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20 6f  vious versions o
21dc0 66 20 53 51 4c 69 74 65 20 70 65 72 66 6f 72 6d  f SQLite perform
21dd0 65 64 20 6f 6e 6c 79 20 74 68 65 20 73 65 63 6f  ed only the seco
21de0 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 2d 0a 20  nd iteration -. 
21df0 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 6f     ** the next o
21e00 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 77 61  utermost loop wa
21e10 73 20 61 6c 77 61 79 73 20 74 68 61 74 20 77 69  s always that wi
21e20 74 68 20 74 68 65 20 6c 6f 77 65 73 74 20 6f 76  th the lowest ov
21e30 65 72 61 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 73  erall.    ** cos
21e40 74 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  t. However, this
21e50 20 6d 65 61 6e 74 20 74 68 61 74 20 53 51 4c 69   meant that SQLi
21e60 74 65 20 63 6f 75 6c 64 20 73 65 6c 65 63 74 20  te could select 
21e70 74 68 65 20 77 72 6f 6e 67 20 70 6c 61 6e 0a 20  the wrong plan. 
21e80 20 20 20 2a 2a 20 66 6f 72 20 73 63 72 69 70 74     ** for script
21e90 73 20 73 75 63 68 20 61 73 20 74 68 65 20 66 6f  s such as the fo
21ea0 6c 6c 6f 77 69 6e 67 3a 0a 20 20 20 20 2a 2a 20  llowing:.    ** 
21eb0 20 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41    .    **   CREA
21ec0 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 20 62  TE TABLE t1(a, b
21ed0 29 3b 20 0a 20 20 20 20 2a 2a 20 20 20 43 52 45  ); .    **   CRE
21ee0 41 54 45 20 54 41 42 4c 45 20 74 32 28 63 2c 20  ATE TABLE t2(c, 
21ef0 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 53 45 4c  d);.    **   SEL
21f00 45 43 54 20 2a 20 46 52 4f 4d 20 74 32 2c 20 74  ECT * FROM t2, t
21f10 31 20 57 48 45 52 45 20 74 32 2e 72 6f 77 69 64  1 WHERE t2.rowid
21f20 20 3d 20 74 31 2e 61 3b 0a 20 20 20 20 2a 2a 0a   = t1.a;.    **.
21f30 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74 20      ** The best 
21f40 73 74 72 61 74 65 67 79 20 69 73 20 74 6f 20 69  strategy is to i
21f50 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
21f60 61 62 6c 65 20 74 31 20 66 69 72 73 74 2e 20 48  able t1 first. H
21f70 6f 77 65 76 65 72 20 69 74 0a 20 20 20 20 2a 2a  owever it.    **
21f80 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
21f90 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
21fa0 69 73 20 77 69 74 68 20 61 20 73 69 6d 70 6c 65  is with a simple
21fb0 20 67 72 65 65 64 79 20 61 6c 67 6f 72 69 74 68   greedy algorith
21fc0 6d 2e 0a 20 20 20 20 2a 2a 20 48 6f 77 65 76 65  m..    ** Howeve
21fd0 72 2c 20 73 69 6e 63 65 20 74 68 65 20 63 6f 73  r, since the cos
21fe0 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20 73 63  t of a linear sc
21ff0 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  an through table
22000 20 74 32 20 69 73 20 74 68 65 20 73 61 6d 65 20   t2 is the same 
22010 0a 20 20 20 20 2a 2a 20 61 73 20 74 68 65 20 63  .    ** as the c
22020 6f 73 74 20 6f 66 20 61 20 6c 69 6e 65 61 72 20  ost of a linear 
22030 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74 61 62  scan through tab
22040 6c 65 20 74 31 2c 20 61 20 73 69 6d 70 6c 65 20  le t1, a simple 
22050 67 72 65 65 64 79 20 0a 20 20 20 20 2a 2a 20 61  greedy .    ** a
22060 6c 67 6f 72 69 74 68 6d 20 6d 61 79 20 63 68 6f  lgorithm may cho
22070 6f 73 65 20 74 6f 20 75 73 65 20 74 32 20 66 6f  ose to use t2 fo
22080 72 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70  r the outer loop
22090 2c 20 77 68 69 63 68 20 69 73 20 61 20 6d 75 63  , which is a muc
220a0 68 0a 20 20 20 20 2a 2a 20 63 6f 73 74 6c 69 65  h.    ** costlie
220b0 72 20 61 70 70 72 6f 61 63 68 2e 0a 20 20 20 20  r approach..    
220c0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 73 4f 70 74  */.    for(isOpt
220d0 69 6d 61 6c 3d 31 3b 20 69 73 4f 70 74 69 6d 61  imal=1; isOptima
220e0 6c 3e 3d 30 20 26 26 20 62 65 73 74 4a 3c 30 3b  l>=0 && bestJ<0;
220f0 20 69 73 4f 70 74 69 6d 61 6c 2d 2d 29 7b 0a 20   isOptimal--){. 
22100 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73       Bitmask mas
22110 6b 20 3d 20 28 69 73 4f 70 74 69 6d 61 6c 20 3f  k = (isOptimal ?
22120 20 30 20 3a 20 6e 6f 74 52 65 61 64 79 29 3b 0a   0 : notReady);.
22130 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
22140 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 69 46  TabList->nSrc-iF
22150 72 6f 6d 29 3e 31 20 7c 7c 20 69 73 4f 70 74 69  rom)>1 || isOpti
22160 6d 61 6c 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  mal );.      for
22170 28 6a 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74  (j=iFrom, pTabIt
22180 65 6d 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b  em=&pTabList->a[
22190 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e  j]; j<pTabList->
221a0 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49  nSrc; j++, pTabI
221b0 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  tem++){.        
221c0 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72  int doNotReorder
221d0 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
221e0 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c  this table shoul
221f0 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72  d not be reorder
22200 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 57 68  ed */.        Wh
22210 65 72 65 43 6f 73 74 20 73 43 6f 73 74 3b 20 20  ereCost sCost;  
22220 20 20 20 2f 2a 20 43 6f 73 74 20 69 6e 66 6f 72     /* Cost infor
22230 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 73 74  mation from best
22240 5b 56 69 72 74 75 61 6c 5d 49 6e 64 65 78 28 29  [Virtual]Index()
22250 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78 70 72   */.        Expr
22260 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 3b 20  List *pOrderBy; 
22270 20 2f 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61   /* ORDER BY cla
22280 75 73 65 20 66 6f 72 20 69 6e 64 65 78 20 74 6f  use for index to
22290 20 6f 70 74 69 6d 69 7a 65 20 2a 2f 0a 20 20 0a   optimize */.  .
222a0 20 20 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f          doNotReo
222b0 72 64 65 72 20 3d 20 20 28 70 54 61 62 49 74 65  rder =  (pTabIte
222c0 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a  m->jointype & (J
222d0 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29  T_LEFT|JT_CROSS)
222e0 29 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  )!=0;.        if
222f0 28 20 6a 21 3d 69 46 72 6f 6d 20 26 26 20 64 6f  ( j!=iFrom && do
22300 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65  NotReorder ) bre
22310 61 6b 3b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20  ak;.        m = 
22320 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
22330 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  , pTabItem->iCur
22340 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  sor);.        if
22350 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79 29  ( (m & notReady)
22360 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
22370 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20   if( j==iFrom ) 
22380 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  iFrom++;.       
22390 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
223a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
223b0 4f 72 64 65 72 42 79 20 3d 20 28 28 69 3d 3d 30  OrderBy = ((i==0
223c0 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29 3f   && ppOrderBy )?
223d0 2a 70 70 4f 72 64 65 72 42 79 3a 30 29 3b 0a 20  *ppOrderBy:0);. 
223e0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
223f0 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  ( pTabItem->pTab
22400 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
22410 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
22420 41 42 4c 45 0a 20 20 20 20 20 20 20 20 69 66 28  ABLE.        if(
22430 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49   IsVirtual(pTabI
22440 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
22450 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
22460 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 20  index_info **pp 
22470 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 6a 5d 2e  = &pWInfo->a[j].
22480 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
22490 20 20 20 20 62 65 73 74 56 69 72 74 75 61 6c 49      bestVirtualI
224a0 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70 57 43  ndex(pParse, pWC
224b0 2c 20 70 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b  , pTabItem, mask
224c0 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 73 43 6f  , pOrderBy, &sCo
224d0 73 74 2c 20 70 70 29 3b 0a 20 20 20 20 20 20 20  st, pp);.       
224e0 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20   }else .#endif. 
224f0 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20         {.       
22500 20 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65     bestBtreeInde
22510 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
22520 54 61 62 49 74 65 6d 2c 20 6d 61 73 6b 2c 20 70  TabItem, mask, p
22530 4f 72 64 65 72 42 79 2c 20 26 73 43 6f 73 74 29  OrderBy, &sCost)
22540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22550 20 20 20 20 61 73 73 65 72 74 28 20 69 73 4f 70      assert( isOp
22560 74 69 6d 61 6c 20 7c 7c 20 28 73 43 6f 73 74 2e  timal || (sCost.
22570 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
22580 30 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  0 );..        if
22590 28 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f  ( (sCost.used&no
225a0 74 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20  tReady)==0.     
225b0 20 20 20 20 26 26 20 28 6a 3d 3d 69 46 72 6f 6d      && (j==iFrom
225c0 20 7c 7c 20 73 43 6f 73 74 2e 72 43 6f 73 74 3c   || sCost.rCost<
225d0 62 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 29 20  bestPlan.rCost) 
225e0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
225f0 20 20 20 20 20 20 62 65 73 74 50 6c 61 6e 20 3d        bestPlan =
22600 20 73 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20   sCost;.        
22610 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
22620 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
22630 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  f( doNotReorder 
22640 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
22650 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
22660 74 28 20 62 65 73 74 4a 3e 3d 30 20 29 3b 0a 20  t( bestJ>=0 );. 
22670 20 20 20 61 73 73 65 72 74 28 20 6e 6f 74 52 65     assert( notRe
22680 61 64 79 20 26 20 67 65 74 4d 61 73 6b 28 70 4d  ady & getMask(pM
22690 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
226a0 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
226b0 6f 72 29 20 29 3b 0a 20 20 20 20 57 48 45 52 45  or) );.    WHERE
226c0 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
226d0 6d 69 7a 65 72 20 73 65 6c 65 63 74 73 20 74 61  mizer selects ta
226e0 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20  ble %d for loop 
226f0 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20  %d\n", bestJ,.  
22700 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
22710 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20  pWInfo->a));.   
22720 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
22730 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
22740 45 52 45 5f 4f 52 44 45 52 42 59 29 21 3d 30 20  ERE_ORDERBY)!=0 
22750 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65  ){.      *ppOrde
22760 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  rBy = 0;.    }. 
22770 20 20 20 61 6e 64 46 6c 61 67 73 20 26 3d 20 62     andFlags &= b
22780 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
22790 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
227a0 2d 3e 70 6c 61 6e 20 3d 20 62 65 73 74 50 6c 61  ->plan = bestPla
227b0 6e 2e 70 6c 61 6e 3b 0a 20 20 20 20 69 66 28 20  n.plan;.    if( 
227c0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73  bestPlan.plan.ws
227d0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
227e0 44 45 58 45 44 20 29 7b 0a 20 20 20 20 20 20 70  DEXED ){.      p
227f0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d  Level->iIdxCur =
22800 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
22810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22820 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
22830 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  r = -1;.    }.  
22840 20 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67    notReady &= ~g
22850 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
22860 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
22870 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20  tJ].iCursor);.  
22880 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20    pLevel->iFrom 
22890 3d 20 28 75 38 29 62 65 73 74 4a 3b 0a 0a 20 20  = (u8)bestJ;..  
228a0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
228b0 69 66 20 74 68 65 20 74 61 62 6c 65 20 73 63 61  if the table sca
228c0 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f 6f  nned by this loo
228d0 70 20 69 74 65 72 61 74 69 6f 6e 20 68 61 64 20  p iteration had 
228e0 61 6e 0a 20 20 20 20 2a 2a 20 49 4e 44 45 58 45  an.    ** INDEXE
228f0 44 20 42 59 20 63 6c 61 75 73 65 20 61 74 74 61  D BY clause atta
22900 63 68 65 64 20 74 6f 20 69 74 2c 20 74 68 61 74  ched to it, that
22910 20 74 68 65 20 6e 61 6d 65 64 20 69 6e 64 65 78   the named index
22920 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20 2a 2a   is being.    **
22930 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 73 63   used for the sc
22940 61 6e 2e 20 49 66 20 6e 6f 74 2c 20 74 68 65 6e  an. If not, then
22950 20 71 75 65 72 79 20 63 6f 6d 70 69 6c 61 74 69   query compilati
22960 6f 6e 20 68 61 73 20 66 61 69 6c 65 64 2e 0a 20  on has failed.. 
22970 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20     ** Return an 
22980 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
22990 20 20 70 49 64 78 20 3d 20 70 54 61 62 4c 69 73    pIdx = pTabLis
229a0 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 70 49 6e 64  t->a[bestJ].pInd
229b0 65 78 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78  ex;.    if( pIdx
229c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 62   ){.      if( (b
229d0 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46  estPlan.plan.wsF
229e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
229f0 45 58 45 44 29 3d 3d 30 20 29 7b 0a 20 20 20 20  EXED)==0 ){.    
22a00 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
22a10 4d 73 67 28 70 50 61 72 73 65 2c 20 22 63 61 6e  Msg(pParse, "can
22a20 6e 6f 74 20 75 73 65 20 69 6e 64 65 78 3a 20 25  not use index: %
22a30 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  s", pIdx->zName)
22a40 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 77  ;.        goto w
22a50 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
22a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22a70 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 49 4e       /* If an IN
22a80 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
22a90 69 73 20 75 73 65 64 2c 20 74 68 65 20 62 65 73  is used, the bes
22aa0 74 49 6e 64 65 78 28 29 20 66 75 6e 63 74 69 6f  tIndex() functio
22ab0 6e 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  n is.        ** 
22ac0 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69  guaranteed to fi
22ad0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 73 70 65  nd the index spe
22ae0 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 49 4e  cified in the IN
22af0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 0a  DEXED BY clause.
22b00 20 20 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74          ** if it
22b10 20 66 69 6e 64 20 61 6e 20 69 6e 64 65 78 20 61   find an index a
22b20 74 20 61 6c 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  t all. */.      
22b30 20 20 61 73 73 65 72 74 28 20 62 65 73 74 50 6c    assert( bestPl
22b40 61 6e 2e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d  an.plan.u.pIdx==
22b50 70 49 64 78 20 29 3b 0a 20 20 20 20 20 20 7d 0a  pIdx );.      }.
22b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 57 48 45 52      }.  }.  WHER
22b70 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74  ETRACE(("*** Opt
22b80 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64 20  imizer Finished 
22b90 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 69 66 28 20  ***\n"));.  if( 
22ba0 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
22bb0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
22bc0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
22bd0 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20  reBeginError;.  
22be0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  }..  /* If the t
22bf0 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20  otal query only 
22c00 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65  selects a single
22c10 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f   row, then the O
22c20 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61  RDER BY.  ** cla
22c30 75 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e  use is irrelevan
22c40 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61  t..  */.  if( (a
22c50 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ndFlags & WHERE_
22c60 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70  UNIQUE)!=0 && pp
22c70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a  OrderBy ){.    *
22c80 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  ppOrderBy = 0;. 
22c90 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
22ca0 63 61 6c 6c 65 72 20 69 73 20 61 6e 20 55 50 44  caller is an UPD
22cb0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
22cc0 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
22cd0 72 65 71 75 65 73 74 69 6e 67 0a 20 20 2a 2a 20  requesting.  ** 
22ce0 74 6f 20 75 73 65 20 61 20 6f 6e 65 2d 70 61 73  to use a one-pas
22cf0 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 64 65 74  s algorithm, det
22d00 65 72 6d 69 6e 65 20 69 66 20 74 68 69 73 20 69  ermine if this i
22d10 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 20  s appropriate.. 
22d20 20 2a 2a 20 54 68 65 20 6f 6e 65 2d 70 61 73 73   ** The one-pass
22d30 20 61 6c 67 6f 72 69 74 68 6d 20 6f 6e 6c 79 20   algorithm only 
22d40 77 6f 72 6b 73 20 69 66 20 74 68 65 20 57 48 45  works if the WHE
22d50 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74 72  RE clause constr
22d60 61 69 6e 74 73 0a 20 20 2a 2a 20 74 68 65 20 73  aints.  ** the s
22d70 74 61 74 65 6d 65 6e 74 20 74 6f 20 75 70 64 61  tatement to upda
22d80 74 65 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2e  te a single row.
22d90 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22da0 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
22db0 45 52 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49  ERE_ONEPASS_DESI
22dc0 52 45 44 29 3d 3d 30 20 7c 7c 20 70 57 49 6e 66  RED)==0 || pWInf
22dd0 6f 2d 3e 6e 4c 65 76 65 6c 3d 3d 31 20 29 3b 0a  o->nLevel==1 );.
22de0 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
22df0 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41 53  s & WHERE_ONEPAS
22e00 53 5f 44 45 53 49 52 45 44 29 21 3d 30 20 26 26  S_DESIRED)!=0 &&
22e10 20 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45   (andFlags & WHE
22e20 52 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 29 7b  RE_UNIQUE)!=0 ){
22e30 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  .    pWInfo->okO
22e40 6e 65 50 61 73 73 20 3d 20 31 3b 0a 20 20 20 20  nePass = 1;.    
22e50 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 2e 70 6c 61  pWInfo->a[0].pla
22e60 6e 2e 77 73 46 6c 61 67 73 20 26 3d 20 7e 57 48  n.wsFlags &= ~WH
22e70 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20  ERE_IDX_ONLY;.  
22e80 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
22e90 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
22ea0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
22eb0 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
22ec0 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
22ed0 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
22ee0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
22ef0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
22f00 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
22f10 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
22f20 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
22f30 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
22f40 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
22f50 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
22f60 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
22f70 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
22f80 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
22f90 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
22fa0 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
22fb0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74   /* Index of dat
22fc0 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67  abase containing
22fd0 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a   table/index */.
22fe0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22ff0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20  OMIT_EXPLAIN.   
23000 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70   if( pParse->exp
23010 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  lain==2 ){.     
23020 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20   char *zMsg;.   
23030 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
23040 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
23050 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65  &pTabList->a[pLe
23060 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20  vel->iFrom];.   
23070 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
23080 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 54 41  3MPrintf(db, "TA
23090 42 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e  BLE %s", pItem->
230a0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  zName);.      if
230b0 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
230c0 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  ){.        zMsg 
230d0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
230e0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
230f0 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  AS %s", zMsg, pI
23100 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20  tem->zAlias);.  
23110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23120 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
23130 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e  Flags & WHERE_IN
23140 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20  DEXED)!=0 ){.   
23150 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
23160 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
23170 7a 4d 73 67 2c 20 22 25 73 20 57 49 54 48 20 49  zMsg, "%s WITH I
23180 4e 44 45 58 20 25 73 22 2c 0a 20 20 20 20 20 20  NDEX %s",.      
23190 20 20 20 20 20 7a 4d 73 67 2c 20 70 4c 65 76 65       zMsg, pLeve
231a0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
231b0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  zName);.      }e
231c0 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
231d0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
231e0 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b  HERE_MULTI_OR ){
231f0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
23200 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
23210 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 56 49  db, zMsg, "%s VI
23220 41 20 4d 55 4c 54 49 2d 49 4e 44 45 58 20 55 4e  A MULTI-INDEX UN
23230 49 4f 4e 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  ION", zMsg);.   
23240 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
23250 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
23260 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44  s & (WHERE_ROWID
23270 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f  _EQ|WHERE_ROWID_
23280 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20  RANGE) ){.      
23290 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
232a0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
232b0 67 2c 20 22 25 73 20 55 53 49 4e 47 20 50 52 49  g, "%s USING PRI
232c0 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29  MARY KEY", zMsg)
232d0 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
232e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
232f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
23300 20 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65   else if( (pLeve
23310 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
23320 26 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  & WHERE_VIRTUALT
23330 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20 20 20 20  ABLE)!=0 ){.    
23340 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
23350 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64 78  x_info *pVtabIdx
23360 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
23370 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20 20  u.pVtabIdx;.    
23380 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
23390 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
233a0 4d 73 67 2c 20 22 25 73 20 56 49 52 54 55 41 4c  Msg, "%s VIRTUAL
233b0 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25 64 3a   TABLE INDEX %d:
233c0 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20 20 20  %s", zMsg,.     
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
233e0 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d 2c  VtabIdx->idxNum,
233f0 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
23400 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  r);.      }.#end
23410 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  if.      if( pLe
23420 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
23430 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42  s & WHERE_ORDERB
23440 59 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Y ){.        zMs
23450 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
23460 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
23470 73 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73  s ORDER BY", zMs
23480 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
23490 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
234a0 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69  Op4(v, OP_Explai
234b0 6e 2c 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46  n, i, pLevel->iF
234c0 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67 2c 20 50 34  rom, 0, zMsg, P4
234d0 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 7d  _DYNAMIC);.    }
234e0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
234f0 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a  E_OMIT_EXPLAIN *
23500 2f 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  /.    pTabItem =
23510 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
23520 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
23530 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
23540 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 44 62  m->pTab;.    iDb
23550 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
23560 54 6f 49 6e 64 65 78 28 64 62 2c 20 70 54 61 62  ToIndex(db, pTab
23570 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  ->pSchema);.    
23580 69 66 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c  if( (pTab->tabFl
23590 61 67 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72  ags & TF_Ephemer
235a0 61 6c 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e  al)!=0 || pTab->
235b0 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e  pSelect ) contin
235c0 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
235d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
235e0 41 42 4c 45 0a 20 20 20 20 69 66 28 20 28 70 4c  ABLE.    if( (pL
235f0 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
23600 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
23610 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
23620 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23630 2a 70 56 54 61 62 20 3d 20 28 63 6f 6e 73 74 20  *pVTab = (const 
23640 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 47 65  char *)sqlite3Ge
23650 74 56 54 61 62 6c 65 28 64 62 2c 20 70 54 61 62  tVTable(db, pTab
23660 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 75  );.      int iCu
23670 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
23680 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 73 71 6c  ursor;.      sql
23690 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
236a0 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69 43 75 72  , OP_VOpen, iCur
236b0 2c 20 30 2c 20 30 2c 20 70 56 54 61 62 2c 20 50  , 0, 0, pVTab, P
236c0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
236d0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
236e0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
236f0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
23700 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 0a 20 20 20  IDX_ONLY)==0.   
23710 20 20 20 20 20 20 26 26 20 28 77 63 74 72 6c 46        && (wctrlF
23720 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d 49  lags & WHERE_OMI
23730 54 5f 4f 50 45 4e 29 3d 3d 30 20 29 7b 0a 20 20  T_OPEN)==0 ){.  
23740 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70 57 49      int op = pWI
23750 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3f  nfo->okOnePass ?
23760 20 4f 50 5f 4f 70 65 6e 57 72 69 74 65 20 3a 20   OP_OpenWrite : 
23770 4f 50 5f 4f 70 65 6e 52 65 61 64 3b 0a 20 20 20  OP_OpenRead;.   
23780 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
23790 62 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62  ble(pParse, pTab
237a0 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69  Item->iCursor, i
237b0 44 62 2c 20 70 54 61 62 2c 20 6f 70 29 3b 0a 20  Db, pTab, op);. 
237c0 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66 6f       if( !pWInfo
237d0 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20 70  ->okOnePass && p
237e0 54 61 62 2d 3e 6e 43 6f 6c 3c 42 4d 53 20 29 7b  Tab->nCol<BMS ){
237f0 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b  .        Bitmask
23800 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63   b = pTabItem->c
23810 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20  olUsed;.        
23820 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20  int n = 0;.     
23830 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e     for(; b; b=b>
23840 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  >1, n++){}.     
23850 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
23860 61 6e 67 65 50 34 28 76 2c 20 73 71 6c 69 74 65  angeP4(v, sqlite
23870 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
23880 28 76 29 2d 31 2c 20 53 51 4c 49 54 45 5f 49 4e  (v)-1, SQLITE_IN
23890 54 5f 54 4f 5f 50 54 52 28 6e 29 2c 20 50 34 5f  T_TO_PTR(n), P4_
238a0 49 4e 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20  INT32);.        
238b0 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
238c0 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
238d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
238e0 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
238f0 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
23900 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
23910 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
23920 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69   }.    pLevel->i
23930 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
23940 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
23950 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
23960 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
23970 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b  E_INDEXED)!=0 ){
23980 0a 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49  .      Index *pI
23990 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
239a0 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 4b  .u.pIdx;.      K
239b0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20 73  eyInfo *pKey = s
239c0 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69 6e  qlite3IndexKeyin
239d0 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29 3b  fo(pParse, pIx);
239e0 0a 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43  .      int iIdxC
239f0 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
23a00 78 43 75 72 3b 0a 20 20 20 20 20 20 61 73 73 65  xCur;.      asse
23a10 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d 61  rt( pIx->pSchema
23a20 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 20  ==pTab->pSchema 
23a30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
23a40 20 69 49 64 78 43 75 72 3e 3d 30 20 29 3b 0a 20   iIdxCur>=0 );. 
23a50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23a60 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 4f 70 65  AddOp4(v, OP_Ope
23a70 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20  nRead, iIdxCur, 
23a80 70 49 78 2d 3e 74 6e 75 6d 2c 20 69 44 62 2c 0a  pIx->tnum, iDb,.
23a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23aa0 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
23ab0 4b 65 79 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 5f  Key, P4_KEYINFO_
23ac0 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 20 20  HANDOFF);.      
23ad0 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
23ae0 22 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65  "%s", pIx->zName
23af0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ));.    }.    sq
23b00 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79 53  lite3CodeVerifyS
23b10 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69 44  chema(pParse, iD
23b20 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f  b);.  }.  pWInfo
23b30 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33  ->iTop = sqlite3
23b40 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
23b50 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  v);..  /* Genera
23b60 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64  te the code to d
23b70 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20 45  o the search.  E
23b80 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ach iteration of
23b90 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c 6f   the for.  ** lo
23ba0 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61 74  op below generat
23bb0 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  es code for a si
23bc0 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f 70  ngle nested loop
23bd0 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a 20   of the VM.  ** 
23be0 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20  program..  */.  
23bf0 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74  notReady = ~(Bit
23c00 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69 3d  mask)0;.  for(i=
23c10 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
23c20 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6e  Src; i++){.    n
23c30 6f 74 52 65 61 64 79 20 3d 20 63 6f 64 65 4f 6e  otReady = codeOn
23c40 65 4c 6f 6f 70 53 74 61 72 74 28 70 57 49 6e 66  eLoopStart(pWInf
23c50 6f 2c 20 69 2c 20 77 63 74 72 6c 46 6c 61 67 73  o, i, wctrlFlags
23c60 2c 20 6e 6f 74 52 65 61 64 79 29 3b 0a 20 20 20  , notReady);.   
23c70 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e   pWInfo->iContin
23c80 75 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69  ue = pWInfo->a[i
23c90 5d 2e 61 64 64 72 43 6f 6e 74 3b 0a 20 20 7d 0a  ].addrCont;.  }.
23ca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
23cb0 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73 74  EST  /* For test
23cc0 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e  ing and debuggin
23cd0 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20  g use only */.  
23ce0 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65  /* Record in the
23cf0 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f   query plan info
23d00 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
23d10 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a  e current table.
23d20 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
23d30 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
23d40 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
23d50 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
23d60 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20  elf.  ** is not 
23d70 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20 69  used, its name i
23d80 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49 66  s just '{}'.  If
23d90 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73 65   no index is use
23da0 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78  d.  ** the index
23db0 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22 7b   is listed as "{
23dc0 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69 6d  }".  If the prim
23dd0 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64 20  ary key is used 
23de0 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 6e  the.  ** index n
23df0 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a 2f  ame is '*'..  */
23e00 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
23e10 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
23e20 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  +){.    char *z;
23e30 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
23e40 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f  pLevel = &pWInfo
23e50 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61 62  ->a[i];.    pTab
23e60 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
23e70 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
23e80 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61 62  m];.    z = pTab
23e90 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20  Item->zAlias;.  
23ea0 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
23eb0 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 2d   pTabItem->pTab-
23ec0 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d 20  >zName;.    n = 
23ed0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
23ee0 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e 51  z);.    if( n+nQ
23ef0 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
23f00 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
23f10 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )-10 ){.      if
23f20 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
23f30 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
23f40 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
23f50 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
23f60 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
23f70 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29 3b  Plan], "{}", 2);
23f80 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  .        nQPlan 
23f90 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73  += 2;.      }els
23fa0 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  e{.        memcp
23fb0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
23fc0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
23fd0 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e 51  , n);.        nQ
23fe0 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
23ff0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
24000 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
24010 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  an++] = ' ';.   
24020 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
24030 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
24040 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
24050 57 49 44 5f 45 51 20 29 3b 0a 20 20 20 20 74 65  WID_EQ );.    te
24060 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
24070 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
24080 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
24090 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76   );.    if( pLev
240a0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
240b0 20 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f   & (WHERE_ROWID_
240c0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
240d0 41 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 6d  ANGE) ){.      m
240e0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
240f0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
24100 5d 2c 20 22 2a 20 22 2c 20 32 29 3b 0a 20 20 20  ], "* ", 2);.   
24110 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a     nQPlan += 2;.
24120 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
24130 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
24140 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
24150 58 45 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  XED)!=0 ){.     
24160 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
24170 65 6e 33 30 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  en30(pLevel->pla
24180 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  n.u.pIdx->zName)
24190 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
241a0 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
241b0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
241c0 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  )-2 ){.        m
241d0 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  emcpy(&sqlite3_q
241e0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
241f0 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ], pLevel->plan.
24200 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 2c 20 6e  u.pIdx->zName, n
24210 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
24220 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  n += n;.        
24230 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
24240 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
24250 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ';.      }.    
24260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
24270 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
24280 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
24290 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20 20 20 20   "{} ", 3);.    
242a0 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
242b0 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65     }.  }.  while
242c0 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20 73 71  ( nQPlan>0 && sq
242d0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
242e0 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20  [nQPlan-1]==' ' 
242f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 71  ){.    sqlite3_q
24300 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c  uery_plan[--nQPl
24310 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  an] = 0;.  }.  s
24320 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
24330 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20  n[nQPlan] = 0;. 
24340 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e   nQPlan = 0;.#en
24350 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45  dif /* SQLITE_TE
24360 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e  ST // Testing an
24370 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
24380 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  only */..  /* Re
24390 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69 6e 75  cord the continu
243a0 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20 69 6e  ation address in
243b0 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73   the WhereInfo s
243c0 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 6e 0a  tructure.  Then.
243d0 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e    ** clean up an
243e0 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
243f0 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a   return pWInfo;.
24400 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
24410 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
24420 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 45 72 72  */.whereBeginErr
24430 6f 72 3a 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  or:.  whereInfoF
24440 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b  ree(db, pWInfo);
24450 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
24460 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
24470 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
24480 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
24490 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
244a0 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
244b0 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
244c0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
244d0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
244e0 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
244f0 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 50 61 72   *pWInfo){.  Par
24500 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 49  se *pParse = pWI
24510 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20 56  nfo->pParse;.  V
24520 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
24530 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b  >pVdbe;.  int i;
24540 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
24550 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74  Level;.  SrcList
24560 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70 57 49   *pTabList = pWI
24570 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 20  nfo->pTabList;. 
24580 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
24590 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  Parse->db;..  /*
245a0 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74   Generate loop t
245b0 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e  ermination code.
245c0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
245d0 78 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50  xprCacheClear(pP
245e0 61 72 73 65 29 3b 0a 20 20 66 6f 72 28 69 3d 70  arse);.  for(i=p
245f0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b  TabList->nSrc-1;
24600 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
24610 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
24620 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
24630 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
24640 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
24650 61 64 64 72 43 6f 6e 74 29 3b 0a 20 20 20 20 69  addrCont);.    i
24660 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f  f( pLevel->op!=O
24670 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20  P_Noop ){.      
24680 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24690 32 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  2(v, pLevel->op,
246a0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
246b0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 20 20  vel->p2);.      
246c0 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
246d0 65 50 35 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 70  eP5(v, pLevel->p
246e0 35 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  5);.    }.    if
246f0 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  ( pLevel->plan.w
24700 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
24710 4e 5f 41 42 4c 45 20 26 26 20 70 4c 65 76 65 6c  N_ABLE && pLevel
24720 2d 3e 75 2e 69 6e 2e 6e 49 6e 3e 30 20 29 7b 0a  ->u.in.nIn>0 ){.
24730 20 20 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c        struct InL
24740 6f 6f 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20  oop *pIn;.      
24750 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c  int j;.      sql
24760 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
24770 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
24780 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20 20  addrNxt);.      
24790 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 75 2e  for(j=pLevel->u.
247a0 69 6e 2e 6e 49 6e 2c 20 70 49 6e 3d 26 70 4c 65  in.nIn, pIn=&pLe
247b0 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f  vel->u.in.aInLoo
247c0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
247d0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
247e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
247f0 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 61 64  pHere(v, pIn->ad
24800 64 72 49 6e 54 6f 70 2b 31 29 3b 0a 20 20 20 20  drInTop+1);.    
24810 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
24820 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74  ddOp2(v, OP_Next
24830 2c 20 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e  , pIn->iCur, pIn
24840 2d 3e 61 64 64 72 49 6e 54 6f 70 29 3b 0a 20 20  ->addrInTop);.  
24850 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24860 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 70 49 6e  eJumpHere(v, pIn
24870 2d 3e 61 64 64 72 49 6e 54 6f 70 2d 31 29 3b 0a  ->addrInTop-1);.
24880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
24890 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
248a0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
248b0 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
248c0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
248d0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
248e0 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20  el->addrBrk);.  
248f0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
24900 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
24910 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
24920 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
24930 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
24940 49 66 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69  IfPos, pLevel->i
24950 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20  LeftJoin);.     
24960 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24970 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  p1(v, OP_NullRow
24980 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
24990 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  .iCursor);.     
249a0 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64   if( pLevel->iId
249b0 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20  xCur>=0 ){.     
249c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
249d0 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  dOp1(v, OP_NullR
249e0 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
249f0 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Cur);.      }.  
24a00 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
24a10 6f 70 3d 3d 4f 50 5f 52 65 74 75 72 6e 20 29 7b  op==OP_Return ){
24a20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
24a30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
24a40 5f 47 6f 73 75 62 2c 20 70 4c 65 76 65 6c 2d 3e  _Gosub, pLevel->
24a50 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  p1, pLevel->addr
24a60 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  First);.      }e
24a70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
24a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
24a90 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
24aa0 65 76 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29  evel->addrFirst)
24ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24ac0 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
24ad0 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a 20 20  ere(v, addr);.  
24ae0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
24af0 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e 74 20  e "break" point 
24b00 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20 70 61  is here, just pa
24b10 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
24b20 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20  e outer loop..  
24b30 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a  ** Set it..  */.
24b40 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
24b50 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 57 49  olveLabel(v, pWI
24b60 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20  nfo->iBreak);.. 
24b70 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66   /* Close all of
24b80 20 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61   the cursors tha
24b90 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20 62 79  t were opened by
24ba0 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
24bb0 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  in..  */.  for(i
24bc0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
24bd0 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
24be0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
24bf0 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  vel++){.    stru
24c00 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
24c10 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61  *pTabItem = &pTa
24c20 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
24c30 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62  >iFrom];.    Tab
24c40 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49  le *pTab = pTabI
24c50 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61  tem->pTab;.    a
24c60 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29  ssert( pTab!=0 )
24c70 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62 2d  ;.    if( (pTab-
24c80 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 45  >tabFlags & TF_E
24c90 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c 20  phemeral)!=0 || 
24ca0 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
24cb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
24cc0 28 20 28 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c  ( (pWInfo->wctrl
24cd0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4d  Flags & WHERE_OM
24ce0 49 54 5f 43 4c 4f 53 45 29 3d 3d 30 20 29 7b 0a  IT_CLOSE)==0 ){.
24cf0 20 20 20 20 20 20 69 66 28 20 21 70 57 49 6e 66        if( !pWInf
24d00 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 26 26 20  o->okOnePass && 
24d10 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
24d20 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
24d30 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20  X_ONLY)==0 ){.  
24d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
24d50 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43 6c  eAddOp1(v, OP_Cl
24d60 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
24d70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
24d80 0a 20 20 20 20 20 20 69 66 28 20 28 70 4c 65 76  .      if( (pLev
24d90 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
24da0 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
24db0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
24dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24dd0 31 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70  1(v, OP_Close, p
24de0 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b  Level->iIdxCur);
24df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24e00 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 73      /* If this s
24e10 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64 65  can uses an inde
24e20 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75 62  x, make code sub
24e30 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72 65  stitutions to re
24e40 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20 66  ad data.    ** f
24e50 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69 6e  rom the index in
24e60 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74   preference to t
24e70 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74 69  he table. Someti
24e80 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73 0a  mes, this means.
24e90 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c 65      ** the table
24ea0 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20 72   need never be r
24eb0 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20 69  ead from. This i
24ec0 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  s a performance 
24ed0 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61 73  boost,.    ** as
24ee0 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c 20   the vdbe level 
24ef0 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65 20  waits until the 
24f00 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62 65  table is read be
24f10 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20 20  fore actually.  
24f20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68 65    ** seeking the
24f30 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74 6f   table cursor to
24f40 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72 72   the record corr
24f50 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
24f60 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20   current.    ** 
24f70 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65 20  position in the 
24f80 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a 20  index..    ** . 
24f90 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
24fa0 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
24fb0 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
24fc0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
24fd0 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
24fe0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
24ff0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
25000 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
25010 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
25020 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
25030 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
25040 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
25050 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
25060 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
25070 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
25080 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
25090 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
250a0 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
250b0 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
250c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
250d0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
250e0 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45  ags & WHERE_INDE
250f0 58 45 44 29 21 3d 30 20 26 26 20 21 64 62 2d 3e  XED)!=0 && !db->
25100 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 7b 0a 20  mallocFailed){. 
25110 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
25120 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
25130 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
25140 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
25150 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
25160 0a 20 20 20 20 20 20 69 6e 74 20 75 73 65 49 6e  .      int useIn
25170 64 65 78 4f 6e 6c 79 20 3d 20 70 4c 65 76 65 6c  dexOnly = pLevel
25180 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
25190 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b   WHERE_IDX_ONLY;
251a0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
251b0 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20  pIdx!=0 );.     
251c0 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64   pOp = sqlite3Vd
251d0 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66  beGetOp(v, pWInf
251e0 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20  o->iTop);.      
251f0 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64  last = sqlite3Vd
25200 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
25210 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 70 57  ;.      for(k=pW
25220 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c 6c 61  Info->iTop; k<la
25230 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b 29 7b  st; k++, pOp++){
25240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
25250 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54  ->p1!=pLevel->iT
25260 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65  abCur ) continue
25270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
25280 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f  p->opcode==OP_Co
25290 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
252a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
252b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
252c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
252d0 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
252e0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
252f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
25300 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
25310 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
25320 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
25330 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ur;.            
25340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
25350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25360 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73   }.          ass
25370 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f 6e 6c  ert(!useIndexOnl
25380 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  y || j<pIdx->nCo
25390 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  lumn);.        }
253a0 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70  else if( pOp->op
253b0 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29  code==OP_Rowid )
253c0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
253d0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
253e0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
253f0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
25400 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20 20 20  P_IdxRowid;.    
25410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f      }else if( pO
25420 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75  p->opcode==OP_Nu
25430 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e 64 65  llRow && useInde
25440 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  xOnly ){.       
25450 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
25460 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
25470 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
25480 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61  }.  }..  /* Fina
25490 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20  l cleanup.  */. 
254a0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 64   whereInfoFree(d
254b0 62 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  b, pWInfo);.  re
254c0 74 75 72 6e 3b 0a 7d 0a                          turn;.}.