/ Hex Artifact Content
Login

Artifact 7573120c1f2fe6d4c246f138f1e30fbcda3db241:


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 69 6e 74 20  ession */.  int 
5ac0: 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a  *pnPattern,   /*
5ad0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
5ae0: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
5af0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69  haracters */.  i
5b00: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 2c  nt *pisComplete,
5b10: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
5b20: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
5b30: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
5b40: 68 61 72 61 63 74 65 72 20 2a 2f 0a 20 20 69 6e  haracter */.  in
5b50: 74 20 2a 70 6e 6f 43 61 73 65 20 20 20 20 20 20  t *pnoCase      
5b60: 2f 2a 20 54 72 75 65 20 69 66 20 75 70 70 65 72  /* True if upper
5b70: 63 61 73 65 20 69 73 20 65 71 75 69 76 61 6c 65  case is equivale
5b80: 6e 74 20 74 6f 20 6c 6f 77 65 72 63 61 73 65 20  nt to lowercase 
5b90: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
5ba0: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
5bb0: 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 6e 20     /* String on 
5bc0: 52 48 53 20 6f 66 20 4c 49 4b 45 20 6f 70 65 72  RHS of LIKE oper
5bd0: 61 74 6f 72 20 2a 2f 0a 20 20 45 78 70 72 20 2a  ator */.  Expr *
5be0: 70 52 69 67 68 74 2c 20 2a 70 4c 65 66 74 3b 20  pRight, *pLeft; 
5bf0: 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 61 6e       /* Right an
5c00: 64 20 6c 65 66 74 20 73 69 7a 65 20 6f 66 20 4c  d left size of L
5c10: 49 4b 45 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  IKE operator */.
5c20: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5c30: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
5c40: 4c 69 73 74 20 6f 66 20 6f 70 65 72 61 6e 64 73  List of operands
5c50: 20 74 6f 20 74 68 65 20 4c 49 4b 45 20 6f 70 65   to the LIKE ope
5c60: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
5c70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5c80: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 63 68 61        /* One cha
5c90: 72 61 63 74 65 72 20 69 6e 20 7a 5b 5d 20 2a 2f  racter in z[] */
5ca0: 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20  .  int cnt;     
5cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5cc0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
5cd0: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
5ce0: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 63  haracters */.  c
5cf0: 68 61 72 20 77 63 5b 33 5d 3b 20 20 20 20 20 20  har wc[3];      
5d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c            /* Wil
5d10: 64 63 61 72 64 20 63 68 61 72 61 63 74 65 72 73  dcard characters
5d20: 20 2a 2f 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70   */.  CollSeq *p
5d30: 43 6f 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Coll;           
5d40: 20 2f 2a 20 43 6f 6c 6c 61 74 69 6e 67 20 73 65   /* Collating se
5d50: 71 75 65 6e 63 65 20 66 6f 72 20 4c 48 53 20 2a  quence for LHS *
5d60: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
5d70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
5d80: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
5d90: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20  ction */..  if( 
5da0: 21 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75  !sqlite3IsLikeFu
5db0: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72  nction(db, pExpr
5dc0: 2c 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29  , pnoCase, wc) )
5dd0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5de0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
5df0: 45 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a  E_EBCDIC.  if( *
5e00: 70 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e  pnoCase ) return
5e10: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69   0;.#endif.  pLi
5e20: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
5e30: 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  ist;.  pRight = 
5e40: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
5e50: 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d  r;.  if( pRight-
5e60: 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
5e70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
5e80: 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c    }.  pLeft = pL
5e90: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
5ea0: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
5eb0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
5ec0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
5ed0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
5ee0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
5ef0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
5f00: 61 73 73 65 72 74 28 20 70 43 6f 6c 6c 21 3d 30  assert( pColl!=0
5f10: 20 7c 7c 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75   || pLeft->iColu
5f20: 6d 6e 3d 3d 2d 31 20 29 3b 0a 20 20 69 66 28 20  mn==-1 );.  if( 
5f30: 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
5f40: 6e 20 30 3b 0a 20 20 69 66 28 20 28 70 43 6f 6c  n 0;.  if( (pCol
5f50: 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f  l->type!=SQLITE_
5f60: 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20 2a  COLL_BINARY || *
5f70: 70 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20 20  pnoCase) &&.    
5f80: 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d    (pColl->type!=
5f90: 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43 41  SQLITE_COLL_NOCA
5fa0: 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61 73 65 29  SE || !*pnoCase)
5fb0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5fc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
5fd0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
5fe0: 70 4c 65 66 74 29 21 3d 53 51 4c 49 54 45 5f 41  pLeft)!=SQLITE_A
5ff0: 46 46 5f 54 45 58 54 20 29 20 72 65 74 75 72 6e  FF_TEXT ) return
6000: 20 30 3b 0a 20 20 7a 20 3d 20 70 52 69 67 68 74   0;.  z = pRight
6010: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 69 66  ->u.zToken;.  if
6020: 28 20 41 4c 57 41 59 53 28 7a 29 20 29 7b 0a 20  ( ALWAYS(z) ){. 
6030: 20 20 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20     cnt = 0;.    
6040: 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e 74 5d  while( (c=z[cnt]
6050: 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d  )!=0 && c!=wc[0]
6060: 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20   && c!=wc[1] && 
6070: 63 21 3d 77 63 5b 32 5d 20 29 7b 0a 20 20 20 20  c!=wc[2] ){.    
6080: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20    cnt++;.    }. 
6090: 20 20 20 69 66 28 20 63 6e 74 21 3d 30 20 26 26     if( cnt!=0 &&
60a0: 20 63 21 3d 30 20 26 26 20 32 35 35 21 3d 28 75   c!=0 && 255!=(u
60b0: 38 29 7a 5b 63 6e 74 2d 31 5d 20 29 7b 0a 20 20  8)z[cnt-1] ){.  
60c0: 20 20 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65      *pisComplete
60d0: 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d   = z[cnt]==wc[0]
60e0: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
60f0: 0a 20 20 20 20 20 20 2a 70 6e 50 61 74 74 65 72  .      *pnPatter
6100: 6e 20 3d 20 63 6e 74 3b 0a 20 20 20 20 20 20 72  n = cnt;.      r
6110: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
6120: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
6130: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
6140: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
6150: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
6160: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
6170: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
6180: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
6190: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
61a0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
61b0: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
61c0: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
61d0: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
61e0: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
61f0: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
6200: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
6210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
6220: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
6230: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
6240: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
6250: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
6260: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
6270: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
6280: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
6290: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
62a0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
62b0: 69 74 65 33 53 74 72 49 43 6d 70 28 70 45 78 70  ite3StrICmp(pExp
62c0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 22 6d 61 74  r->u.zToken,"mat
62d0: 63 68 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 72  ch")!=0 ){.    r
62e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
62f0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6300: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 4c 69  pList;.  if( pLi
6310: 73 74 2d 3e 6e 45 78 70 72 21 3d 32 20 29 7b 0a  st->nExpr!=2 ){.
6320: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6330: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61  }.  if( pList->a
6340: 5b 31 5d 2e 70 45 78 70 72 2d 3e 6f 70 20 21 3d  [1].pExpr->op !=
6350: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20   TK_COLUMN ){.  
6360: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6370: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
6380: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6390: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
63a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68   */../*.** If th
63b0: 65 20 70 42 61 73 65 20 65 78 70 72 65 73 73 69  e pBase expressi
63c0: 6f 6e 20 6f 72 69 67 69 6e 61 74 65 64 20 69 6e  on originated in
63d0: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
63e0: 20 63 6c 61 75 73 65 20 6f 66 0a 2a 2a 20 61 20   clause of.** a 
63f0: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 72 61 6e 73  join, then trans
6400: 66 65 72 20 74 68 65 20 61 70 70 72 6f 70 72 69  fer the appropri
6410: 61 74 65 20 6d 61 72 6b 69 6e 67 73 20 6f 76 65  ate markings ove
6420: 72 20 74 6f 20 64 65 72 69 76 65 64 2e 0a 2a 2f  r to derived..*/
6430: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
6440: 6e 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67  nsferJoinMarking
6450: 73 28 45 78 70 72 20 2a 70 44 65 72 69 76 65 64  s(Expr *pDerived
6460: 2c 20 45 78 70 72 20 2a 70 42 61 73 65 29 7b 0a  , Expr *pBase){.
6470: 20 20 70 44 65 72 69 76 65 64 2d 3e 66 6c 61 67    pDerived->flag
6480: 73 20 7c 3d 20 70 42 61 73 65 2d 3e 66 6c 61 67  s |= pBase->flag
6490: 73 20 26 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 3b  s & EP_FromJoin;
64a0: 0a 20 20 70 44 65 72 69 76 65 64 2d 3e 69 52 69  .  pDerived->iRi
64b0: 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 3d 20 70  ghtJoinTable = p
64c0: 42 61 73 65 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  Base->iRightJoin
64d0: 54 61 62 6c 65 3b 0a 7d 0a 0a 23 69 66 20 21 64  Table;.}..#if !d
64e0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
64f0: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
6500: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
6510: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6520: 55 45 52 59 29 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  UERY)./*.** Anal
6530: 79 7a 65 20 61 20 74 65 72 6d 20 74 68 61 74 20  yze a term that 
6540: 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 77 6f 20  consists of two 
6550: 6f 72 20 6d 6f 72 65 20 4f 52 2d 63 6f 6e 6e 65  or more OR-conne
6560: 63 74 65 64 0a 2a 2a 20 73 75 62 74 65 72 6d 73  cted.** subterms
6570: 2e 20 20 53 6f 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  .  So in:.**.** 
6580: 20 20 20 20 2e 2e 2e 20 57 48 45 52 45 20 20 28      ... WHERE  (
6590: 61 3d 35 29 20 41 4e 44 20 28 62 3d 37 20 4f 52  a=5) AND (b=7 OR
65a0: 20 63 3d 39 20 4f 52 20 64 3d 31 33 29 20 41 4e   c=9 OR d=13) AN
65b0: 44 20 28 64 3d 31 33 29 0a 2a 2a 20 20 20 20 20  D (d=13).**     
65c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65d0: 20 20 20 20 20 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e 5e       ^^^^^^^^^^^
65e0: 5e 5e 5e 5e 5e 5e 5e 5e 5e 0a 2a 2a 0a 2a 2a 20  ^^^^^^^^^.**.** 
65f0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61  This routine ana
6600: 6c 79 7a 65 73 20 74 65 72 6d 73 20 73 75 63 68  lyzes terms such
6610: 20 61 73 20 74 68 65 20 6d 69 64 64 6c 65 20 74   as the middle t
6620: 65 72 6d 20 69 6e 20 74 68 65 20 61 62 6f 76 65  erm in the above
6630: 20 65 78 61 6d 70 6c 65 2e 0a 2a 2a 20 41 20 57   example..** A W
6640: 68 65 72 65 4f 72 54 65 72 6d 20 6f 62 6a 65 63  hereOrTerm objec
6650: 74 20 69 73 20 63 6f 6d 70 75 74 65 64 20 61 6e  t is computed an
6660: 64 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  d attached to th
6670: 65 20 74 65 72 6d 20 75 6e 64 65 72 0a 2a 2a 20  e term under.** 
6680: 61 6e 61 6c 79 73 69 73 2c 20 72 65 67 61 72 64  analysis, regard
6690: 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
66a0: 6f 6d 65 20 6f 66 20 74 68 65 20 61 6e 61 6c 79  ome of the analy
66b0: 73 69 73 2e 20 20 48 65 6e 63 65 3a 0a 2a 2a 0a  sis.  Hence:.**.
66c0: 2a 2a 20 20 20 20 20 57 68 65 72 65 54 65 72 6d  **     WhereTerm
66d0: 2e 77 74 46 6c 61 67 73 20 20 20 7c 3d 20 20 54  .wtFlags   |=  T
66e0: 45 52 4d 5f 4f 52 49 4e 46 4f 0a 2a 2a 20 20 20  ERM_ORINFO.**   
66f0: 20 20 57 68 65 72 65 54 65 72 6d 2e 75 2e 70 4f    WhereTerm.u.pO
6700: 72 49 6e 66 6f 20 20 3d 20 20 61 20 64 79 6e 61  rInfo  =  a dyna
6710: 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
6720: 64 20 57 68 65 72 65 4f 72 54 65 72 6d 20 6f 62  d WhereOrTerm ob
6730: 6a 65 63 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74  ject.**.** The t
6740: 65 72 6d 20 62 65 69 6e 67 20 61 6e 61 6c 79 7a  erm being analyz
6750: 65 64 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f  ed must have two
6760: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 4f 52 2d 63   or more of OR-c
6770: 6f 6e 6e 65 63 74 65 64 20 73 75 62 74 65 72 6d  onnected subterm
6780: 73 2e 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 73  s..** A single s
6790: 75 62 74 65 72 6d 20 6d 69 67 68 74 20 62 65 20  ubterm might be 
67a0: 61 20 73 65 74 20 6f 66 20 41 4e 44 2d 63 6f 6e  a set of AND-con
67b0: 6e 65 63 74 65 64 20 73 75 62 2d 73 75 62 74 65  nected sub-subte
67c0: 72 6d 73 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  rms..** Examples
67d0: 20 6f 66 20 74 65 72 6d 73 20 75 6e 64 65 72 20   of terms under 
67e0: 61 6e 61 6c 79 73 69 73 3a 0a 2a 2a 0a 2a 2a 20  analysis:.**.** 
67f0: 20 20 20 20 28 41 29 20 20 20 20 20 74 31 2e 78      (A)     t1.x
6800: 3d 74 32 2e 79 20 4f 52 20 74 31 2e 78 3d 74 32  =t2.y OR t1.x=t2
6810: 2e 7a 20 4f 52 20 74 31 2e 79 3d 31 35 20 4f 52  .z OR t1.y=15 OR
6820: 20 74 31 2e 7a 3d 74 33 2e 61 2b 35 0a 2a 2a 20   t1.z=t3.a+5.** 
6830: 20 20 20 20 28 42 29 20 20 20 20 20 78 3d 65 78      (B)     x=ex
6840: 70 72 31 20 4f 52 20 65 78 70 72 32 3d 78 20 4f  pr1 OR expr2=x O
6850: 52 20 78 3d 65 78 70 72 33 0a 2a 2a 20 20 20 20  R x=expr3.**    
6860: 20 28 43 29 20 20 20 20 20 74 31 2e 78 3d 74 32   (C)     t1.x=t2
6870: 2e 79 20 4f 52 20 28 74 31 2e 78 3d 74 32 2e 7a  .y OR (t1.x=t2.z
6880: 20 41 4e 44 20 74 31 2e 79 3d 31 35 29 0a 2a 2a   AND t1.y=15).**
6890: 20 20 20 20 20 28 44 29 20 20 20 20 20 78 3d 65       (D)     x=e
68a0: 78 70 72 31 20 4f 52 20 28 79 3e 31 31 20 41 4e  xpr1 OR (y>11 AN
68b0: 44 20 79 3c 32 32 20 41 4e 44 20 7a 20 4c 49 4b  D y<22 AND z LIK
68c0: 45 20 27 2a 68 65 6c 6c 6f 2a 27 29 0a 2a 2a 20  E '*hello*').** 
68d0: 20 20 20 20 28 45 29 20 20 20 20 20 28 70 2e 61      (E)     (p.a
68e0: 3d 31 20 41 4e 44 20 71 2e 62 3d 32 20 41 4e 44  =1 AND q.b=2 AND
68f0: 20 72 2e 63 3d 33 29 20 4f 52 20 28 70 2e 78 3d   r.c=3) OR (p.x=
6900: 34 20 41 4e 44 20 71 2e 79 3d 35 20 41 4e 44 20  4 AND q.y=5 AND 
6910: 72 2e 7a 3d 36 29 0a 2a 2a 0a 2a 2a 20 43 41 53  r.z=6).**.** CAS
6920: 45 20 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c  E 1:.**.** If al
6930: 6c 20 73 75 62 74 65 72 6d 73 20 61 72 65 20 6f  l subterms are o
6940: 66 20 74 68 65 20 66 6f 72 6d 20 54 2e 43 3d 65  f the form T.C=e
6950: 78 70 72 20 66 6f 72 20 73 6f 6d 65 20 73 69 6e  xpr for some sin
6960: 67 6c 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 43 0a  gle column of C.
6970: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ** a single tabl
6980: 65 20 54 20 28 61 73 20 73 68 6f 77 6e 20 69 6e  e T (as shown in
6990: 20 65 78 61 6d 70 6c 65 20 42 20 61 62 6f 76 65   example B above
69a0: 29 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20  ) then create a 
69b0: 6e 65 77 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  new virtual.** t
69c0: 65 72 6d 20 74 68 61 74 20 69 73 20 61 6e 20 65  erm that is an e
69d0: 71 75 69 76 61 6c 65 6e 74 20 49 4e 20 65 78 70  quivalent IN exp
69e0: 72 65 73 73 69 6f 6e 2e 20 20 49 6e 20 6f 74 68  ression.  In oth
69f0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
6a00: 20 74 65 72 6d 0a 2a 2a 20 62 65 69 6e 67 20 61   term.** being a
6a10: 6e 61 6c 79 7a 65 64 20 69 73 3a 0a 2a 2a 0a 2a  nalyzed is:.**.*
6a20: 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31  *      x = expr1
6a30: 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20    OR  expr2 = x 
6a40: 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 2a   OR  x = expr3.*
6a50: 2a 0a 2a 2a 20 74 68 65 6e 20 63 72 65 61 74 65  *.** then create
6a60: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74   a new virtual t
6a70: 65 72 6d 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a  erm like this:.*
6a80: 2a 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28  *.**      x IN (
6a90: 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72  expr1,expr2,expr
6aa0: 33 29 0a 2a 2a 0a 2a 2a 20 43 41 53 45 20 32 3a  3).**.** CASE 2:
6ab0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6c 6c 20 73 75  .**.** If all su
6ac0: 62 74 65 72 6d 73 20 61 72 65 20 69 6e 64 65 78  bterms are index
6ad0: 61 62 6c 65 20 62 79 20 61 20 73 69 6e 67 6c 65  able by a single
6ae0: 20 74 61 62 6c 65 20 54 2c 20 74 68 65 6e 20 73   table T, then s
6af0: 65 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  et.**.**     Whe
6b00: 72 65 54 65 72 6d 2e 65 4f 70 65 72 61 74 6f 72  reTerm.eOperator
6b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20                = 
6b20: 20 57 4f 5f 4f 52 0a 2a 2a 20 20 20 20 20 57 68   WO_OR.**     Wh
6b30: 65 72 65 54 65 72 6d 2e 75 2e 70 4f 72 49 6e 66  ereTerm.u.pOrInf
6b40: 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 20 7c 3d  o->indexable  |=
6b50: 20 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    the cursor num
6b60: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 54 0a  ber for table T.
6b70: 2a 2a 0a 2a 2a 20 41 20 73 75 62 74 65 72 6d 20  **.** A subterm 
6b80: 69 73 20 22 69 6e 64 65 78 61 62 6c 65 22 20 69  is "indexable" i
6b90: 66 20 69 74 20 69 73 20 6f 66 20 74 68 65 20 66  f it is of the f
6ba0: 6f 72 6d 0a 2a 2a 20 22 54 2e 43 20 3c 6f 70 3e  orm.** "T.C <op>
6bb0: 20 3c 65 78 70 72 3e 22 20 77 68 65 72 65 20 43   <expr>" where C
6bc0: 20 69 73 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6f   is any column o
6bd0: 66 20 74 61 62 6c 65 20 54 20 61 6e 64 20 0a 2a  f table T and .*
6be0: 2a 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20 6f 66  * <op> is one of
6bf0: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3c 3d 22 2c   "=", "<", "<=",
6c00: 20 22 3e 22 2c 20 22 3e 3d 22 2c 20 22 49 53 20   ">", ">=", "IS 
6c10: 4e 55 4c 4c 22 2c 20 6f 72 20 22 49 4e 22 2e 0a  NULL", or "IN"..
6c20: 2a 2a 20 41 20 73 75 62 74 65 72 6d 20 69 73 20  ** A subterm is 
6c30: 61 6c 73 6f 20 69 6e 64 65 78 61 62 6c 65 20 69  also indexable i
6c40: 66 20 69 74 20 69 73 20 61 6e 20 41 4e 44 20 6f  f it is an AND o
6c50: 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  f two or more.**
6c60: 20 73 75 62 73 75 62 74 65 72 6d 73 20 61 74 20   subsubterms at 
6c70: 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 77 68 69  least one of whi
6c80: 63 68 20 69 73 20 69 6e 64 65 78 61 62 6c 65 2e  ch is indexable.
6c90: 20 20 49 6e 64 65 78 61 62 6c 65 20 41 4e 44 20    Indexable AND 
6ca0: 0a 2a 2a 20 73 75 62 74 65 72 6d 73 20 68 61 76  .** subterms hav
6cb0: 65 20 74 68 65 69 72 20 65 4f 70 65 72 61 74 6f  e their eOperato
6cc0: 72 20 73 65 74 20 74 6f 20 57 4f 5f 41 4e 44 20  r set to WO_AND 
6cd0: 61 6e 64 20 74 68 65 79 20 68 61 76 65 0a 2a 2a  and they have.**
6ce0: 20 75 2e 70 41 6e 64 49 6e 66 6f 20 73 65 74 20   u.pAndInfo set 
6cf0: 74 6f 20 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79  to a dynamically
6d00: 20 61 6c 6c 6f 63 61 74 65 64 20 57 68 65 72 65   allocated Where
6d10: 41 6e 64 54 65 72 6d 20 6f 62 6a 65 63 74 2e 0a  AndTerm object..
6d20: 2a 2a 0a 2a 2a 20 46 72 6f 6d 20 61 6e 6f 74 68  **.** From anoth
6d30: 65 72 20 70 6f 69 6e 74 20 6f 66 20 76 69 65 77  er point of view
6d40: 2c 20 22 69 6e 64 65 78 61 62 6c 65 22 20 6d 65  , "indexable" me
6d50: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 75 62  ans that the sub
6d60: 74 65 72 6d 20 63 6f 75 6c 64 0a 2a 2a 20 70 6f  term could.** po
6d70: 74 65 6e 74 69 61 6c 6c 79 20 62 65 20 75 73 65  tentially be use
6d80: 64 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20  d with an index 
6d90: 69 66 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  if an appropriat
6da0: 65 20 69 6e 64 65 78 20 65 78 69 73 74 73 2e 0a  e index exists..
6db0: 2a 2a 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73  ** This analysis
6dc0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 73 69 64   does not consid
6dd0: 65 72 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  er whether or no
6de0: 74 20 74 68 65 20 69 6e 64 65 78 20 65 78 69 73  t the index exis
6df0: 74 73 3b 20 74 68 61 74 0a 2a 2a 20 69 73 20 73  ts; that.** is s
6e00: 6f 6d 65 74 68 69 6e 67 20 74 68 65 20 62 65 73  omething the bes
6e10: 74 49 6e 64 65 78 28 29 20 72 6f 75 74 69 6e 65  tIndex() routine
6e20: 20 77 69 6c 6c 20 64 65 74 65 72 6d 69 6e 65 2e   will determine.
6e30: 20 20 54 68 69 73 20 61 6e 61 6c 79 73 69 73 0a    This analysis.
6e40: 2a 2a 20 6f 6e 6c 79 20 6c 6f 6f 6b 73 20 61 74  ** only looks at
6e50: 20 77 68 65 74 68 65 72 20 73 75 62 74 65 72 6d   whether subterm
6e60: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
6e70: 72 20 69 6e 64 65 78 69 6e 67 20 65 78 69 73 74  r indexing exist
6e80: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 65 78 61 6d  ..**.** All exam
6e90: 70 6c 65 73 20 41 20 74 68 72 6f 75 67 68 20 45  ples A through E
6ea0: 20 61 62 6f 76 65 20 61 6c 6c 20 73 61 74 69 73   above all satis
6eb0: 66 79 20 63 61 73 65 20 32 2e 20 20 42 75 74 20  fy case 2.  But 
6ec0: 69 66 20 61 20 74 65 72 6d 0a 2a 2a 20 61 6c 73  if a term.** als
6ed0: 6f 20 73 74 61 74 69 73 66 69 65 73 20 63 61 73  o statisfies cas
6ee0: 65 20 31 20 28 73 75 63 68 20 61 73 20 42 29 20  e 1 (such as B) 
6ef0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
6f00: 20 6f 70 74 69 6d 69 7a 65 72 20 77 69 6c 6c 0a   optimizer will.
6f10: 2a 2a 20 61 6c 77 61 79 73 20 70 72 65 66 65 72  ** always prefer
6f20: 20 63 61 73 65 20 31 2c 20 73 6f 20 69 6e 20 74   case 1, so in t
6f30: 68 61 74 20 63 61 73 65 20 77 65 20 70 72 65 74  hat case we pret
6f40: 65 6e 64 20 74 68 61 74 20 63 61 73 65 20 32 20  end that case 2 
6f50: 69 73 20 6e 6f 74 0a 2a 2a 20 73 61 74 69 73 66  is not.** satisf
6f60: 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 6d 69  ied..**.** It mi
6f70: 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65 20  ght be the case 
6f80: 74 68 61 74 20 6d 75 6c 74 69 70 6c 65 20 74 61  that multiple ta
6f90: 62 6c 65 73 20 61 72 65 20 69 6e 64 65 78 61 62  bles are indexab
6fa0: 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  le.  For example
6fb0: 2c 0a 2a 2a 20 28 45 29 20 61 62 6f 76 65 20 69  ,.** (E) above i
6fc0: 73 20 69 6e 64 65 78 61 62 6c 65 20 6f 6e 20 74  s indexable on t
6fd0: 61 62 6c 65 73 20 50 2c 20 51 2c 20 61 6e 64 20  ables P, Q, and 
6fe0: 52 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 74  R..**.** Terms t
6ff0: 68 61 74 20 73 61 74 69 73 66 79 20 63 61 73 65  hat satisfy case
7000: 20 32 20 61 72 65 20 63 61 6e 64 69 64 61 74 65   2 are candidate
7010: 73 20 66 6f 72 20 6c 6f 6f 6b 75 70 20 62 79 20  s for lookup by 
7020: 75 73 69 6e 67 0a 2a 2a 20 73 65 70 61 72 61 74  using.** separat
7030: 65 20 69 6e 64 69 63 65 73 20 74 6f 20 66 69 6e  e indices to fin
7040: 64 20 72 6f 77 69 64 73 20 66 6f 72 20 65 61 63  d rowids for eac
7050: 68 20 73 75 62 74 65 72 6d 20 61 6e 64 20 63 6f  h subterm and co
7060: 6d 70 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 75  mposing.** the u
7070: 6e 69 6f 6e 20 6f 66 20 61 6c 6c 20 72 6f 77 69  nion of all rowi
7080: 64 73 20 75 73 69 6e 67 20 61 20 52 6f 77 53 65  ds using a RowSe
7090: 74 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  t object.  This 
70a0: 69 73 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f  is similar.** to
70b0: 20 22 62 69 74 6d 61 70 20 69 6e 64 69 63 65 73   "bitmap indices
70c0: 22 20 69 6e 20 6f 74 68 65 72 20 64 61 74 61 62  " in other datab
70d0: 61 73 65 20 65 6e 67 69 6e 65 73 2e 0a 2a 2a 0a  ase engines..**.
70e0: 2a 2a 20 4f 54 48 45 52 57 49 53 45 3a 0a 2a 2a  ** OTHERWISE:.**
70f0: 0a 2a 2a 20 49 66 20 6e 65 69 74 68 65 72 20 63  .** If neither c
7100: 61 73 65 20 31 20 6e 6f 72 20 63 61 73 65 20 32  ase 1 nor case 2
7110: 20 61 70 70 6c 79 2c 20 74 68 65 6e 20 6c 65 61   apply, then lea
7120: 76 65 20 74 68 65 20 65 4f 70 65 72 61 74 6f 72  ve the eOperator
7130: 20 73 65 74 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e   set to.** zero.
7140: 20 20 54 68 69 73 20 74 65 72 6d 20 69 73 20 6e    This term is n
7150: 6f 74 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65  ot useful for se
7160: 61 72 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  arch..*/.static 
7170: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
7180: 4f 72 54 65 72 6d 28 0a 20 20 53 72 63 4c 69 73  OrTerm(.  SrcLis
7190: 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20 20 20  t *pSrc,        
71a0: 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20      /* the FROM 
71b0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72  clause */.  Wher
71c0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
71d0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 63 6f 6d        /* the com
71e0: 70 6c 65 74 65 20 57 48 45 52 45 20 63 6c 61 75  plete WHERE clau
71f0: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54  se */.  int idxT
7200: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
7210: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
7220: 65 20 4f 52 2d 74 65 72 6d 20 74 6f 20 62 65 20  e OR-term to be 
7230: 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20  analyzed */.){. 
7240: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
7250: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20 20   pWC->pParse;   
7260: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
7270: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
7280: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
7290: 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20  arse->db;       
72a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
72b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
72c0: 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  /.  WhereTerm *p
72d0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
72e0: 64 78 54 65 72 6d 5d 3b 20 20 20 20 2f 2a 20 54  dxTerm];    /* T
72f0: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
7300: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 45 78 70 72  alyzed */.  Expr
7310: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
7320: 3e 70 45 78 70 72 3b 20 20 20 20 20 20 20 20 20  >pExpr;         
7330: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
7340: 73 73 69 6f 6e 20 6f 66 20 74 68 65 20 74 65 72  ssion of the ter
7350: 6d 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b  m */.  WhereMask
7360: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 20 3d 20  Set *pMaskSet = 
7370: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 3b 20 2f  pWC->pMaskSet; /
7380: 2a 20 54 61 62 6c 65 20 75 73 65 20 6d 61 73 6b  * Table use mask
7390: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
73c0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
73d0: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
73e0: 20 2a 70 4f 72 57 63 3b 20 20 20 20 20 20 20 2f   *pOrWc;       /
73f0: 2a 20 42 72 65 61 6b 75 70 20 6f 66 20 70 54 65  * Breakup of pTe
7400: 72 6d 20 69 6e 74 6f 20 73 75 62 74 65 72 6d 73  rm into subterms
7410: 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
7420: 2a 70 4f 72 54 65 72 6d 3b 20 20 20 20 20 20 20  *pOrTerm;       
7430: 2f 2a 20 41 20 53 75 62 2d 74 65 72 6d 20 77 69  /* A Sub-term wi
7440: 74 68 69 6e 20 74 68 65 20 70 4f 72 57 63 20 2a  thin the pOrWc *
7450: 2f 0a 20 20 57 68 65 72 65 4f 72 49 6e 66 6f 20  /.  WhereOrInfo 
7460: 2a 70 4f 72 49 6e 66 6f 3b 20 20 20 20 20 2f 2a  *pOrInfo;     /*
7470: 20 41 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   Additional info
7480: 72 6d 61 74 69 6f 6e 20 61 73 73 6f 63 69 61 74  rmation associat
7490: 65 64 20 77 69 74 68 20 70 54 65 72 6d 20 2a 2f  ed with pTerm */
74a0: 0a 20 20 42 69 74 6d 61 73 6b 20 63 68 6e 67 54  .  Bitmask chngT
74b0: 6f 49 4e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  oIN;         /* 
74c0: 54 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67 68  Tables that migh
74d0: 74 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31  t satisfy case 1
74e0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 69 6e   */.  Bitmask in
74f0: 64 65 78 61 62 6c 65 3b 20 20 20 20 20 20 20 20  dexable;        
7500: 2f 2a 20 54 61 62 6c 65 73 20 74 68 61 74 20 61  /* Tables that a
7510: 72 65 20 69 6e 64 65 78 61 62 6c 65 2c 20 73 61  re indexable, sa
7520: 74 69 73 66 79 69 6e 67 20 63 61 73 65 20 32 20  tisfying case 2 
7530: 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 72  */..  /*.  ** Br
7540: 65 61 6b 20 74 68 65 20 4f 52 20 63 6c 61 75 73  eak the OR claus
7550: 65 20 69 6e 74 6f 20 69 74 73 20 73 65 70 61 72  e into its separ
7560: 61 74 65 20 73 75 62 74 65 72 6d 73 2e 20 20 54  ate subterms.  T
7570: 68 65 20 73 75 62 74 65 72 6d 73 20 61 72 65 0a  he subterms are.
7580: 20 20 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 61    ** stored in a
7590: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
75a0: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e  ucture containin
75b0: 67 20 77 69 74 68 69 6e 20 74 68 65 20 57 68 65  g within the Whe
75c0: 72 65 4f 72 49 6e 66 6f 0a 20 20 2a 2a 20 6f 62  reOrInfo.  ** ob
75d0: 6a 65 63 74 20 74 68 61 74 20 69 73 20 61 74 74  ject that is att
75e0: 61 63 68 65 64 20 74 6f 20 74 68 65 20 6f 72 69  ached to the ori
75f0: 67 69 6e 61 6c 20 4f 52 20 63 6c 61 75 73 65 20  ginal OR clause 
7600: 74 65 72 6d 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  term..  */.  ass
7610: 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
7620: 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 44 59 4e  lags & (TERM_DYN
7630: 41 4d 49 43 7c 54 45 52 4d 5f 4f 52 49 4e 46 4f  AMIC|TERM_ORINFO
7640: 7c 54 45 52 4d 5f 41 4e 44 49 4e 46 4f 29 29 3d  |TERM_ANDINFO))=
7650: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7660: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52  pExpr->op==TK_OR
7670: 20 29 3b 0a 20 20 70 54 65 72 6d 2d 3e 75 2e 70   );.  pTerm->u.p
7680: 4f 72 49 6e 66 6f 20 3d 20 70 4f 72 49 6e 66 6f  OrInfo = pOrInfo
7690: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
76a0: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
76b0: 66 28 2a 70 4f 72 49 6e 66 6f 29 29 3b 0a 20 20  f(*pOrInfo));.  
76c0: 69 66 28 20 70 4f 72 49 6e 66 6f 3d 3d 30 20 29  if( pOrInfo==0 )
76d0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 54 65 72 6d   return;.  pTerm
76e0: 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54 45 52  ->wtFlags |= TER
76f0: 4d 5f 4f 52 49 4e 46 4f 3b 0a 20 20 70 4f 72 57  M_ORINFO;.  pOrW
7700: 63 20 3d 20 26 70 4f 72 49 6e 66 6f 2d 3e 77 63  c = &pOrInfo->wc
7710: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
7720: 6e 69 74 28 70 4f 72 57 63 2c 20 70 57 43 2d 3e  nit(pOrWc, pWC->
7730: 70 50 61 72 73 65 2c 20 70 4d 61 73 6b 53 65 74  pParse, pMaskSet
7740: 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28  );.  whereSplit(
7750: 70 4f 72 57 63 2c 20 70 45 78 70 72 2c 20 54 4b  pOrWc, pExpr, TK
7760: 5f 4f 52 29 3b 0a 20 20 65 78 70 72 41 6e 61 6c  _OR);.  exprAnal
7770: 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70 4f 72  yzeAll(pSrc, pOr
7780: 57 63 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  Wc);.  if( db->m
7790: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
77a0: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
77b0: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 3e 3d 32 20  pOrWc->nTerm>=2 
77c0: 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6f  );..  /*.  ** Co
77d0: 6d 70 75 74 65 20 74 68 65 20 73 65 74 20 6f 66  mpute the set of
77e0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 6d 69 67   tables that mig
77f0: 68 74 20 73 61 74 69 73 66 79 20 63 61 73 65 73  ht satisfy cases
7800: 20 31 20 6f 72 20 32 2e 0a 20 20 2a 2f 0a 20 20   1 or 2..  */.  
7810: 69 6e 64 65 78 61 62 6c 65 20 3d 20 7e 28 42 69  indexable = ~(Bi
7820: 74 6d 61 73 6b 29 30 3b 0a 20 20 63 68 6e 67 54  tmask)0;.  chngT
7830: 6f 49 4e 20 3d 20 7e 28 70 57 43 2d 3e 76 6d 61  oIN = ~(pWC->vma
7840: 73 6b 29 3b 0a 20 20 66 6f 72 28 69 3d 70 4f 72  sk);.  for(i=pOr
7850: 57 63 2d 3e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72  Wc->nTerm-1, pOr
7860: 54 65 72 6d 3d 70 4f 72 57 63 2d 3e 61 3b 20 69  Term=pOrWc->a; i
7870: 3e 3d 30 20 26 26 20 69 6e 64 65 78 61 62 6c 65  >=0 && indexable
7880: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
7890: 29 7b 0a 20 20 20 20 69 66 28 20 28 70 4f 72 54  ){.    if( (pOrT
78a0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
78b0: 20 57 4f 5f 53 49 4e 47 4c 45 29 3d 3d 30 20 29   WO_SINGLE)==0 )
78c0: 7b 0a 20 20 20 20 20 20 57 68 65 72 65 41 6e 64  {.      WhereAnd
78d0: 49 6e 66 6f 20 2a 70 41 6e 64 49 6e 66 6f 3b 0a  Info *pAndInfo;.
78e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
78f0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
7900: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ==0 );.      ass
7910: 65 72 74 28 20 28 70 4f 72 54 65 72 6d 2d 3e 77  ert( (pOrTerm->w
7920: 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 41  tFlags & (TERM_A
7930: 4e 44 49 4e 46 4f 7c 54 45 52 4d 5f 4f 52 49 4e  NDINFO|TERM_ORIN
7940: 46 4f 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  FO))==0 );.     
7950: 20 63 68 6e 67 54 6f 49 4e 20 3d 20 30 3b 0a 20   chngToIN = 0;. 
7960: 20 20 20 20 20 70 41 6e 64 49 6e 66 6f 20 3d 20       pAndInfo = 
7970: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
7980: 61 77 28 64 62 2c 20 73 69 7a 65 6f 66 28 2a 70  aw(db, sizeof(*p
7990: 41 6e 64 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20  AndInfo));.     
79a0: 20 69 66 28 20 70 41 6e 64 49 6e 66 6f 20 29 7b   if( pAndInfo ){
79b0: 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 43 6c  .        WhereCl
79c0: 61 75 73 65 20 2a 70 41 6e 64 57 43 3b 0a 20 20  ause *pAndWC;.  
79d0: 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20        WhereTerm 
79e0: 2a 70 41 6e 64 54 65 72 6d 3b 0a 20 20 20 20 20  *pAndTerm;.     
79f0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
7a00: 20 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 30 3b    Bitmask b = 0;
7a10: 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65 72 6d  .        pOrTerm
7a20: 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f 20 3d 20 70  ->u.pAndInfo = p
7a30: 41 6e 64 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20  AndInfo;.       
7a40: 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67   pOrTerm->wtFlag
7a50: 73 20 7c 3d 20 54 45 52 4d 5f 41 4e 44 49 4e 46  s |= TERM_ANDINF
7a60: 4f 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54 65  O;.        pOrTe
7a70: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7a80: 57 4f 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20  WO_AND;.        
7a90: 70 41 6e 64 57 43 20 3d 20 26 70 41 6e 64 49 6e  pAndWC = &pAndIn
7aa0: 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20  fo->wc;.        
7ab0: 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28  whereClauseInit(
7ac0: 70 41 6e 64 57 43 2c 20 70 57 43 2d 3e 70 50 61  pAndWC, pWC->pPa
7ad0: 72 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a  rse, pMaskSet);.
7ae0: 20 20 20 20 20 20 20 20 77 68 65 72 65 53 70 6c          whereSpl
7af0: 69 74 28 70 41 6e 64 57 43 2c 20 70 4f 72 54 65  it(pAndWC, pOrTe
7b00: 72 6d 2d 3e 70 45 78 70 72 2c 20 54 4b 5f 41 4e  rm->pExpr, TK_AN
7b10: 44 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70 72  D);.        expr
7b20: 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c  AnalyzeAll(pSrc,
7b30: 20 70 41 6e 64 57 43 29 3b 0a 20 20 20 20 20 20   pAndWC);.      
7b40: 20 20 74 65 73 74 63 61 73 65 28 20 64 62 2d 3e    testcase( db->
7b50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
7b60: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
7b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7b80: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
7b90: 3d 30 2c 20 70 41 6e 64 54 65 72 6d 3d 70 41 6e  =0, pAndTerm=pAn
7ba0: 64 57 43 2d 3e 61 3b 20 6a 3c 70 41 6e 64 57 43  dWC->a; j<pAndWC
7bb0: 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 41  ->nTerm; j++, pA
7bc0: 6e 64 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20  ndTerm++){.     
7bd0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7be0: 41 6e 64 54 65 72 6d 2d 3e 70 45 78 70 72 20 29  AndTerm->pExpr )
7bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
7c00: 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 41 6e 64  ( allowedOp(pAnd
7c10: 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 6f 70 29  Term->pExpr->op)
7c20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7c30: 20 20 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70    b |= getMask(p
7c40: 4d 61 73 6b 53 65 74 2c 20 70 41 6e 64 54 65 72  MaskSet, pAndTer
7c50: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29 3b 0a  m->leftCursor);.
7c60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7c70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c80: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 64 65    }.        inde
7c90: 78 61 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20  xable &= b;.    
7ca0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
7cb0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
7cc0: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
7cd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69   ){.      /* Ski
7ce0: 70 20 74 68 69 73 20 74 65 72 6d 20 66 6f 72 20  p this term for 
7cf0: 6e 6f 77 2e 20 20 57 65 20 72 65 76 69 73 69 74  now.  We revisit
7d00: 20 69 74 20 77 68 65 6e 20 77 65 20 70 72 6f 63   it when we proc
7d10: 65 73 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ess the.      **
7d20: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 54   corresponding T
7d30: 45 52 4d 5f 56 49 52 54 55 41 4c 20 74 65 72 6d  ERM_VIRTUAL term
7d40: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
7d50: 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 3b 0a       Bitmask b;.
7d60: 20 20 20 20 20 20 62 20 3d 20 67 65 74 4d 61 73        b = getMas
7d70: 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 4f 72 54  k(pMaskSet, pOrT
7d80: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 29  erm->leftCursor)
7d90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 72 54  ;.      if( pOrT
7da0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
7db0: 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 7b 0a 20  ERM_VIRTUAL ){. 
7dc0: 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72 6d         WhereTerm
7dd0: 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 4f 72 57   *pOther = &pOrW
7de0: 63 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69 50  c->a[pOrTerm->iP
7df0: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 20 20  arent];.        
7e00: 62 20 7c 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  b |= getMask(pMa
7e10: 73 6b 53 65 74 2c 20 70 4f 74 68 65 72 2d 3e 6c  skSet, pOther->l
7e20: 65 66 74 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  eftCursor);.    
7e30: 20 20 7d 0a 20 20 20 20 20 20 69 6e 64 65 78 61    }.      indexa
7e40: 62 6c 65 20 26 3d 20 62 3b 0a 20 20 20 20 20 20  ble &= b;.      
7e50: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70  if( pOrTerm->eOp
7e60: 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b  erator!=WO_EQ ){
7e70: 0a 20 20 20 20 20 20 20 20 63 68 6e 67 54 6f 49  .        chngToI
7e80: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  N = 0;.      }el
7e90: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 6e 67  se{.        chng
7ea0: 54 6f 49 4e 20 26 3d 20 62 3b 0a 20 20 20 20 20  ToIN &= b;.     
7eb0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7ec0: 2f 2a 0a 20 20 2a 2a 20 52 65 63 6f 72 64 20 74  /*.  ** Record t
7ed0: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
7ee0: 20 74 68 61 74 20 73 61 74 69 73 66 79 20 63 61   that satisfy ca
7ef0: 73 65 20 32 2e 20 20 54 68 65 20 73 65 74 20 6d  se 2.  The set m
7f00: 69 67 68 74 20 62 65 0a 20 20 2a 2a 20 65 6d 70  ight be.  ** emp
7f10: 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 4f 72 49 6e  ty..  */.  pOrIn
7f20: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
7f30: 69 6e 64 65 78 61 62 6c 65 3b 0a 20 20 70 54 65  indexable;.  pTe
7f40: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20  rm->eOperator = 
7f50: 69 6e 64 65 78 61 62 6c 65 3d 3d 30 20 3f 20 30  indexable==0 ? 0
7f60: 20 3a 20 57 4f 5f 4f 52 3b 0a 0a 20 20 2f 2a 0a   : WO_OR;..  /*.
7f70: 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 68 6f    ** chngToIN ho
7f80: 6c 64 73 20 61 20 73 65 74 20 6f 66 20 74 61 62  lds a set of tab
7f90: 6c 65 73 20 74 68 61 74 20 2a 6d 69 67 68 74 2a  les that *might*
7fa0: 20 73 61 74 69 73 66 79 20 63 61 73 65 20 31 2e   satisfy case 1.
7fb0: 20 20 42 75 74 0a 20 20 2a 2a 20 77 65 20 68 61    But.  ** we ha
7fc0: 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 61 64  ve to do some ad
7fd0: 64 69 74 69 6f 6e 61 6c 20 63 68 65 63 6b 69 6e  ditional checkin
7fe0: 67 20 74 6f 20 73 65 65 20 69 66 20 63 61 73 65  g to see if case
7ff0: 20 31 20 72 65 61 6c 6c 79 0a 20 20 2a 2a 20 69   1 really.  ** i
8000: 73 20 73 61 74 69 73 66 69 65 64 2e 0a 20 20 2a  s satisfied..  *
8010: 2a 0a 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20  *.  ** chngToIN 
8020: 77 69 6c 6c 20 68 6f 6c 64 20 65 69 74 68 65 72  will hold either
8030: 20 30 2c 20 31 2c 20 6f 72 20 32 20 62 69 74 73   0, 1, or 2 bits
8040: 2e 20 20 54 68 65 20 30 2d 62 69 74 20 63 61 73  .  The 0-bit cas
8050: 65 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  e means.  ** tha
8060: 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 6f  t there is no po
8070: 73 73 69 62 69 6c 69 74 79 20 6f 66 20 74 72 61  ssibility of tra
8080: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 20 4f 52  nsforming the OR
8090: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 0a   clause into an.
80a0: 20 20 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72    ** IN operator
80b0: 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 72 20   because one or 
80c0: 6d 6f 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68  more terms in th
80d0: 65 20 4f 52 20 63 6c 61 75 73 65 20 63 6f 6e 74  e OR clause cont
80e0: 61 69 6e 0a 20 20 2a 2a 20 73 6f 6d 65 74 68 69  ain.  ** somethi
80f0: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 3d 3d  ng other than ==
8100: 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20   on a column in 
8110: 74 68 65 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  the single table
8120: 2e 20 20 54 68 65 20 31 2d 62 69 74 0a 20 20 2a  .  The 1-bit.  *
8130: 2a 20 63 61 73 65 20 6d 65 61 6e 73 20 74 68 61  * case means tha
8140: 74 20 65 76 65 72 79 20 74 65 72 6d 20 6f 66 20  t every term of 
8150: 74 68 65 20 4f 52 20 63 6c 61 75 73 65 20 69 73  the OR clause is
8160: 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 20 20 2a   of the form.  *
8170: 2a 20 22 74 61 62 6c 65 2e 63 6f 6c 75 6d 6e 3d  * "table.column=
8180: 65 78 70 72 22 20 66 6f 72 20 73 6f 6d 65 20 73  expr" for some s
8190: 69 6e 67 6c 65 20 74 61 62 6c 65 2e 20 20 54 68  ingle table.  Th
81a0: 65 20 6f 6e 65 20 62 69 74 20 74 68 61 74 20 69  e one bit that i
81b0: 73 20 73 65 74 0a 20 20 2a 2a 20 77 69 6c 6c 20  s set.  ** will 
81c0: 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
81d0: 65 20 63 6f 6d 6d 6f 6e 20 74 61 62 6c 65 2e 20  e common table. 
81e0: 20 57 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   We still need t
81f0: 6f 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 0a  o check to make.
8200: 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 73 61    ** sure the sa
8210: 6d 65 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65  me column is use
8220: 64 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 2e 20  d on all terms. 
8230: 20 54 68 65 20 32 2d 62 69 74 20 63 61 73 65 20   The 2-bit case 
8240: 69 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 68 65  is when.  ** the
8250: 20 61 6c 6c 20 74 65 72 6d 73 20 61 72 65 20 6f   all terms are o
8260: 66 20 74 68 65 20 66 6f 72 6d 20 22 74 61 62 6c  f the form "tabl
8270: 65 31 2e 63 6f 6c 75 6d 6e 3d 74 61 62 6c 65 32  e1.column=table2
8280: 2e 63 6f 6c 75 6d 6e 22 2e 20 20 49 74 0a 20 20  .column".  It.  
8290: 2a 2a 20 6d 69 67 68 74 20 62 65 20 70 6f 73 73  ** might be poss
82a0: 69 62 6c 65 20 74 6f 20 66 6f 72 6d 20 61 6e 20  ible to form an 
82b0: 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68  IN operator with
82c0: 20 65 69 74 68 65 72 20 74 61 62 6c 65 31 2e 63   either table1.c
82d0: 6f 6c 75 6d 6e 0a 20 20 2a 2a 20 6f 72 20 74 61  olumn.  ** or ta
82e0: 62 6c 65 32 2e 63 6f 6c 75 6d 6e 20 61 73 20 74  ble2.column as t
82f0: 68 65 20 4c 48 53 20 69 66 20 65 69 74 68 65 72  he LHS if either
8300: 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 65 76   is common to ev
8310: 65 72 79 20 74 65 72 6d 20 6f 66 0a 20 20 2a 2a  ery term of.  **
8320: 20 74 68 65 20 4f 52 20 63 6c 61 75 73 65 2e 0a   the OR clause..
8330: 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 20 74    **.  ** Note t
8340: 68 61 74 20 74 65 72 6d 73 20 6f 66 20 74 68 65  hat terms of the
8350: 20 66 6f 72 6d 20 22 74 61 62 6c 65 2e 63 6f 6c   form "table.col
8360: 75 6d 6e 31 3d 74 61 62 6c 65 2e 63 6f 6c 75 6d  umn1=table.colum
8370: 6e 32 22 20 28 74 68 65 0a 20 20 2a 2a 20 73 61  n2" (the.  ** sa
8380: 6d 65 20 74 61 62 6c 65 20 6f 6e 20 62 6f 74 68  me table on both
8390: 20 73 69 7a 65 73 20 6f 66 20 74 68 65 20 3d 3d   sizes of the ==
83a0: 29 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 74 69  ) cannot be opti
83b0: 6d 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  mized..  */.  if
83c0: 28 20 63 68 6e 67 54 6f 49 4e 20 29 7b 0a 20 20  ( chngToIN ){.  
83d0: 20 20 69 6e 74 20 6f 6b 54 6f 43 68 6e 67 54 6f    int okToChngTo
83e0: 49 4e 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  IN = 0;     /* T
83f0: 72 75 65 20 69 66 20 74 68 65 20 63 6f 6e 76 65  rue if the conve
8400: 72 73 69 6f 6e 20 74 6f 20 49 4e 20 69 73 20 76  rsion to IN is v
8410: 61 6c 69 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20  alid */.    int 
8420: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 20 20 20  iColumn = -1;   
8430: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
8440: 69 6e 64 65 78 20 6f 6e 20 6c 68 73 20 6f 66 20  index on lhs of 
8450: 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  IN operator */. 
8460: 20 20 20 69 6e 74 20 69 43 75 72 73 6f 72 20 3d     int iCursor =
8470: 20 2d 31 3b 20 20 20 20 20 20 20 20 20 2f 2a 20   -1;         /* 
8480: 54 61 62 6c 65 20 63 75 72 73 6f 72 20 63 6f 6d  Table cursor com
8490: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 74 65 72 6d 73  mon to all terms
84a0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 20 3d 20   */.    int j = 
84b0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
84c0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
84d0: 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 61  r */..    /* Sea
84e0: 72 63 68 20 66 6f 72 20 61 20 74 61 62 6c 65 20  rch for a table 
84f0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20  and column that 
8500: 61 70 70 65 61 72 73 20 6f 6e 20 6f 6e 65 20 73  appears on one s
8510: 69 64 65 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ide or the.    *
8520: 2a 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 3d  * other of the =
8530: 3d 20 6f 70 65 72 61 74 6f 72 20 69 6e 20 65 76  = operator in ev
8540: 65 72 79 20 73 75 62 74 65 72 6d 2e 20 20 54 68  ery subterm.  Th
8550: 61 74 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  at table and col
8560: 75 6d 6e 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  umn.    ** will 
8570: 62 65 20 72 65 63 6f 72 64 65 64 20 69 6e 20 69  be recorded in i
8580: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
8590: 6d 6e 2e 20 20 54 68 65 72 65 20 6d 69 67 68 74  mn.  There might
85a0: 20 6e 6f 74 20 62 65 20 61 6e 79 0a 20 20 20 20   not be any.    
85b0: 2a 2a 20 73 75 63 68 20 74 61 62 6c 65 20 61 6e  ** such table an
85c0: 64 20 63 6f 6c 75 6d 6e 2e 20 20 53 65 74 20 6f  d column.  Set o
85d0: 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 66 20 61  kToChngToIN if a
85e0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 61  n appropriate ta
85f0: 62 6c 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 63  ble.    ** and c
8600: 6f 6c 75 6d 6e 20 69 73 20 66 6f 75 6e 64 20 62  olumn is found b
8610: 75 74 20 6c 65 61 76 65 20 6f 6b 54 6f 43 68 6e  ut leave okToChn
8620: 67 54 6f 49 4e 20 66 61 6c 73 65 20 69 66 20 6e  gToIN false if n
8630: 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2f  ot found..    */
8640: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
8650: 32 20 26 26 20 21 6f 6b 54 6f 43 68 6e 67 54 6f  2 && !okToChngTo
8660: 49 4e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  IN; j++){.      
8670: 70 4f 72 54 65 72 6d 20 3d 20 70 4f 72 57 63 2d  pOrTerm = pOrWc-
8680: 3e 61 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  >a;.      for(i=
8690: 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 3b 20  pOrWc->nTerm-1; 
86a0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 72 54 65  i>=0; i--, pOrTe
86b0: 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61  rm++){.        a
86c0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
86d0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 45 51  eOperator==WO_EQ
86e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 72 54   );.        pOrT
86f0: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 3d 20  erm->wtFlags &= 
8700: 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20  ~TERM_OR_OK;.   
8710: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
8720: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
8730: 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20 20 20  ursor ){.       
8740: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
8750: 65 20 32 2d 62 69 74 20 63 61 73 65 20 61 6e 64  e 2-bit case and
8760: 20 77 65 20 61 72 65 20 6f 6e 20 74 68 65 20 73   we are on the s
8770: 65 63 6f 6e 64 20 69 74 65 72 61 74 69 6f 6e 20  econd iteration 
8780: 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  and.          **
8790: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
87a0: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
87b0: 69 74 65 72 61 74 69 6f 6e 2e 20 20 53 6f 20 73  iteration.  So s
87c0: 6b 69 70 20 74 68 69 73 20 74 65 72 6d 2e 20 2a  kip this term. *
87d0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
87e0: 72 74 28 20 6a 3d 3d 31 20 29 3b 0a 20 20 20 20  rt( j==1 );.    
87f0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8800: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8810: 20 20 69 66 28 20 28 63 68 6e 67 54 6f 49 4e 20    if( (chngToIN 
8820: 26 20 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53  & getMask(pMaskS
8830: 65 74 2c 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  et, pOrTerm->lef
8840: 74 43 75 72 73 6f 72 29 29 3d 3d 30 20 29 7b 0a  tCursor))==0 ){.
8850: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
8860: 73 20 74 65 72 6d 20 6d 75 73 74 20 62 65 20 6f  s term must be o
8870: 66 20 74 68 65 20 66 6f 72 6d 20 74 31 2e 61 3d  f the form t1.a=
8880: 3d 74 32 2e 62 20 77 68 65 72 65 20 74 32 20 69  =t2.b where t2 i
8890: 73 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 20  s in the.       
88a0: 20 20 20 2a 2a 20 63 68 6e 67 54 6f 49 4e 20 73     ** chngToIN s
88b0: 65 74 20 62 75 74 20 74 31 20 69 73 20 6e 6f 74  et but t1 is not
88c0: 2e 20 20 54 68 69 73 20 74 65 72 6d 20 77 69 6c  .  This term wil
88d0: 6c 20 62 65 20 65 69 74 68 65 72 20 70 72 65 63  l be either prec
88e0: 65 65 64 65 64 0a 20 20 20 20 20 20 20 20 20 20  eeded.          
88f0: 2a 2a 20 6f 72 20 66 6f 6c 6c 77 65 64 20 62 79  ** or follwed by
8900: 20 61 6e 20 69 6e 76 65 72 74 65 64 20 63 6f 70   an inverted cop
8910: 79 20 28 74 32 2e 62 3d 3d 74 31 2e 61 29 2e 20  y (t2.b==t1.a). 
8920: 20 53 6b 69 70 20 74 68 69 73 20 74 65 72 6d 20   Skip this term 
8930: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  .          ** an
8940: 64 20 75 73 65 20 69 74 73 20 69 6e 76 65 72 73  d use its invers
8950: 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ion. */.        
8960: 20 20 74 65 73 74 63 61 73 65 28 20 70 4f 72 54    testcase( pOrT
8970: 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
8980: 45 52 4d 5f 43 4f 50 49 45 44 20 29 3b 0a 20 20  ERM_COPIED );.  
8990: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
89a0: 28 20 70 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61  ( pOrTerm->wtFla
89b0: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
89c0: 4c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  L );.          a
89d0: 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d 2d 3e  ssert( pOrTerm->
89e0: 77 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  wtFlags & (TERM_
89f0: 43 4f 50 49 45 44 7c 54 45 52 4d 5f 56 49 52 54  COPIED|TERM_VIRT
8a00: 55 41 4c 29 20 29 3b 0a 20 20 20 20 20 20 20 20  UAL) );.        
8a10: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 43      }.        iC
8a30: 6f 6c 75 6d 6e 20 3d 20 70 4f 72 54 65 72 6d 2d  olumn = pOrTerm-
8a40: 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  >u.leftColumn;. 
8a50: 20 20 20 20 20 20 20 69 43 75 72 73 6f 72 20 3d         iCursor =
8a60: 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75   pOrTerm->leftCu
8a70: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 62 72  rsor;.        br
8a80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
8a90: 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
8aa0: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 61 6e 64        /* No cand
8ab0: 69 64 61 74 65 20 74 61 62 6c 65 2b 63 6f 6c 75  idate table+colu
8ac0: 6d 6e 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 54  mn was found.  T
8ad0: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 6f 63 63  his can only occ
8ae0: 75 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 6e  ur.        ** on
8af0: 20 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72   the second iter
8b00: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ation */.       
8b10: 20 61 73 73 65 72 74 28 20 6a 3d 3d 31 20 29 3b   assert( j==1 );
8b20: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8b30: 20 28 63 68 6e 67 54 6f 49 4e 26 28 63 68 6e 67   (chngToIN&(chng
8b40: 54 6f 49 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20  ToIN-1))==0 );. 
8b50: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 63         assert( c
8b60: 68 6e 67 54 6f 49 4e 3d 3d 67 65 74 4d 61 73 6b  hngToIN==getMask
8b70: 28 70 4d 61 73 6b 53 65 74 2c 20 69 43 75 72 73  (pMaskSet, iCurs
8b80: 6f 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 62  or) );.        b
8b90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8ba0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 3d      testcase( j=
8bb0: 3d 31 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =1 );..      /* 
8bc0: 57 65 20 68 61 76 65 20 66 6f 75 6e 64 20 61 20  We have found a 
8bd0: 63 61 6e 64 69 64 61 74 65 20 74 61 62 6c 65 20  candidate table 
8be0: 61 6e 64 20 63 6f 6c 75 6d 6e 2e 20 20 43 68 65  and column.  Che
8bf0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 61  ck to see if tha
8c00: 74 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65  t.      ** table
8c10: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20 63   and column is c
8c20: 6f 6d 6d 6f 6e 20 74 6f 20 65 76 65 72 79 20 74  ommon to every t
8c30: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 20 63 6c  erm in the OR cl
8c40: 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 6f 6b  ause */.      ok
8c50: 54 6f 43 68 6e 67 54 6f 49 4e 20 3d 20 31 3b 0a  ToChngToIN = 1;.
8c60: 20 20 20 20 20 20 66 6f 72 28 3b 20 69 3e 3d 30        for(; i>=0
8c70: 20 26 26 20 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e   && okToChngToIN
8c80: 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b  ; i--, pOrTerm++
8c90: 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
8ca0: 74 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65  t( pOrTerm->eOpe
8cb0: 72 61 74 6f 72 3d 3d 57 4f 5f 45 51 20 29 3b 0a  rator==WO_EQ );.
8cc0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 72 54          if( pOrT
8cd0: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
8ce0: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
8cf0: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77        pOrTerm->w
8d00: 74 46 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f  tFlags &= ~TERM_
8d10: 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  OR_OK;.        }
8d20: 65 6c 73 65 20 69 66 28 20 70 4f 72 54 65 72 6d  else if( pOrTerm
8d30: 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 21 3d  ->u.leftColumn!=
8d40: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
8d50: 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f 49       okToChngToI
8d60: 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  N = 0;.        }
8d70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8d80: 69 6e 74 20 61 66 66 4c 65 66 74 2c 20 61 66 66  int affLeft, aff
8d90: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 20  Right;.         
8da0: 20 2f 2a 20 49 66 20 74 68 65 20 72 69 67 68 74   /* If the right
8db0: 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 61 6c  -hand side is al
8dc0: 73 6f 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65  so a column, the
8dd0: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 69 65 73  n the affinities
8de0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  .          ** of
8df0: 20 62 6f 74 68 20 72 69 67 68 74 20 61 6e 64 20   both right and 
8e00: 6c 65 66 74 20 73 69 64 65 73 20 6d 75 73 74 20  left sides must 
8e10: 62 65 20 73 75 63 68 20 74 68 61 74 20 6e 6f 20  be such that no 
8e20: 74 79 70 65 0a 20 20 20 20 20 20 20 20 20 20 2a  type.          *
8e30: 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 72  * conversions ar
8e40: 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74 68  e required on th
8e50: 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b 65  e right.  (Ticke
8e60: 74 20 23 32 32 34 39 29 0a 20 20 20 20 20 20 20  t #2249).       
8e70: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
8e80: 61 66 66 52 69 67 68 74 20 3d 20 73 71 6c 69 74  affRight = sqlit
8e90: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
8ea0: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
8eb0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
8ec0: 20 20 61 66 66 4c 65 66 74 20 3d 20 73 71 6c 69    affLeft = sqli
8ed0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
8ee0: 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e  pOrTerm->pExpr->
8ef0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20  pLeft);.        
8f00: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d    if( affRight!=
8f10: 30 20 26 26 20 61 66 66 52 69 67 68 74 21 3d 61  0 && affRight!=a
8f20: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  ffLeft ){.      
8f30: 20 20 20 20 20 20 6f 6b 54 6f 43 68 6e 67 54 6f        okToChngTo
8f40: 49 4e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  IN = 0;.        
8f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8f60: 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 77 74       pOrTerm->wt
8f70: 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 4f 52  Flags |= TERM_OR
8f80: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
8f90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8fa0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
8fb0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   At this point, 
8fc0: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 69 73 20  okToChngToIN is 
8fd0: 74 72 75 65 20 69 66 20 6f 72 69 67 69 6e 61 6c  true if original
8fe0: 20 70 54 65 72 6d 20 73 61 74 69 73 66 69 65 73   pTerm satisfies
8ff0: 0a 20 20 20 20 2a 2a 20 63 61 73 65 20 31 2e 20  .    ** case 1. 
9000: 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 63   In that case, c
9010: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 76  onstruct a new v
9020: 69 72 74 75 61 6c 20 74 65 72 6d 20 74 68 61 74  irtual term that
9030: 20 69 73 20 0a 20 20 20 20 2a 2a 20 70 54 65 72   is .    ** pTer
9040: 6d 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  m converted into
9050: 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e   an IN operator.
9060: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9070: 6f 6b 54 6f 43 68 6e 67 54 6f 49 4e 20 29 7b 0a  okToChngToIN ){.
9080: 20 20 20 20 20 20 45 78 70 72 20 2a 70 44 75 70        Expr *pDup
9090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
90a0: 41 20 74 72 61 6e 73 69 65 6e 74 20 64 75 70 6c  A transient dupl
90b0: 69 63 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e  icate expression
90c0: 20 2a 2f 0a 20 20 20 20 20 20 45 78 70 72 4c 69   */.      ExprLi
90d0: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 20 20  st *pList = 0;  
90e0: 20 2f 2a 20 54 68 65 20 52 48 53 20 6f 66 20 74   /* The RHS of t
90f0: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a  he IN operator *
9100: 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  /.      Expr *pL
9110: 65 66 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  eft = 0;       /
9120: 2a 20 54 68 65 20 4c 48 53 20 6f 66 20 74 68 65  * The LHS of the
9130: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a   IN operator */.
9140: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
9150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
9160: 54 68 65 20 63 6f 6d 70 6c 65 74 65 20 49 4e 20  The complete IN 
9170: 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 0a 20 20 20  operator */..   
9180: 20 20 20 66 6f 72 28 69 3d 70 4f 72 57 63 2d 3e     for(i=pOrWc->
9190: 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d  nTerm-1, pOrTerm
91a0: 3d 70 4f 72 57 63 2d 3e 61 3b 20 69 3e 3d 30 3b  =pOrWc->a; i>=0;
91b0: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
91c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
91d0: 4f 72 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  OrTerm->wtFlags 
91e0: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
91f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9200: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 72       assert( pOr
9210: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
9220: 3d 57 4f 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =WO_EQ );.      
9230: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9240: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69  m->leftCursor==i
9250: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 20 20  Cursor );.      
9260: 20 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72    assert( pOrTer
9270: 6d 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75 6d 6e 3d  m->u.leftColumn=
9280: 3d 69 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20 20  =iColumn );.    
9290: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
92a0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 4f  e3ExprDup(db, pO
92b0: 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52  rTerm->pExpr->pR
92c0: 69 67 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  ight, 0);.      
92d0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
92e0: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
92f0: 70 57 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69  pWC->pParse, pLi
9300: 73 74 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  st, pDup);.     
9310: 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54 65     pLeft = pOrTe
9320: 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66 74  rm->pExpr->pLeft
9330: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9340: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
9350: 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20 3d   );.      pDup =
9360: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
9370: 64 62 2c 20 70 4c 65 66 74 2c 20 30 29 3b 0a 20  db, pLeft, 0);. 
9380: 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69       pNew = sqli
9390: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
93a0: 20 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20 30 2c   TK_IN, pDup, 0,
93b0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
93c0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 69  New ){.        i
93d0: 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20 20  nt idxNew;.     
93e0: 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d     transferJoinM
93f0: 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20 70 45  arkings(pNew, pE
9400: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  xpr);.        as
9410: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
9420: 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f  operty(pNew, EP_
9430: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
9440: 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 2e 70 4c        pNew->x.pL
9450: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  ist = pList;.   
9460: 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68       idxNew = wh
9470: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
9480: 70 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f  pWC, pNew, TERM_
9490: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
94a0: 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 74  AMIC);.        t
94b0: 65 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d  estcase( idxNew=
94c0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 65 78  =0 );.        ex
94d0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
94e0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
94f0: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
9500: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
9510: 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69          pWC->a[i
9520: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
9530: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
9540: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
9550: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
9560: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9570: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
9580: 64 62 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  db, pList);.    
9590: 20 20 7d 0a 20 20 20 20 20 20 70 54 65 72 6d 2d    }.      pTerm-
95a0: 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b 20  >eOperator = 0; 
95b0: 20 2f 2a 20 63 61 73 65 20 31 20 74 72 75 6d 70   /* case 1 trump
95c0: 73 20 63 61 73 65 20 32 20 2a 2f 0a 20 20 20 20  s case 2 */.    
95d0: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  }.  }.}.#endif /
95e0: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  * !SQLITE_OMIT_O
95f0: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 26  R_OPTIMIZATION &
9600: 26 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  & !SQLITE_OMIT_S
9610: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 2f 2a 0a  UBQUERY */.../*.
9620: 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74 6f 20  ** The input to 
9630: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9640: 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73 74 72  an WhereTerm str
9650: 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c 79  ucture with only
9660: 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72 22 20   the.** "pExpr" 
9670: 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e  field filled in.
9680: 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68 69    The job of thi
9690: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 20  s routine is to 
96a0: 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73  analyze the.** s
96b0: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  ubexpression and
96c0: 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74 68   populate all th
96d0: 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 6f  e other fields o
96e0: 66 20 74 68 65 20 57 68 65 72 65 54 65 72 6d 0a  f the WhereTerm.
96f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ** structure..**
9700: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
9710: 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68 65 20  ssion is of the 
9720: 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c 6f 70  form "<expr> <op
9730: 3e 20 58 22 20 69 74 20 67 65 74 73 20 63 6f 6d  > X" it gets com
9740: 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  muted.** to the 
9750: 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20 6f 66  standard form of
9760: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
9770: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
9780: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
9790: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
97a0: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
97b0: 20 61 6e 64 20 59 20 61 72 65 0a 2a 2a 20 63 6f   and Y are.** co
97c0: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65 20  lumns, then the 
97d0: 6f 72 69 67 69 6e 61 6c 20 65 78 70 72 65 73 73  original express
97e0: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
97f0: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
9800: 61 6c 0a 2a 2a 20 74 65 72 6d 20 6f 66 20 74 68  al.** term of th
9810: 65 20 66 6f 72 6d 20 22 59 20 3c 6f 70 3e 20 58  e form "Y <op> X
9820: 22 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  " is added to th
9830: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61  e WHERE clause a
9840: 6e 64 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 73  nd.** analyzed s
9850: 65 70 61 72 61 74 65 6c 79 2e 20 20 54 68 65 20  eparately.  The 
9860: 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20 69 73  original term is
9870: 20 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52   marked with TER
9880: 4d 5f 43 4f 50 49 45 44 0a 2a 2a 20 61 6e 64 20  M_COPIED.** and 
9890: 74 68 65 20 6e 65 77 20 74 65 72 6d 20 69 73 20  the new term is 
98a0: 6d 61 72 6b 65 64 20 77 69 74 68 20 54 45 52 4d  marked with TERM
98b0: 5f 44 59 4e 41 4d 49 43 20 28 62 65 63 61 75 73  _DYNAMIC (becaus
98c0: 65 20 69 74 27 73 20 70 45 78 70 72 0a 2a 2a 20  e it's pExpr.** 
98d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65  needs to be free
98e0: 64 20 77 69 74 68 20 74 68 65 20 57 68 65 72 65  d with the Where
98f0: 43 6c 61 75 73 65 29 20 61 6e 64 20 54 45 52 4d  Clause) and TERM
9900: 5f 56 49 52 54 55 41 4c 20 28 62 65 63 61 75 73  _VIRTUAL (becaus
9910: 65 20 69 74 0a 2a 2a 20 69 73 20 61 20 63 6f 6d  e it.** is a com
9920: 6d 75 74 65 64 20 63 6f 70 79 20 6f 66 20 61 20  muted copy of a 
9930: 70 72 69 6f 72 20 74 65 72 6d 2e 29 20 20 54 68  prior term.)  Th
9940: 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d 20  e original term 
9950: 68 61 73 20 6e 43 68 69 6c 64 3d 31 0a 2a 2a 20  has nChild=1.** 
9960: 61 6e 64 20 74 68 65 20 63 6f 70 79 20 68 61 73  and the copy has
9970: 20 69 64 78 50 61 72 65 6e 74 20 73 65 74 20 74   idxParent set t
9980: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
9990: 68 65 20 6f 72 69 67 69 6e 61 6c 20 74 65 72 6d  he original term
99a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
99b0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
99c0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
99d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
99e0: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
99f0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
9a00: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
9a10: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
9a20: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a40: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
9a50: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
9a60: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
9a70: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9a90: 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 61 6e  he term to be an
9aa0: 61 6c 79 7a 65 64 20 2a 2f 0a 20 20 57 68 65 72  alyzed */.  Wher
9ab0: 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  eMaskSet *pMaskS
9ac0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et;          /* 
9ad0: 53 65 74 20 6f 66 20 74 61 62 6c 65 20 69 6e 64  Set of table ind
9ae0: 65 78 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 45 78  ex masks */.  Ex
9af0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
9b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9b10: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
9b20: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20   to be analyzed 
9b30: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
9b40: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 20 20 20  reqLeft;        
9b50: 20 20 20 20 20 20 2f 2a 20 50 72 65 72 65 71 75        /* Prerequ
9b60: 65 73 69 74 65 73 20 6f 66 20 74 68 65 20 70 45  esites of the pE
9b70: 78 70 72 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20  xpr->pLeft */.  
9b80: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
9b90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
9ba0: 20 2f 2a 20 50 72 65 72 65 71 75 65 73 69 74 65   /* Prerequesite
9bb0: 73 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a 20 20  s of pExpr */.  
9bc0: 42 69 74 6d 61 73 6b 20 65 78 74 72 61 52 69 67  Bitmask extraRig
9bd0: 68 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  ht = 0;.  int nP
9be0: 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69 73  attern;.  int is
9bf0: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 69 6e 74 20  Complete;.  int 
9c00: 6e 6f 43 61 73 65 3b 0a 20 20 69 6e 74 20 6f 70  noCase;.  int op
9c10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
9c30: 70 2d 6c 65 76 65 6c 20 6f 70 65 72 61 74 6f 72  p-level operator
9c40: 2e 20 20 70 45 78 70 72 2d 3e 6f 70 20 2a 2f 0a  .  pExpr->op */.
9c50: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
9c60: 3d 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 20 20  = pWC->pParse;  
9c70: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9c80: 6e 74 65 78 74 20 2a 2f 0a 20 20 73 71 6c 69 74  ntext */.  sqlit
9c90: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9ca0: 3e 64 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 44  >db;        /* D
9cb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9cc0: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d  on */..  if( db-
9cd0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9ce0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
9cf0: 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d  .  pTerm = &pWC-
9d00: 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70  >a[idxTerm];.  p
9d10: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
9d20: 4d 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72  MaskSet;.  pExpr
9d30: 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
9d40: 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20  .  prereqLeft = 
9d50: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
9d60: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
9d70: 70 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70  pLeft);.  op = p
9d80: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20  Expr->op;.  if( 
9d90: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
9da0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
9db0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
9dc0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
9dd0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78  erty(pExpr, EP_x
9de0: 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20  IsSelect) ){.   
9df0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
9e00: 52 69 67 68 74 20 3d 20 65 78 70 72 53 65 6c 65  Right = exprSele
9e10: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
9e20: 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 78 2e  skSet, pExpr->x.
9e30: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 65  pSelect);.    }e
9e40: 6c 73 65 7b 0a 20 20 20 20 20 20 70 54 65 72 6d  lse{.      pTerm
9e50: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
9e60: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
9e70: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78  ge(pMaskSet, pEx
9e80: 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a 20 20  pr->x.pList);.  
9e90: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
9ea0: 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29 7b  op==TK_ISNULL ){
9eb0: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72  .    pTerm->prer
9ec0: 65 71 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 7d  eqRight = 0;.  }
9ed0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
9ee0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
9ef0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
9f00: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
9f10: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
9f20: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
9f30: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
9f40: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
9f50: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
9f60: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
9f70: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 42 69 74 6d  oin) ){.    Bitm
9f80: 61 73 6b 20 78 20 3d 20 67 65 74 4d 61 73 6b 28  ask x = getMask(
9f90: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
9fa0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
9fb0: 29 3b 0a 20 20 20 20 70 72 65 72 65 71 41 6c 6c  );.    prereqAll
9fc0: 20 7c 3d 20 78 3b 0a 20 20 20 20 65 78 74 72 61   |= x;.    extra
9fd0: 52 69 67 68 74 20 3d 20 78 2d 31 3b 20 20 2f 2a  Right = x-1;  /*
9fe0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
9ff0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
a000: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 2a 2a 20 6f 6e 20 6c 65 66 74        ** on left
a030: 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
a040: 20 4a 4f 49 4e 2e 20 20 54 69 63 6b 65 74 20 23   JOIN.  Ticket #
a050: 33 30 31 35 20 2a 2f 0a 20 20 7d 0a 20 20 70 54  3015 */.  }.  pT
a060: 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d  erm->prereqAll =
a070: 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 70 54   prereqAll;.  pT
a080: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20  erm->leftCursor 
a090: 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 69  = -1;.  pTerm->i
a0a0: 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20 70  Parent = -1;.  p
a0b0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
a0c0: 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77  = 0;.  if( allow
a0d0: 65 64 4f 70 28 6f 70 29 20 26 26 20 28 70 54 65  edOp(op) && (pTe
a0e0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
a0f0: 26 20 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30  & prereqLeft)==0
a100: 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4c   ){.    Expr *pL
a110: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
a120: 66 74 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52  ft;.    Expr *pR
a130: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
a140: 69 67 68 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  ight;.    if( pL
a150: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  eft->op==TK_COLU
a160: 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72  MN ){.      pTer
a170: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  m->leftCursor = 
a180: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
a190: 20 20 20 20 20 70 54 65 72 6d 2d 3e 75 2e 6c 65       pTerm->u.le
a1a0: 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74  ftColumn = pLeft
a1b0: 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
a1c0: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
a1d0: 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73 6b  r = operatorMask
a1e0: 28 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  (op);.    }.    
a1f0: 69 66 28 20 70 52 69 67 68 74 20 26 26 20 70 52  if( pRight && pR
a200: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  ight->op==TK_COL
a210: 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65  UMN ){.      Whe
a220: 72 65 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20  reTerm *pNew;.  
a230: 20 20 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a      Expr *pDup;.
a240: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
a250: 3e 6c 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29  >leftCursor>=0 )
a260: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 64  {.        int id
a270: 78 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44  xNew;.        pD
a280: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
a290: 44 75 70 28 64 62 2c 20 70 45 78 70 72 2c 20 30  Dup(db, pExpr, 0
a2a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64  );.        if( d
a2b0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
a2c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a2d0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
a2e0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
a2f0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
a300: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64      }.        id
a310: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
a320: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44  seInsert(pWC, pD
a330: 75 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c  up, TERM_VIRTUAL
a340: 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a  |TERM_DYNAMIC);.
a350: 20 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e          if( idxN
a360: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ew==0 ) return;.
a370: 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26          pNew = &
a380: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
a390: 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50          pNew->iP
a3a0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
a3b0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
a3c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
a3d0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
a3e0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
a3f0: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74 46        pTerm->wtF
a400: 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50  lags |= TERM_COP
a410: 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  IED;.      }else
a420: 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d  {.        pDup =
a430: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
a440: 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20  pNew = pTerm;.  
a450: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78 70 72      }.      expr
a460: 43 6f 6d 6d 75 74 65 28 70 50 61 72 73 65 2c 20  Commute(pParse, 
a470: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 70 4c 65  pDup);.      pLe
a480: 66 74 20 3d 20 70 44 75 70 2d 3e 70 4c 65 66 74  ft = pDup->pLeft
a490: 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65  ;.      pNew->le
a4a0: 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74  ftCursor = pLeft
a4b0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
a4c0: 70 4e 65 77 2d 3e 75 2e 6c 65 66 74 43 6f 6c 75  pNew->u.leftColu
a4d0: 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c  mn = pLeft->iCol
a4e0: 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  umn;.      pNew-
a4f0: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 70  >prereqRight = p
a500: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20 20 20  rereqLeft;.     
a510: 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41 6c 6c   pNew->prereqAll
a520: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
a530: 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65 72 61      pNew->eOpera
a540: 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61  tor = operatorMa
a550: 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a 20 20  sk(pDup->op);.  
a560: 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66    }.  }..#ifndef
a570: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54   SQLITE_OMIT_BET
a580: 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  WEEN_OPTIMIZATIO
a590: 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65 72 6d  N.  /* If a term
a5a0: 20 69 73 20 74 68 65 20 42 45 54 57 45 45 4e 20   is the BETWEEN 
a5b0: 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61 74 65  operator, create
a5c0: 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75 61 6c   two new virtual
a5d0: 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68 61 74   terms.  ** that
a5e0: 20 64 65 66 69 6e 65 20 74 68 65 20 72 61 6e 67   define the rang
a5f0: 65 20 74 68 61 74 20 74 68 65 20 42 45 54 57 45  e that the BETWE
a600: 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e 20 20  EN implements.  
a610: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 20 20 2a  For example:.  *
a620: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 61 20 42 45  *.  **      a BE
a630: 54 57 45 45 4e 20 62 20 41 4e 44 20 63 0a 20 20  TWEEN b AND c.  
a640: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
a650: 72 74 65 64 20 69 6e 74 6f 3a 0a 20 20 2a 2a 0a  rted into:.  **.
a660: 20 20 2a 2a 20 20 20 20 20 20 28 61 20 42 45 54    **      (a BET
a670: 57 45 45 4e 20 62 20 41 4e 44 20 63 29 20 41 4e  WEEN b AND c) AN
a680: 44 20 28 61 3e 3d 62 29 20 41 4e 44 20 28 61 3c  D (a>=b) AND (a<
a690: 3d 63 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  =c).  **.  ** Th
a6a0: 65 20 74 77 6f 20 6e 65 77 20 74 65 72 6d 73 20  e two new terms 
a6b0: 61 72 65 20 61 64 64 65 64 20 6f 6e 74 6f 20 74  are added onto t
a6c0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 68  he end of the Wh
a6d0: 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63 74  ereClause object
a6e0: 2e 0a 20 20 2a 2a 20 54 68 65 20 6e 65 77 20 74  ..  ** The new t
a6f0: 65 72 6d 73 20 61 72 65 20 22 64 79 6e 61 6d 69  erms are "dynami
a700: 63 22 20 61 6e 64 20 61 72 65 20 63 68 69 6c 64  c" and are child
a710: 72 65 6e 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ren of the origi
a720: 6e 61 6c 20 42 45 54 57 45 45 4e 0a 20 20 2a 2a  nal BETWEEN.  **
a730: 20 74 65 72 6d 2e 20 20 54 68 61 74 20 6d 65 61   term.  That mea
a740: 6e 73 20 74 68 61 74 20 69 66 20 74 68 65 20 42  ns that if the B
a750: 45 54 57 45 45 4e 20 74 65 72 6d 20 69 73 20 63  ETWEEN term is c
a760: 6f 64 65 64 2c 20 74 68 65 20 63 68 69 6c 64 72  oded, the childr
a770: 65 6e 20 61 72 65 0a 20 20 2a 2a 20 73 6b 69 70  en are.  ** skip
a780: 70 65 64 2e 20 20 4f 72 2c 20 69 66 20 74 68 65  ped.  Or, if the
a790: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 73 61   children are sa
a7a0: 74 69 73 66 69 65 64 20 62 79 20 61 6e 20 69 6e  tisfied by an in
a7b0: 64 65 78 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  dex, the origina
a7c0: 6c 0a 20 20 2a 2a 20 42 45 54 57 45 45 4e 20 74  l.  ** BETWEEN t
a7d0: 65 72 6d 20 69 73 20 73 6b 69 70 70 65 64 2e 0a  erm is skipped..
a7e0: 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20    */.  else if( 
a7f0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45  pExpr->op==TK_BE
a800: 54 57 45 45 4e 20 26 26 20 70 57 43 2d 3e 6f 70  TWEEN && pWC->op
a810: 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==TK_AND ){.    
a820: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
a830: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
a840: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
a850: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
a860: 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c   ops[] = {TK_GE,
a870: 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73   TK_LE};.    ass
a880: 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20 29 3b  ert( pList!=0 );
a890: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
a8a0: 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a  st->nExpr==2 );.
a8b0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32      for(i=0; i<2
a8c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
a8d0: 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20  pr *pNewExpr;.  
a8e0: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a      int idxNew;.
a8f0: 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20 3d        pNewExpr =
a900: 20 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50   sqlite3PExpr(pP
a910: 61 72 73 65 2c 20 6f 70 73 5b 69 5d 2c 20 0a 20  arse, ops[i], . 
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a940: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a950: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 30 29 2c  Expr->pLeft, 0),
a960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
a980: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
a990: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
a9a0: 70 72 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20  pr, 0), 0);.    
a9b0: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
a9c0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
a9d0: 2c 20 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d  , pNewExpr, TERM
a9e0: 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59  _VIRTUAL|TERM_DY
a9f0: 4e 41 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65  NAMIC);.      te
aa00: 73 74 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d  stcase( idxNew==
aa10: 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  0 );.      exprA
aa20: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
aa30: 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20 20 20 20  , idxNew);.     
aa40: 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61   pTerm = &pWC->a
aa50: 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20  [idxTerm];.     
aa60: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
aa70: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
aa80: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 65  m;.    }.    pTe
aa90: 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a  rm->nChild = 2;.
aaa0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
aab0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 45 54 57 45 45  LITE_OMIT_BETWEE
aac0: 4e 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  N_OPTIMIZATION *
aad0: 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  /..#if !defined(
aae0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
aaf0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
ab00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
ab10: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20  OMIT_SUBQUERY). 
ab20: 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 20 74 65   /* Analyze a te
ab30: 72 6d 20 74 68 61 74 20 69 73 20 63 6f 6d 70 6f  rm that is compo
ab40: 73 65 64 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f  sed of two or mo
ab50: 72 65 20 73 75 62 74 65 72 6d 73 20 63 6f 6e 6e  re subterms conn
ab60: 65 63 74 65 64 20 62 79 0a 20 20 2a 2a 20 61 6e  ected by.  ** an
ab70: 20 4f 52 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20   OR operator..  
ab80: 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45  */.  else if( pE
ab90: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29  xpr->op==TK_OR )
aba0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 57  {.    assert( pW
abb0: 43 2d 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 3b  C->op==TK_AND );
abc0: 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65  .    exprAnalyze
abd0: 4f 72 54 65 72 6d 28 70 53 72 63 2c 20 70 57 43  OrTerm(pSrc, pWC
abe0: 2c 20 69 64 78 54 65 72 6d 29 3b 0a 20 20 20 20  , idxTerm);.    
abf0: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
ac00: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 7d 0a 23 65  idxTerm];.  }.#e
ac10: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ac20: 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54  MIT_OR_OPTIMIZAT
ac30: 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ION */..#ifndef 
ac40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45  SQLITE_OMIT_LIKE
ac50: 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20 20  _OPTIMIZATION.  
ac60: 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61 69 6e  /* Add constrain
ac70: 74 73 20 74 6f 20 72 65 64 75 63 65 20 74 68 65  ts to reduce the
ac80: 20 73 65 61 72 63 68 20 73 70 61 63 65 20 6f 6e   search space on
ac90: 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 0a   a LIKE or GLOB.
aca0: 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e 0a 20    ** operator.. 
acb0: 20 2a 2a 0a 20 20 2a 2a 20 41 20 6c 69 6b 65 20   **.  ** A like 
acc0: 70 61 74 74 65 72 6e 20 6f 66 20 74 68 65 20 66  pattern of the f
acd0: 6f 72 6d 20 22 78 20 4c 49 4b 45 20 27 61 62 63  orm "x LIKE 'abc
ace0: 25 27 22 20 69 73 20 63 68 61 6e 67 65 64 20 69  %'" is changed i
acf0: 6e 74 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  nto constraints.
ad00: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
ad10: 20 20 20 78 3e 3d 27 61 62 63 27 20 41 4e 44 20     x>='abc' AND 
ad20: 78 3c 27 61 62 64 27 20 41 4e 44 20 78 20 4c 49  x<'abd' AND x LI
ad30: 4b 45 20 27 61 62 63 25 27 0a 20 20 2a 2a 0a 20  KE 'abc%'.  **. 
ad40: 20 2a 2a 20 54 68 65 20 6c 61 73 74 20 63 68 61   ** The last cha
ad50: 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 70 72  racter of the pr
ad60: 65 66 69 78 20 22 61 62 63 22 20 69 73 20 69 6e  efix "abc" is in
ad70: 63 72 65 6d 65 6e 74 65 64 20 74 6f 20 66 6f 72  cremented to for
ad80: 6d 20 74 68 65 0a 20 20 2a 2a 20 74 65 72 6d 69  m the.  ** termi
ad90: 6e 61 74 69 6f 6e 20 63 6f 6e 64 69 74 69 6f 6e  nation condition
ada0: 20 22 61 62 64 22 2e 0a 20 20 2a 2f 0a 20 20 69   "abd"..  */.  i
adb0: 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28  f( isLikeOrGlob(
adc0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 26  pParse, pExpr, &
add0: 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43 6f 6d  nPattern, &isCom
ade0: 70 6c 65 74 65 2c 20 26 6e 6f 43 61 73 65 29 0a  plete, &noCase).
adf0: 20 20 20 20 20 20 20 20 20 26 26 20 70 57 43 2d           && pWC-
ae00: 3e 6f 70 3d 3d 54 4b 5f 41 4e 44 20 29 7b 0a 20  >op==TK_AND ){. 
ae10: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20     Expr *pLeft, 
ae20: 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 45 78 70  *pRight;.    Exp
ae30: 72 20 2a 70 53 74 72 31 2c 20 2a 70 53 74 72 32  r *pStr1, *pStr2
ae40: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  ;.    Expr *pNew
ae50: 45 78 70 72 31 2c 20 2a 70 4e 65 77 45 78 70 72  Expr1, *pNewExpr
ae60: 32 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  2;.    int idxNe
ae70: 77 31 2c 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20  w1, idxNew2;..  
ae80: 20 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d    pLeft = pExpr-
ae90: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  >x.pList->a[1].p
aea0: 45 78 70 72 3b 0a 20 20 20 20 70 52 69 67 68 74  Expr;.    pRight
aeb0: 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73   = pExpr->x.pLis
aec0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
aed0: 20 20 20 70 53 74 72 31 20 3d 20 73 71 6c 69 74     pStr1 = sqlit
aee0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 53 54  e3Expr(db, TK_ST
aef0: 52 49 4e 47 2c 20 70 52 69 67 68 74 2d 3e 75 2e  RING, pRight->u.
af00: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  zToken);.    if(
af10: 20 70 53 74 72 31 20 29 20 70 53 74 72 31 2d 3e   pStr1 ) pStr1->
af20: 75 2e 7a 54 6f 6b 65 6e 5b 6e 50 61 74 74 65 72  u.zToken[nPatter
af30: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 72  n] = 0;.    pStr
af40: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  2 = sqlite3ExprD
af50: 75 70 28 64 62 2c 20 70 53 74 72 31 2c 20 30 29  up(db, pStr1, 0)
af60: 3b 0a 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d  ;.    if( !db->m
af70: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
af80: 20 20 20 20 20 75 38 20 63 2c 20 2a 70 43 3b 20       u8 c, *pC; 
af90: 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 63 68        /* Last ch
afa0: 61 72 61 63 74 65 72 20 62 65 66 6f 72 65 20 74  aracter before t
afb0: 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61 72  he first wildcar
afc0: 64 20 2a 2f 0a 20 20 20 20 20 20 70 43 20 3d 20  d */.      pC = 
afd0: 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 75 2e 7a  (u8*)&pStr2->u.z
afe0: 54 6f 6b 65 6e 5b 6e 50 61 74 74 65 72 6e 2d 31  Token[nPattern-1
aff0: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
b000: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
b010: 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  se ){.        /*
b020: 20 54 68 65 20 70 6f 69 6e 74 20 69 73 20 74 6f   The point is to
b030: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6c   increment the l
b040: 61 73 74 20 63 68 61 72 61 63 74 65 72 20 62 65  ast character be
b050: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a 20  fore the first. 
b060: 20 20 20 20 20 20 20 2a 2a 20 77 69 6c 64 63 61         ** wildca
b070: 72 64 2e 20 20 42 75 74 20 69 66 20 77 65 20 69  rd.  But if we i
b080: 6e 63 72 65 6d 65 6e 74 20 27 40 27 2c 20 74 68  ncrement '@', th
b090: 61 74 20 77 69 6c 6c 20 70 75 73 68 20 69 74 20  at will push it 
b0a0: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  into the.       
b0b0: 20 2a 2a 20 61 6c 70 68 61 62 65 74 69 63 20 72   ** alphabetic r
b0c0: 61 6e 67 65 20 77 68 65 72 65 20 63 61 73 65 20  ange where case 
b0d0: 63 6f 6e 76 65 72 73 69 6f 6e 73 20 77 69 6c 6c  conversions will
b0e0: 20 6d 65 73 73 20 75 70 20 74 68 65 20 0a 20 20   mess up the .  
b0f0: 20 20 20 20 20 20 2a 2a 20 69 6e 65 71 75 61 6c        ** inequal
b100: 69 74 79 2e 20 20 54 6f 20 61 76 6f 69 64 20 74  ity.  To avoid t
b110: 68 69 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  his, make sure t
b120: 6f 20 61 6c 73 6f 20 72 75 6e 20 74 68 65 20 66  o also run the f
b130: 75 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 4c  ull.        ** L
b140: 49 4b 45 20 6f 6e 20 61 6c 6c 20 63 61 6e 64 69  IKE on all candi
b150: 64 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  date expressions
b160: 20 62 79 20 63 6c 65 61 72 69 6e 67 20 74 68 65   by clearing the
b170: 20 69 73 43 6f 6d 70 6c 65 74 65 20 66 6c 61 67   isComplete flag
b180: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
b190: 20 20 20 20 69 66 28 20 63 3d 3d 27 41 27 2d 31      if( c=='A'-1
b1a0: 20 29 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d 20   ) isComplete = 
b1b0: 30 3b 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20  0;..        c = 
b1c0: 73 71 6c 69 74 65 33 55 70 70 65 72 54 6f 4c 6f  sqlite3UpperToLo
b1d0: 77 65 72 5b 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  wer[c];.      }.
b1e0: 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b 20        *pC = c + 
b1f0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65  1;.    }.    pNe
b200: 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65 33  wExpr1 = sqlite3
b210: 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b  PExpr(pParse, TK
b220: 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70 72  _GE, sqlite3Expr
b230: 44 75 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c  Dup(db,pLeft,0),
b240: 70 53 74 72 31 2c 30 29 3b 0a 20 20 20 20 69 64  pStr1,0);.    id
b250: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
b260: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
b270: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
b280: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b290: 4d 49 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61  MIC);.    testca
b2a0: 73 65 28 20 69 64 78 4e 65 77 31 3d 3d 30 20 29  se( idxNew1==0 )
b2b0: 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a  ;.    exprAnalyz
b2c0: 65 28 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78  e(pSrc, pWC, idx
b2d0: 4e 65 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45  New1);.    pNewE
b2e0: 78 70 72 32 20 3d 20 73 71 6c 69 74 65 33 50 45  xpr2 = sqlite3PE
b2f0: 78 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4c  xpr(pParse, TK_L
b300: 54 2c 20 73 71 6c 69 74 65 33 45 78 70 72 44 75  T, sqlite3ExprDu
b310: 70 28 64 62 2c 70 4c 65 66 74 2c 30 29 2c 70 53  p(db,pLeft,0),pS
b320: 74 72 32 2c 30 29 3b 0a 20 20 20 20 69 64 78 4e  tr2,0);.    idxN
b330: 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61 75 73  ew2 = whereClaus
b340: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
b350: 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56 49 52  wExpr2, TERM_VIR
b360: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
b370: 43 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  C);.    testcase
b380: 28 20 69 64 78 4e 65 77 32 3d 3d 30 20 29 3b 0a  ( idxNew2==0 );.
b390: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
b3a0: 70 53 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65  pSrc, pWC, idxNe
b3b0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
b3c0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b3d0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
b3e0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
b3f0: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
b400: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
b410: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
b420: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
b430: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
b440: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
b450: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
b460: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
b470: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
b480: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
b490: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
b4a0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
b4b0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
b4c0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
b4d0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
b4e0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
b4f0: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
b500: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
b510: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
b520: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
b530: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
b540: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
b550: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
b560: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
b570: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
b580: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
b590: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
b5a0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
b5b0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
b5c0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
b5d0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
b5e0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
b5f0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
b600: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
b610: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
b620: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
b630: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
b640: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
b650: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
b660: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b670: 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  >x.pList->a[0].p
b680: 45 78 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20  Expr;.    pLeft 
b690: 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
b6a0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
b6b0: 20 20 70 72 65 72 65 71 45 78 70 72 20 3d 20 65    prereqExpr = e
b6c0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
b6d0: 61 73 6b 53 65 74 2c 20 70 52 69 67 68 74 29 3b  askSet, pRight);
b6e0: 0a 20 20 20 20 70 72 65 72 65 71 43 6f 6c 75 6d  .    prereqColum
b6f0: 6e 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  n = exprTableUsa
b700: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 65  ge(pMaskSet, pLe
b710: 66 74 29 3b 0a 20 20 20 20 69 66 28 20 28 70 72  ft);.    if( (pr
b720: 65 72 65 71 45 78 70 72 20 26 20 70 72 65 72 65  ereqExpr & prere
b730: 71 43 6f 6c 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20  qColumn)==0 ){. 
b740: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45       Expr *pNewE
b750: 78 70 72 3b 0a 20 20 20 20 20 20 70 4e 65 77 45  xpr;.      pNewE
b760: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 50 45 78  xpr = sqlite3PEx
b770: 70 72 28 70 50 61 72 73 65 2c 20 54 4b 5f 4d 41  pr(pParse, TK_MA
b780: 54 43 48 2c 20 0a 20 20 20 20 20 20 20 20 20 20  TCH, .          
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7a0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 45 78      0, sqlite3Ex
b7b0: 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68 74  prDup(db, pRight
b7c0: 2c 20 30 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  , 0), 0);.      
b7d0: 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c  idxNew = whereCl
b7e0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
b7f0: 70 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56  pNewExpr, TERM_V
b800: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
b810: 4d 49 43 29 3b 0a 20 20 20 20 20 20 74 65 73 74  MIC);.      test
b820: 63 61 73 65 28 20 69 64 78 4e 65 77 3d 3d 30 20  case( idxNew==0 
b830: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
b840: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
b850: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
b860: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
b870: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
b880: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
b890: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
b8a0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
b8b0: 20 70 4e 65 77 54 65 72 6d 2d 3e 75 2e 6c 65 66   pNewTerm->u.lef
b8c0: 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d  tColumn = pLeft-
b8d0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  >iColumn;.      
b8e0: 70 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61  pNewTerm->eOpera
b8f0: 74 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a  tor = WO_MATCH;.
b900: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
b910: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
b920: 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  m;.      pTerm =
b930: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
b940: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  ];.      pTerm->
b950: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
b960: 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
b970: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
b980: 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d  .      pNewTerm-
b990: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 54 65  >prereqAll = pTe
b9a0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20  rm->prereqAll;. 
b9b0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
b9c0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
b9d0: 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
b9e0: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 4f 4e 20    /* Prevent ON 
b9f0: 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6f 66 20  clause terms of 
ba00: 61 20 4c 45 46 54 20 4a 4f 49 4e 20 66 72 6f 6d  a LEFT JOIN from
ba10: 20 62 65 69 6e 67 20 75 73 65 64 20 74 6f 20 64   being used to d
ba20: 72 69 76 65 0a 20 20 2a 2a 20 61 6e 20 69 6e 64  rive.  ** an ind
ba30: 65 78 20 66 6f 72 20 74 61 62 6c 65 73 20 74 6f  ex for tables to
ba40: 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
ba50: 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70 54   join..  */.  pT
ba60: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
ba70: 20 7c 3d 20 65 78 74 72 61 52 69 67 68 74 3b 0a   |= extraRight;.
ba80: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
ba90: 54 52 55 45 20 69 66 20 61 6e 79 20 6f 66 20 74  TRUE if any of t
baa0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
bab0: 6e 20 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73  n pList->a[iFirs
bac0: 74 2e 2e 2e 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a  t...] contain.**
bad0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
bae0: 61 6e 79 20 74 61 62 6c 65 20 6f 74 68 65 72 20  any table other 
baf0: 74 68 61 6e 20 74 68 65 20 69 42 61 73 65 20 74  than the iBase t
bb00: 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  able..*/.static 
bb10: 69 6e 74 20 72 65 66 65 72 65 6e 63 65 73 4f 74  int referencesOt
bb20: 68 65 72 54 61 62 6c 65 73 28 0a 20 20 45 78 70  herTables(.  Exp
bb30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
bb40: 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
bb50: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
bb60: 74 68 73 20 6c 69 73 74 20 2a 2f 0a 20 20 57 68  ths list */.  Wh
bb70: 65 72 65 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  ereMaskSet *pMas
bb80: 6b 53 65 74 2c 20 20 20 2f 2a 20 4d 61 70 70 69  kSet,   /* Mappi
bb90: 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73 20 74  ng from tables t
bba0: 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20 69  o bitmaps */.  i
bbb0: 6e 74 20 69 46 69 72 73 74 2c 20 20 20 20 20 20  nt iFirst,      
bbc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 20 73           /* Be s
bbd0: 65 61 72 63 68 69 6e 67 20 77 69 74 68 20 74 68  earching with th
bbe0: 65 20 69 46 69 72 73 74 2d 74 68 20 65 78 70 72  e iFirst-th expr
bbf0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
bc00: 69 42 61 73 65 20 20 20 20 20 20 20 20 20 20 20  iBase           
bc10: 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20        /* Ignore 
bc20: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
bc30: 69 73 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20  is table */.){. 
bc40: 20 42 69 74 6d 61 73 6b 20 61 6c 6c 6f 77 65 64   Bitmask allowed
bc50: 20 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d 61 73   = ~getMask(pMas
bc60: 6b 53 65 74 2c 20 69 42 61 73 65 29 3b 0a 20 20  kSet, iBase);.  
bc70: 77 68 69 6c 65 28 20 69 46 69 72 73 74 3c 70 4c  while( iFirst<pL
bc80: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
bc90: 20 20 69 66 28 20 28 65 78 70 72 54 61 62 6c 65    if( (exprTable
bca0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
bcb0: 70 4c 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2b  pList->a[iFirst+
bcc0: 2b 5d 2e 70 45 78 70 72 29 26 61 6c 6c 6f 77 65  +].pExpr)&allowe
bcd0: 64 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  d)!=0 ){.      r
bce0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
bcf0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
bd00: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
bd10: 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66  utine decides if
bd20: 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
bd30: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
bd40: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
bd50: 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c  use.  If it can,
bd60: 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20   it returns 1.  
bd70: 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73  If pIdx cannot s
bd80: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52  atisfy the.** OR
bd90: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
bda0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
bdb0: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72  rns 0..**.** pOr
bdc0: 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45  derBy is an ORDE
bdd0: 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
bde0: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
bdf0: 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68  ent.  pTab is th
be00: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
be10: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
be20: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
be30: 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74  same SELECT stat
be40: 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ement and.** the
be50: 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72   table has a cur
be60: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
be70: 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61  ase".  pIdx is a
be80: 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e  n index on pTab.
be90: 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73  .**.** nEqCol is
bea0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
beb0: 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74  olumns of pIdx t
bec0: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
bed0: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
bee0: 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66  traints.  Any of
bef0: 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   these columns m
bf00: 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72  ay be missing fr
bf10: 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  om the ORDER BY.
bf20: 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  ** clause and th
bf30: 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c  e match can stil
bf40: 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a  l be a success..
bf50: 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20  **.** All terms 
bf60: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
bf70: 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e  that match again
bf80: 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  st the index mus
bf90: 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41  t be either.** A
bfa0: 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65  SC or DESC.  (Te
bfb0: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
bfc0: 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20   BY clause past 
bfd0: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49  the end of a UNI
bfe0: 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20  QUE.** index do 
bff0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69  not need to sati
c000: 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61  sfy this constra
c010: 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65  int.)  The *pbRe
c020: 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  v value is.** se
c030: 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52  t to 1 if the OR
c040: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
c050: 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74   all DESC and it
c060: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a   is set to 0 if.
c070: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
c080: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53  clause is all AS
c090: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  C..*/.static int
c0a0: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
c0b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c0c0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
c0d0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c0e0: 0a 20 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20  .  WhereMaskSet 
c0f0: 2a 70 4d 61 73 6b 53 65 74 2c 20 2f 2a 20 4d 61  *pMaskSet, /* Ma
c100: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
c110: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20   cursor numbers 
c120: 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20 20  to bitmaps */.  
c130: 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20  Index *pIdx,    
c140: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
c150: 6e 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74  ndex we are test
c160: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73  ing */.  int bas
c170: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
c180: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
c190: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
c1a0: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
c1b0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
c1c0: 65 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65  erBy,     /* The
c1d0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
c1e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c   */.  int nEqCol
c1f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
c200: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78   Number of index
c210: 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d   columns with ==
c220: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
c230: 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20    int *pbRev    
c240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74            /* Set
c250: 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42   to 1 if ORDER B
c260: 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a  Y is DESC */.){.
c270: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c290: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
c2a0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74  rs */.  int sort
c2b0: 4f 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20  Order = 0;      
c2c0: 20 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f          /* XOR o
c2d0: 66 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45  f index and ORDE
c2e0: 52 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74  R BY sort direct
c2f0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ion */.  int nTe
c300: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
c310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
c320: 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74  er of ORDER BY t
c330: 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
c340: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
c350: 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74  pTerm;    /* A t
c360: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
c370: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
c380: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50  sqlite3 *db = pP
c390: 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73  arse->db;..  ass
c3a0: 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
c3b0: 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f   );.  nTerm = pO
c3c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20  rderBy->nExpr;. 
c3d0: 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30   assert( nTerm>0
c3e0: 20 29 3b 0a 0a 20 20 2f 2a 20 41 72 67 75 6d 65   );..  /* Argume
c3f0: 6e 74 20 70 49 64 78 20 6d 75 73 74 20 65 69 74  nt pIdx must eit
c400: 68 65 72 20 70 6f 69 6e 74 20 74 6f 20 61 20 27  her point to a '
c410: 72 65 61 6c 27 20 6e 61 6d 65 64 20 69 6e 64 65  real' named inde
c420: 78 20 73 74 72 75 63 74 75 72 65 2c 20 0a 20 20  x structure, .  
c430: 2a 2a 20 6f 72 20 61 6e 20 69 6e 64 65 78 20 73  ** or an index s
c440: 74 72 75 63 74 75 72 65 20 61 6c 6c 6f 63 61 74  tructure allocat
c450: 65 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  ed on the stack 
c460: 62 79 20 62 65 73 74 42 74 72 65 65 49 6e 64 65  by bestBtreeInde
c470: 78 28 29 20 74 6f 0a 20 20 2a 2a 20 72 65 70 72  x() to.  ** repr
c480: 65 73 65 6e 74 20 74 68 65 20 72 6f 77 69 64 20  esent the rowid 
c490: 69 6e 64 65 78 20 74 68 61 74 20 69 73 20 70 61  index that is pa
c4a0: 72 74 20 6f 66 20 65 76 65 72 79 20 74 61 62 6c  rt of every tabl
c4b0: 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
c4c0: 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20 7c 7c 20   pIdx->zName || 
c4d0: 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3d 3d  (pIdx->nColumn==
c4e0: 31 20 26 26 20 70 49 64 78 2d 3e 61 69 43 6f 6c  1 && pIdx->aiCol
c4f0: 75 6d 6e 5b 30 5d 3d 3d 2d 31 29 20 29 3b 0a 0a  umn[0]==-1) );..
c500: 20 20 2f 2a 20 4d 61 74 63 68 20 74 65 72 6d 73    /* Match terms
c510: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
c520: 20 63 6c 61 75 73 65 20 61 67 61 69 6e 73 74 20   clause against 
c530: 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20 2a 2a 20  columns of.  ** 
c540: 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 2a 2a 0a  the index..  **.
c550: 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69    ** Note that i
c560: 6e 64 69 63 65 73 20 68 61 76 65 20 70 49 64 78  ndices have pIdx
c570: 2d 3e 6e 43 6f 6c 75 6d 6e 20 72 65 67 75 6c 61  ->nColumn regula
c580: 72 20 63 6f 6c 75 6d 6e 73 20 70 6c 75 73 0a 20  r columns plus. 
c590: 20 2a 2a 20 6f 6e 65 20 61 64 64 69 74 69 6f 6e   ** one addition
c5a0: 61 6c 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69  al column contai
c5b0: 6e 69 6e 67 20 74 68 65 20 72 6f 77 69 64 2e 20  ning the rowid. 
c5c0: 20 54 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d   The rowid colum
c5d0: 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 69 6e  n.  ** of the in
c5e0: 64 65 78 20 69 73 20 61 6c 73 6f 20 61 6c 6c 6f  dex is also allo
c5f0: 77 65 64 20 74 6f 20 6d 61 74 63 68 20 61 67 61  wed to match aga
c600: 69 6e 73 74 20 74 68 65 20 4f 52 44 45 52 20 42  inst the ORDER B
c610: 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  Y.  ** clause.. 
c620: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c   */.  for(i=j=0,
c630: 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
c640: 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69  >a; j<nTerm && i
c650: 3c 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  <=pIdx->nColumn;
c660: 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20   i++){.    Expr 
c670: 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a  *pExpr;       /*
c680: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
c690: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
c6a0: 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c  pTerm */.    Col
c6b0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20  lSeq *pColl;    
c6c0: 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67  /* The collating
c6d0: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78   sequence of pEx
c6e0: 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65  pr */.    int te
c6f0: 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20  rmSortOrder; /* 
c700: 53 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74  Sort order for t
c710: 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
c720: 69 6e 74 20 69 43 6f 6c 75 6d 6e 3b 20 20 20 20  int iColumn;    
c730: 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63     /* The i-th c
c740: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64  olumn of the ind
c750: 65 78 2e 20 20 2d 31 20 66 6f 72 20 72 6f 77 69  ex.  -1 for rowi
c760: 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 6f  d */.    int iSo
c770: 72 74 4f 72 64 65 72 3b 20 20 20 20 2f 2a 20 31  rtOrder;    /* 1
c780: 20 66 6f 72 20 44 45 53 43 2c 20 30 20 66 6f 72   for DESC, 0 for
c790: 20 41 53 43 20 6f 6e 20 74 68 65 20 69 2d 74 68   ASC on the i-th
c7a0: 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 20   index term */. 
c7b0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
c7c0: 43 6f 6c 6c 3b 20 2f 2a 20 4e 61 6d 65 20 6f 66  Coll; /* Name of
c7d0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
c7e0: 65 71 75 65 6e 63 65 20 66 6f 72 20 69 2d 74 68  equence for i-th
c7f0: 20 69 6e 64 65 78 20 74 65 72 6d 20 2a 2f 0a 0a   index term */..
c800: 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
c810: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
c820: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
c830: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
c840: 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b  >iTable!=base ){
c850: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f  .      /* Can no
c860: 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73  t use an index s
c870: 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  ort on anything 
c880: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f  that is not a co
c890: 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  lumn in the.    
c8a0: 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74    ** left-most t
c8b0: 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d  able of the FROM
c8c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
c8d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c8e0: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
c8f0: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
c900: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
c910: 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20   if( !pColl ){. 
c920: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d       pColl = db-
c930: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20  >pDfltColl;.    
c940: 7d 0a 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e  }.    if( pIdx->
c950: 7a 4e 61 6d 65 20 26 26 20 69 3c 70 49 64 78 2d  zName && i<pIdx-
c960: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
c970: 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 70 49 64 78    iColumn = pIdx
c980: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
c990: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d 6e       if( iColumn
c9a0: 3d 3d 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  ==pIdx->pTable->
c9b0: 69 50 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  iPKey ){.       
c9c0: 20 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20   iColumn = -1;. 
c9d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 6f       }.      iSo
c9e0: 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e  rtOrder = pIdx->
c9f0: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3b 0a 20  aSortOrder[i];. 
ca00: 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 49 64       zColl = pId
ca10: 78 2d 3e 61 7a 43 6f 6c 6c 5b 69 5d 3b 0a 20 20  x->azColl[i];.  
ca20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
ca30: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
ca40: 20 20 20 69 53 6f 72 74 4f 72 64 65 72 20 3d 20     iSortOrder = 
ca50: 30 3b 0a 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d  0;.      zColl =
ca60: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20   pColl->zName;. 
ca70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45 78     }.    if( pEx
ca80: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 69 43 6f  pr->iColumn!=iCo
ca90: 6c 75 6d 6e 20 7c 7c 20 73 71 6c 69 74 65 33 53  lumn || sqlite3S
caa0: 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a 4e  trICmp(pColl->zN
cab0: 61 6d 65 2c 20 7a 43 6f 6c 6c 29 20 29 7b 0a 20  ame, zColl) ){. 
cac0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f       /* Term j o
cad0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
cae0: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
caf0: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66  atch column i of
cb00: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
cb10: 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c      if( i<nEqCol
cb20: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
cb30: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
cb40: 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  n that is constr
cb50: 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c  ained by == fail
cb60: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20  s to match an.  
cb70: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
cb80: 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20  Y term, that is 
cb90: 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65  OK.  Just ignore
cba0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   that column of 
cbb0: 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
cbc0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
cbd0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
cbe0: 73 65 20 69 66 28 20 69 3d 3d 70 49 64 78 2d 3e  se if( i==pIdx->
cbf0: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
cc00: 20 20 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75     /* Index colu
cc10: 6d 6e 20 69 20 69 73 20 74 68 65 20 72 6f 77 69  mn i is the rowi
cc20: 64 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 74 65  d.  All other te
cc30: 72 6d 73 20 6d 61 74 63 68 2e 20 2a 2f 0a 20 20  rms match. */.  
cc40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cc50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cc60: 20 20 2f 2a 20 49 66 20 61 6e 20 69 6e 64 65 78    /* If an index
cc70: 20 63 6f 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f   column fails to
cc80: 20 6d 61 74 63 68 20 61 6e 64 20 69 73 20 6e 6f   match and is no
cc90: 74 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62 79  t constrained by
cca0: 20 3d 3d 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   ==.        ** t
ccb0: 68 65 6e 20 74 68 65 20 69 6e 64 65 78 20 63 61  hen the index ca
ccc0: 6e 6e 6f 74 20 73 61 74 69 73 66 79 20 74 68 65  nnot satisfy the
ccd0: 20 4f 52 44 45 52 20 42 59 20 63 6f 6e 73 74 72   ORDER BY constr
cce0: 61 69 6e 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f  aint..        */
ccf0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cd00: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
cd10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 64  .    assert( pId
cd20: 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  x->aSortOrder!=0
cd30: 20 7c 7c 20 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20   || iColumn==-1 
cd40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
cd50: 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d  Term->sortOrder=
cd60: 3d 30 20 7c 7c 20 70 54 65 72 6d 2d 3e 73 6f 72  =0 || pTerm->sor
cd70: 74 4f 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20  tOrder==1 );.   
cd80: 20 61 73 73 65 72 74 28 20 69 53 6f 72 74 4f 72   assert( iSortOr
cd90: 64 65 72 3d 3d 30 20 7c 7c 20 69 53 6f 72 74 4f  der==0 || iSortO
cda0: 72 64 65 72 3d 3d 31 20 29 3b 0a 20 20 20 20 74  rder==1 );.    t
cdb0: 65 72 6d 53 6f 72 74 4f 72 64 65 72 20 3d 20 69  ermSortOrder = i
cdc0: 53 6f 72 74 4f 72 64 65 72 20 5e 20 70 54 65 72  SortOrder ^ pTer
cdd0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
cde0: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
cdf0: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72 6d  {.      if( term
ce00: 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f  SortOrder!=sortO
ce10: 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  rder ){.        
ce20: 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f  /* Indices can o
ce30: 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61  nly be used if a
ce40: 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ll ORDER BY term
ce50: 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20  s past the.     
ce60: 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63     ** equality c
ce70: 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61  onstraints are a
ce80: 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f  ll either DESC o
ce90: 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20  r ASC. */.      
cea0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
ceb0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
cec0: 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d       sortOrder =
ced0: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 0a   termSortOrder;.
cee0: 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20      }.    j++;. 
cef0: 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 20 20     pTerm++;.    
cf00: 69 66 28 20 69 43 6f 6c 75 6d 6e 3c 30 20 26 26  if( iColumn<0 &&
cf10: 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65   !referencesOthe
cf20: 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79  rTables(pOrderBy
cf30: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62  , pMaskSet, j, b
cf40: 61 73 65 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ase) ){.      /*
cf50: 20 49 66 20 74 68 65 20 69 6e 64 65 78 65 64 20   If the indexed 
cf60: 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 70 72  column is the pr
cf70: 69 6d 61 72 79 20 6b 65 79 20 61 6e 64 20 65 76  imary key and ev
cf80: 65 72 79 74 68 69 6e 67 20 6d 61 74 63 68 65 73  erything matches
cf90: 0a 20 20 20 20 20 20 2a 2a 20 73 6f 20 66 61 72  .      ** so far
cfa0: 20 61 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65   and none of the
cfb0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
cfc0: 74 6f 20 74 68 65 20 72 69 67 68 74 20 72 65 66  to the right ref
cfd0: 65 72 65 6e 63 65 20 6f 74 68 65 72 0a 20 20 20  erence other.   
cfe0: 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e 20     ** tables in 
cff0: 74 68 65 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 77  the join, then w
d000: 65 20 61 72 65 20 61 73 73 75 72 65 64 20 74 68  e are assured th
d010: 61 74 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  at the index can
d020: 20 62 65 20 75 73 65 64 20 0a 20 20 20 20 20 20   be used .      
d030: 2a 2a 20 74 6f 20 73 6f 72 74 20 62 65 63 61 75  ** to sort becau
d040: 73 65 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  se the primary k
d050: 65 79 20 69 73 20 75 6e 69 71 75 65 20 61 6e 64  ey is unique and
d060: 20 73 6f 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20   so none of the 
d070: 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 63  other.      ** c
d080: 6f 6c 75 6d 6e 73 20 77 69 6c 6c 20 6d 61 6b 65  olumns will make
d090: 20 61 6e 79 20 64 69 66 66 65 72 65 6e 63 65 0a   any difference.
d0a0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6a        */.      j
d0b0: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   = nTerm;.    }.
d0c0: 20 20 7d 0a 0a 20 20 2a 70 62 52 65 76 20 3d 20    }..  *pbRev = 
d0d0: 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b 0a 20 20  sortOrder!=0;.  
d0e0: 69 66 28 20 6a 3e 3d 6e 54 65 72 6d 20 29 7b 0a  if( j>=nTerm ){.
d0f0: 20 20 20 20 2f 2a 20 41 6c 6c 20 74 65 72 6d 73      /* All terms
d100: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
d110: 20 63 6c 61 75 73 65 20 61 72 65 20 63 6f 76 65   clause are cove
d120: 72 65 64 20 62 79 20 74 68 69 73 20 69 6e 64 65  red by this inde
d130: 78 20 73 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73  x so.    ** this
d140: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
d150: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 2e 20  ed for sorting. 
d160: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
d170: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 64 78 2d  .  }.  if( pIdx-
d180: 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e  >onError!=OE_Non
d190: 65 20 26 26 20 69 3d 3d 70 49 64 78 2d 3e 6e 43  e && i==pIdx->nC
d1a0: 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 26 26 20 21  olumn.      && !
d1b0: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
d1c0: 61 62 6c 65 73 28 70 4f 72 64 65 72 42 79 2c 20  ables(pOrderBy, 
d1d0: 70 4d 61 73 6b 53 65 74 2c 20 6a 2c 20 62 61 73  pMaskSet, j, bas
d1e0: 65 29 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  e) ){.    /* All
d1f0: 20 74 65 72 6d 73 20 6f 66 20 74 68 69 73 20 69   terms of this i
d200: 6e 64 65 78 20 6d 61 74 63 68 20 73 6f 6d 65 20  ndex match some 
d210: 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 4f 52  prefix of the OR
d220: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
d230: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
d240: 65 78 20 69 73 20 55 4e 49 51 55 45 20 61 6e 64  ex is UNIQUE and
d250: 20 6e 6f 20 74 65 72 6d 73 20 6f 6e 20 74 68 65   no terms on the
d260: 20 74 61 69 6c 20 6f 66 20 74 68 65 20 4f 52 44   tail of the ORD
d270: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
d280: 75 73 65 20 72 65 66 65 72 65 6e 63 65 20 6f 74  use reference ot
d290: 68 65 72 20 74 61 62 6c 65 73 20 69 6e 20 61 20  her tables in a 
d2a0: 6a 6f 69 6e 2e 20 20 49 66 20 74 68 69 73 20 69  join.  If this i
d2b0: 73 20 61 6c 6c 20 74 72 75 65 20 74 68 65 6e 0a  s all true then.
d2c0: 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 64 65 72      ** the order
d2d0: 20 62 79 20 63 6c 61 75 73 65 20 69 73 20 73 75   by clause is su
d2e0: 70 65 72 66 6c 75 6f 75 73 2e 20 2a 2f 0a 20 20  perfluous. */.  
d2f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
d300: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
d310: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 63  *.** Prepare a c
d320: 72 75 64 65 20 65 73 74 69 6d 61 74 65 20 6f 66  rude estimate of
d330: 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d 20 6f   the logarithm o
d340: 66 20 74 68 65 20 69 6e 70 75 74 20 76 61 6c 75  f the input valu
d350: 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
d360: 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 65 78  s need not be ex
d370: 61 63 74 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  act.  This is on
d380: 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73 74 69  ly used for esti
d390: 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 74 6f  mating.** the to
d3a0: 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65 72 66  tal cost of perf
d3b0: 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  orming operation
d3c0: 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29 20 6f  s with O(logN) o
d3d0: 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20 63 6f  r O(NlogN).** co
d3e0: 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63 61 75  mplexity.  Becau
d3f0: 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61 20 67  se N is just a g
d400: 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f 20 67  uess, it is no g
d410: 72 65 61 74 20 74 72 61 67 65 64 79 20 69 66 0a  reat tragedy if.
d420: 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c 69 74  ** logN is a lit
d430: 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  tle off..*/.stat
d440: 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c 6f 67  ic double estLog
d450: 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20 64 6f  (double N){.  do
d460: 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b 0a 20  uble logN = 1;. 
d470: 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30 3b 0a   double x = 10;.
d480: 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29 7b 0a    while( N>x ){.
d490: 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b 0a 20      logN += 1;. 
d4a0: 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20 7d 0a     x *= 10;.  }.
d4b0: 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b 0a 7d    return logN;.}
d4c0: 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f 75 74  ../*.** Two rout
d4d0: 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74 69 6e  ines for printin
d4e0: 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  g the content of
d4f0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e 64 65   an sqlite3_inde
d500: 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74  x_info.** struct
d510: 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72 20 74  ure.  Used for t
d520: 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
d530: 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66 20 6e  ging only.  If n
d540: 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49 54 45  either.** SQLITE
d550: 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54 45 5f  _TEST or SQLITE_
d560: 44 45 42 55 47 20 61 72 65 20 64 65 66 69 6e 65  DEBUG are define
d570: 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20 72 6f  d, then these ro
d580: 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20 6e 6f  utines.** are no
d590: 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21 64 65  -ops..*/.#if !de
d5a0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
d5b0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
d5c0: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
d5d0: 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69 63 20  E_DEBUG).static 
d5e0: 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 49  void TRACE_IDX_I
d5f0: 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  NPUTS(sqlite3_in
d600: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d610: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d620: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d630: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d640: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d650: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d660: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d670: 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61 69 6e  ntf("  constrain
d680: 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 74 65  t[%d]: col=%d te
d690: 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20 75 73  rmid=%d op=%d us
d6a0: 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20 20 20  abled=%d\n",.   
d6b0: 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d      i,.       p-
d6c0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e  >aConstraint[i].
d6d0: 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20  iColumn,.       
d6e0: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
d6f0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c 0a 20  ].iTermOffset,. 
d700: 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72        p->aConstr
d710: 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20  aint[i].op,.    
d720: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d730: 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a 20 20  t[i].usable);.  
d740: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  }.  for(i=0; i<p
d750: 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29  ->nOrderBy; i++)
d760: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  {.    sqlite3Deb
d770: 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72 64 65  ugPrintf("  orde
d780: 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  rby[%d]: col=%d 
d790: 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  desc=%d\n",.    
d7a0: 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e     i,.       p->
d7b0: 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f 6c  aOrderBy[i].iCol
d7c0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
d7d0: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 29  OrderBy[i].desc)
d7e0: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
d7f0: 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f 4f 55  oid TRACE_IDX_OU
d800: 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f 69 6e  TPUTS(sqlite3_in
d810: 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20  dex_info *p){.  
d820: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21 73 71  int i;.  if( !sq
d830: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
d840: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
d850: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74  i=0; i<p->nConst
d860: 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  raint; i++){.   
d870: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
d880: 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d  ntf("  usage[%d]
d890: 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69  : argvIdx=%d omi
d8a0: 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t=%d\n",.       
d8b0: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
d8c0: 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d  nstraintUsage[i]
d8d0: 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20  .argvIndex,.    
d8e0: 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e     p->aConstrain
d8f0: 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b  tUsage[i].omit);
d900: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65  .  }.  sqlite3De
d910: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
d920: 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64  Num=%d\n", p->id
d930: 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  xNum);.  sqlite3
d940: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
d950: 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e  dxStr=%s\n", p->
d960: 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  idxStr);.  sqlit
d970: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
d980: 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64   orderByConsumed
d990: 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72  =%d\n", p->order
d9a0: 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73  ByConsumed);.  s
d9b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
d9c0: 66 28 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f  f("  estimatedCo
d9d0: 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74  st=%g\n", p->est
d9e0: 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23  imatedCost);.}.#
d9f0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41  else.#define TRA
da00: 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29  CE_IDX_INPUTS(A)
da10: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49  .#define TRACE_I
da20: 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65  DX_OUTPUTS(A).#e
da30: 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 71  ndif../* .** Req
da40: 75 69 72 65 64 20 62 65 63 61 75 73 65 20 62 65  uired because be
da50: 73 74 49 6e 64 65 78 28 29 20 69 73 20 63 61 6c  stIndex() is cal
da60: 6c 65 64 20 62 79 20 62 65 73 74 4f 72 43 6c 61  led by bestOrCla
da70: 75 73 65 49 6e 64 65 78 28 29 20 0a 2a 2f 0a 73  useIndex() .*/.s
da80: 74 61 74 69 63 20 76 6f 69 64 20 62 65 73 74 49  tatic void bestI
da90: 6e 64 65 78 28 0a 20 20 20 20 50 61 72 73 65 2a  ndex(.    Parse*
daa0: 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20  , WhereClause*, 
dab0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
dac0: 74 65 6d 2a 2c 20 42 69 74 6d 61 73 6b 2c 20 45  tem*, Bitmask, E
dad0: 78 70 72 4c 69 73 74 2a 2c 20 57 68 65 72 65 43  xprList*, WhereC
dae0: 6f 73 74 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ost*);../*.** Th
daf0: 69 73 20 72 6f 75 74 69 6e 65 20 61 74 74 65 6d  is routine attem
db00: 70 74 73 20 74 6f 20 66 69 6e 64 20 61 6e 20 73  pts to find an s
db10: 63 61 6e 6e 69 6e 67 20 73 74 72 61 74 65 67 79  canning strategy
db20: 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
db30: 64 20 0a 2a 2a 20 74 6f 20 6f 70 74 69 6d 69 7a  d .** to optimiz
db40: 65 20 61 6e 20 27 4f 52 27 20 65 78 70 72 65 73  e an 'OR' expres
db50: 73 69 6f 6e 20 74 68 61 74 20 69 73 20 70 61 72  sion that is par
db60: 74 20 6f 66 20 61 20 57 48 45 52 45 20 63 6c 61  t of a WHERE cla
db70: 75 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  use. .**.** The 
db80: 74 61 62 6c 65 20 61 73 73 6f 63 69 61 74 65 64  table associated
db90: 20 77 69 74 68 20 46 52 4f 4d 20 63 6c 61 75 73   with FROM claus
dba0: 65 20 74 65 72 6d 20 70 53 72 63 20 6d 61 79 20  e term pSrc may 
dbb0: 62 65 20 65 69 74 68 65 72 20 61 0a 2a 2a 20 72  be either a.** r
dbc0: 65 67 75 6c 61 72 20 42 2d 54 72 65 65 20 74 61  egular B-Tree ta
dbd0: 62 6c 65 20 6f 72 20 61 20 76 69 72 74 75 61 6c  ble or a virtual
dbe0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69   table..*/.stati
dbf0: 63 20 76 6f 69 64 20 62 65 73 74 4f 72 43 6c 61  c void bestOrCla
dc00: 75 73 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73  useIndex(.  Pars
dc10: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
dc20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
dc30: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
dc40: 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20  /.  WhereClause 
dc50: 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20  *pWC,           
dc60: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
dc70: 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  use */.  struct 
dc80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53  SrcList_item *pS
dc90: 72 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d  rc,  /* The FROM
dca0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
dcb0: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
dcc0: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
dcd0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
dce0: 6f 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20  of cursors that 
dcf0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
dd00: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
dd10: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20  *pOrderBy,      
dd20: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
dd30: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57  BY clause */.  W
dd40: 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20  hereCost *pCost 
dd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
dd60: 77 65 73 74 20 63 6f 73 74 20 71 75 65 72 79 20  west cost query 
dd70: 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  plan */.){.#ifnd
dd80: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f  ef SQLITE_OMIT_O
dd90: 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 20  R_OPTIMIZATION. 
dda0: 20 63 6f 6e 73 74 20 69 6e 74 20 69 43 75 72 20   const int iCur 
ddb0: 3d 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b  = pSrc->iCursor;
ddc0: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
ddd0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
dde0: 20 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a   be accessed */.
ddf0: 20 20 63 6f 6e 73 74 20 42 69 74 6d 61 73 6b 20    const Bitmask 
de00: 6d 61 73 6b 53 72 63 20 3d 20 67 65 74 4d 61 73  maskSrc = getMas
de10: 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c  k(pWC->pMaskSet,
de20: 20 69 43 75 72 29 3b 20 20 2f 2a 20 42 69 74 6d   iCur);  /* Bitm
de30: 61 73 6b 20 66 6f 72 20 70 53 72 63 20 2a 2f 0a  ask for pSrc */.
de40: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 20 63 6f    WhereTerm * co
de50: 6e 73 74 20 70 57 43 45 6e 64 20 3d 20 26 70 57  nst pWCEnd = &pW
de60: 43 2d 3e 61 5b 70 57 43 2d 3e 6e 54 65 72 6d 5d  C->a[pWC->nTerm]
de70: 3b 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20  ;        /* End 
de80: 6f 66 20 70 57 43 2d 3e 61 5b 5d 20 2a 2f 0a 20  of pWC->a[] */. 
de90: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
dea0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
deb0: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74     /* A single t
dec0: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
ded0: 20 63 6c 61 75 73 65 20 2a 2f 0a 0a 20 20 2f 2a   clause */..  /*
dee0: 20 53 65 61 72 63 68 20 74 68 65 20 57 48 45 52   Search the WHER
def0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 66  E clause terms f
df00: 6f 72 20 61 20 75 73 61 62 6c 65 20 57 4f 5f 4f  or a usable WO_O
df10: 52 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 66 6f 72  R term. */.  for
df20: 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 70  (pTerm=pWC->a; p
df30: 54 65 72 6d 3c 70 57 43 45 6e 64 3b 20 70 54 65  Term<pWCEnd; pTe
df40: 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70  rm++){.    if( p
df50: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
df60: 3d 57 4f 5f 4f 52 20 0a 20 20 20 20 20 26 26 20  =WO_OR .     && 
df70: 28 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41  ((pTerm->prereqA
df80: 6c 6c 20 26 20 7e 6d 61 73 6b 53 72 63 29 20 26  ll & ~maskSrc) &
df90: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 0a 20 20   notReady)==0.  
dfa0: 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 75 2e     && (pTerm->u.
dfb0: 70 4f 72 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62  pOrInfo->indexab
dfc0: 6c 65 20 26 20 6d 61 73 6b 53 72 63 29 21 3d 30  le & maskSrc)!=0
dfd0: 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 57   .    ){.      W
dfe0: 68 65 72 65 43 6c 61 75 73 65 20 2a 20 63 6f 6e  hereClause * con
dff0: 73 74 20 70 4f 72 57 43 20 3d 20 26 70 54 65 72  st pOrWC = &pTer
e000: 6d 2d 3e 75 2e 70 4f 72 49 6e 66 6f 2d 3e 77 63  m->u.pOrInfo->wc
e010: 3b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65 72  ;.      WhereTer
e020: 6d 20 2a 20 63 6f 6e 73 74 20 70 4f 72 57 43 45  m * const pOrWCE
e030: 6e 64 20 3d 20 26 70 4f 72 57 43 2d 3e 61 5b 70  nd = &pOrWC->a[p
e040: 4f 72 57 43 2d 3e 6e 54 65 72 6d 5d 3b 0a 20 20  OrWC->nTerm];.  
e050: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
e060: 4f 72 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 6e  OrTerm;.      in
e070: 74 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f  t flags = WHERE_
e080: 4d 55 4c 54 49 5f 4f 52 3b 0a 20 20 20 20 20 20  MULTI_OR;.      
e090: 64 6f 75 62 6c 65 20 72 54 6f 74 61 6c 20 3d 20  double rTotal = 
e0a0: 30 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20  0;.      double 
e0b0: 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRow = 0;.      
e0c0: 42 69 74 6d 61 73 6b 20 75 73 65 64 20 3d 20 30  Bitmask used = 0
e0d0: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 4f 72  ;..      for(pOr
e0e0: 54 65 72 6d 3d 70 4f 72 57 43 2d 3e 61 3b 20 70  Term=pOrWC->a; p
e0f0: 4f 72 54 65 72 6d 3c 70 4f 72 57 43 45 6e 64 3b  OrTerm<pOrWCEnd;
e100: 20 70 4f 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20   pOrTerm++){.   
e110: 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
e120: 54 65 72 6d 43 6f 73 74 3b 0a 20 20 20 20 20 20  TermCost;.      
e130: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e    WHERETRACE((".
e140: 2e 2e 20 4d 75 6c 74 69 2d 69 6e 64 65 78 20 4f  .. Multi-index O
e150: 52 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74 65  R testing for te
e160: 72 6d 20 25 64 20 6f 66 20 25 64 2e 2e 2e 2e 5c  rm %d of %d....\
e170: 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28  n", .          (
e180: 70 4f 72 54 65 72 6d 20 2d 20 70 4f 72 57 43 2d  pOrTerm - pOrWC-
e190: 3e 61 29 2c 20 28 70 54 65 72 6d 20 2d 20 70 57  >a), (pTerm - pW
e1a0: 43 2d 3e 61 29 0a 20 20 20 20 20 20 20 20 29 29  C->a).        ))
e1b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  ;.        if( pO
e1c0: 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  rTerm->eOperator
e1d0: 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20  ==WO_AND ){.    
e1e0: 20 20 20 20 20 20 57 68 65 72 65 43 6c 61 75 73        WhereClaus
e1f0: 65 20 2a 70 41 6e 64 57 43 20 3d 20 26 70 4f 72  e *pAndWC = &pOr
e200: 54 65 72 6d 2d 3e 75 2e 70 41 6e 64 49 6e 66 6f  Term->u.pAndInfo
e210: 2d 3e 77 63 3b 0a 20 20 20 20 20 20 20 20 20 20  ->wc;.          
e220: 62 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  bestIndex(pParse
e230: 2c 20 70 41 6e 64 57 43 2c 20 70 53 72 63 2c 20  , pAndWC, pSrc, 
e240: 6e 6f 74 52 65 61 64 79 2c 20 30 2c 20 26 73 54  notReady, 0, &sT
e250: 65 72 6d 43 6f 73 74 29 3b 0a 20 20 20 20 20 20  ermCost);.      
e260: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 72 54    }else if( pOrT
e270: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d  erm->leftCursor=
e280: 3d 69 43 75 72 20 29 7b 0a 20 20 20 20 20 20 20  =iCur ){.       
e290: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 74     WhereClause t
e2a0: 65 6d 70 57 43 3b 0a 20 20 20 20 20 20 20 20 20  empWC;.         
e2b0: 20 74 65 6d 70 57 43 2e 70 50 61 72 73 65 20 3d   tempWC.pParse =
e2c0: 20 70 57 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pWC->pParse;.  
e2d0: 20 20 20 20 20 20 20 20 74 65 6d 70 57 43 2e 70          tempWC.p
e2e0: 4d 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70  MaskSet = pWC->p
e2f0: 4d 61 73 6b 53 65 74 3b 0a 20 20 20 20 20 20 20  MaskSet;.       
e300: 20 20 20 74 65 6d 70 57 43 2e 6f 70 20 3d 20 54     tempWC.op = T
e310: 4b 5f 41 4e 44 3b 0a 20 20 20 20 20 20 20 20 20  K_AND;.         
e320: 20 74 65 6d 70 57 43 2e 61 20 3d 20 70 4f 72 54   tempWC.a = pOrT
e330: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 74  erm;.          t
e340: 65 6d 70 57 43 2e 6e 54 65 72 6d 20 3d 20 31 3b  empWC.nTerm = 1;
e350: 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 49  .          bestI
e360: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 74 65  ndex(pParse, &te
e370: 6d 70 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52  mpWC, pSrc, notR
e380: 65 61 64 79 2c 20 30 2c 20 26 73 54 65 72 6d 43  eady, 0, &sTermC
e390: 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ost);.        }e
e3a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
e3b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
e3c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 54 6f 74 61   }.        rTota
e3d0: 6c 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e 72  l += sTermCost.r
e3e0: 43 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 6e 52  Cost;.        nR
e3f0: 6f 77 20 2b 3d 20 73 54 65 72 6d 43 6f 73 74 2e  ow += sTermCost.
e400: 6e 52 6f 77 3b 0a 20 20 20 20 20 20 20 20 75 73  nRow;.        us
e410: 65 64 20 7c 3d 20 73 54 65 72 6d 43 6f 73 74 2e  ed |= sTermCost.
e420: 75 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  used;.        if
e430: 28 20 72 54 6f 74 61 6c 3e 3d 70 43 6f 73 74 2d  ( rTotal>=pCost-
e440: 3e 72 43 6f 73 74 20 29 20 62 72 65 61 6b 3b 0a  >rCost ) break;.
e450: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
e460: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
e470: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e480: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
e490: 63 61 6e 20 63 6f 73 74 20 74 6f 20 61 63 63 6f  can cost to acco
e4a0: 75 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  unt .      ** fo
e4b0: 72 20 74 68 65 20 63 6f 73 74 20 6f 66 20 74 68  r the cost of th
e4c0: 65 20 73 6f 72 74 2e 20 2a 2f 0a 20 20 20 20 20  e sort. */.     
e4d0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 21 3d 30   if( pOrderBy!=0
e4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 54 6f 74   ){.        rTot
e4f0: 61 6c 20 2b 3d 20 6e 52 6f 77 2a 65 73 74 4c 6f  al += nRow*estLo
e500: 67 28 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 20  g(nRow);.       
e510: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
e520: 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
e530: 73 65 73 20 4f 52 20 63 6f 73 74 20 74 6f 20 25  ses OR cost to %
e540: 2e 39 67 5c 6e 22 2c 20 72 54 6f 74 61 6c 29 29  .9g\n", rTotal))
e550: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
e560: 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 73 74 20   /* If the cost 
e570: 6f 66 20 73 63 61 6e 6e 69 6e 67 20 75 73 69 6e  of scanning usin
e580: 67 20 74 68 69 73 20 4f 52 20 74 65 72 6d 20 66  g this OR term f
e590: 6f 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  or optimization 
e5a0: 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 65 73 73  is.      ** less
e5b0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
e5c0: 74 20 63 6f 73 74 20 73 74 6f 72 65 64 20 69 6e  t cost stored in
e5d0: 20 70 43 6f 73 74 2c 20 72 65 70 6c 61 63 65 20   pCost, replace 
e5e0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 20 20 20  the contents.   
e5f0: 20 20 20 2a 2a 20 6f 66 20 70 43 6f 73 74 2e 20     ** of pCost. 
e600: 2a 2f 0a 20 20 20 20 20 20 57 48 45 52 45 54 52  */.      WHERETR
e610: 41 43 45 28 28 22 2e 2e 2e 20 6d 75 6c 74 69 2d  ACE(("... multi-
e620: 69 6e 64 65 78 20 4f 52 20 63 6f 73 74 3d 25 2e  index OR cost=%.
e630: 39 67 20 6e 72 6f 77 3d 25 2e 39 67 5c 6e 22 2c  9g nrow=%.9g\n",
e640: 20 72 54 6f 74 61 6c 2c 20 6e 52 6f 77 29 29 3b   rTotal, nRow));
e650: 0a 20 20 20 20 20 20 69 66 28 20 72 54 6f 74 61  .      if( rTota
e660: 6c 3c 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 29  l<pCost->rCost )
e670: 7b 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d  {.        pCost-
e680: 3e 72 43 6f 73 74 20 3d 20 72 54 6f 74 61 6c 3b  >rCost = rTotal;
e690: 0a 20 20 20 20 20 20 20 20 70 43 6f 73 74 2d 3e  .        pCost->
e6a0: 6e 52 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20  nRow = nRow;.   
e6b0: 20 20 20 20 20 70 43 6f 73 74 2d 3e 75 73 65 64       pCost->used
e6c0: 20 3d 20 75 73 65 64 3b 0a 20 20 20 20 20 20 20   = used;.       
e6d0: 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46   pCost->plan.wsF
e6e0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
e6f0: 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61        pCost->pla
e700: 6e 2e 75 2e 70 54 65 72 6d 20 3d 20 70 54 65 72  n.u.pTerm = pTer
e710: 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  m;.      }.    }
e720: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
e730: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f 50  QLITE_OMIT_OR_OP
e740: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d 0a  TIMIZATION */.}.
e750: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e760: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
e770: 45 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  E./*.** Allocate
e780: 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6e   and populate an
e790: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
e7a0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 49  nfo structure. I
e7b0: 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73  t is the .** res
e7c0: 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74  ponsibility of t
e7d0: 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  he caller to eve
e7e0: 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 20  ntually release 
e7f0: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
e800: 20 62 79 20 70 61 73 73 69 6e 67 20 74 68 65 20   by passing the 
e810: 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64  pointer returned
e820: 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
e830: 6e 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65  n to sqlite3_fre
e840: 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  e()..*/.static s
e850: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
e860: 6f 20 2a 61 6c 6c 6f 63 61 74 65 49 6e 64 65 78  o *allocateIndex
e870: 49 6e 66 6f 28 0a 20 20 50 61 72 73 65 20 2a 70  Info(.  Parse *p
e880: 50 61 72 73 65 2c 20 0a 20 20 57 68 65 72 65 43  Parse, .  WhereC
e890: 6c 61 75 73 65 20 2a 70 57 43 2c 0a 20 20 73 74  lause *pWC,.  st
e8a0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
e8b0: 6d 20 2a 70 53 72 63 2c 0a 20 20 45 78 70 72 4c  m *pSrc,.  ExprL
e8c0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 0a 29 7b  ist *pOrderBy.){
e8d0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69  .  int i, j;.  i
e8e0: 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 73 74 72 75  nt nTerm;.  stru
e8f0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
e900: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
e910: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
e920: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
e930: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
e940: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
e950: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
e960: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
e970: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
e980: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 6e   *pTerm;.  int n
e990: 4f 72 64 65 72 42 79 3b 0a 20 20 73 71 6c 69 74  OrderBy;.  sqlit
e9a0: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
e9b0: 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 57 48 45 52  IdxInfo;..  WHER
e9c0: 45 54 52 41 43 45 28 28 22 52 65 63 6f 6d 70 75  ETRACE(("Recompu
e9d0: 74 69 6e 67 20 69 6e 64 65 78 20 69 6e 66 6f 20  ting index info 
e9e0: 66 6f 72 20 25 73 2e 2e 2e 5c 6e 22 2c 20 70 53  for %s...\n", pS
e9f0: 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  rc->pTab->zName)
ea00: 29 3b 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 74  );..  /* Count t
ea10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 73  he number of pos
ea20: 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  sible WHERE clau
ea30: 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 72  se constraints r
ea40: 65 66 65 72 72 69 6e 67 0a 20 20 2a 2a 20 74 6f  eferring.  ** to
ea50: 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 74 61   this virtual ta
ea60: 62 6c 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e  ble */.  for(i=n
ea70: 54 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57  Term=0, pTerm=pW
ea80: 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65  C->a; i<pWC->nTe
ea90: 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; i++, pTerm++
eaa0: 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d  ){.    if( pTerm
eab0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20  ->leftCursor != 
eac0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
ead0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73  continue;.    as
eae0: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 65 4f  sert( (pTerm->eO
eaf0: 70 65 72 61 74 6f 72 26 28 70 54 65 72 6d 2d 3e  perator&(pTerm->
eb00: 65 4f 70 65 72 61 74 6f 72 2d 31 29 29 3d 3d 30  eOperator-1))==0
eb10: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
eb20: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
eb30: 6f 72 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20 20  or==WO_IN );.   
eb40: 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d   testcase( pTerm
eb50: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
eb60: 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66  ISNULL );.    if
eb70: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
eb80: 6f 72 20 26 20 28 57 4f 5f 49 4e 7c 57 4f 5f 49  or & (WO_IN|WO_I
eb90: 53 4e 55 4c 4c 29 20 29 20 63 6f 6e 74 69 6e 75  SNULL) ) continu
eba0: 65 3b 0a 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  e;.    nTerm++;.
ebb0: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
ebc0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ebd0: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 63   contains only c
ebe0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 75  olumns in the cu
ebf0: 72 72 65 6e 74 20 0a 20 20 2a 2a 20 76 69 72 74  rrent .  ** virt
ec00: 75 61 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61  ual table then a
ec10: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
ec20: 72 20 74 68 65 20 61 4f 72 64 65 72 42 79 20 70  r the aOrderBy p
ec30: 61 72 74 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20  art of.  ** the 
ec40: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ec50: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
ec60: 2a 2f 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20  */.  nOrderBy = 
ec70: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
ec80: 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
ec90: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
eca0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
ecb0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
ecc0: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
ecd0: 78 70 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  xpr;.      if( p
ece0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
ecf0: 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54  UMN || pExpr->iT
ed00: 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43 75 72  able!=pSrc->iCur
ed10: 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  sor ) break;.   
ed20: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 70 4f   }.    if( i==pO
ed30: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
ed40: 0a 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20  .      nOrderBy 
ed50: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
ed60: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
ed70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
ed80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ed90: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a  fo structure.  *
eda0: 2f 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 73  /.  pIdxInfo = s
edb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65  qlite3DbMallocZe
edc0: 72 6f 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 73  ro(pParse->db, s
edd0: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
ede0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
edf0: 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 28 73              + (s
ee00: 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e 73 29  izeof(*pIdxCons)
ee10: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73 61 67   + sizeof(*pUsag
ee20: 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20 20 20  e))*nTerm.      
ee30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee40: 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70       + sizeof(*p
ee50: 49 64 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64  IdxOrderBy)*nOrd
ee60: 65 72 42 79 20 29 3b 0a 20 20 69 66 28 20 70 49  erBy );.  if( pI
ee70: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
ee80: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
ee90: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
eea0: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 2f   memory");.    /
eeb0: 2a 20 28 64 6f 75 62 6c 65 29 30 20 49 6e 20 63  * (double)0 In c
eec0: 61 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d  ase of SQLITE_OM
eed0: 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
eee0: 54 2e 2e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  T... */.    retu
eef0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
ef00: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  Initialize the s
ef10: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 73  tructure.  The s
ef20: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
ef30: 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  o structure cont
ef40: 61 69 6e 73 0a 20 20 2a 2a 20 6d 61 6e 79 20 66  ains.  ** many f
ef50: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
ef60: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
ef70: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
ef80: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 2a 2a 20  Index from.  ** 
ef90: 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e 20 20  changing them.  
efa0: 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20 73 6f  We have to do so
efb0: 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69 6e 67  me funky casting
efc0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20 20 2a   in order to.  *
efd0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f  * initialize tho
efe0: 73 65 20 66 69 65 6c 64 73 2e 0a 20 20 2a 2f 0a  se fields..  */.
eff0: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
f000: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f010: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
f020: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 70  pIdxInfo[1];.  p
f030: 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74  IdxOrderBy = (st
f040: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f050: 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64  ex_orderby*)&pId
f060: 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20  xCons[nTerm];.  
f070: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
f080: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
f090: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
f0a0: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
f0b0: 72 64 65 72 42 79 5d 3b 0a 20 20 2a 28 69 6e 74  rderBy];.  *(int
f0c0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  *)&pIdxInfo->nCo
f0d0: 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d  nstraint = nTerm
f0e0: 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78  ;.  *(int*)&pIdx
f0f0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
f100: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73   nOrderBy;.  *(s
f110: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
f120: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a  dex_constraint**
f130: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  )&pIdxInfo->aCon
f140: 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78 43 6f  straint = pIdxCo
f150: 6e 73 3b 0a 20 20 2a 28 73 74 72 75 63 74 20 73  ns;.  *(struct s
f160: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
f170: 65 72 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f  erby**)&pIdxInfo
f180: 2d 3e 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64  ->aOrderBy = pId
f190: 78 4f 72 64 65 72 42 79 3b 0a 20 20 2a 28 73 74  xOrderBy;.  *(st
f1a0: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
f1b0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
f1c0: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
f1d0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
f1e0: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f220: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
f230: 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65    for(i=j=0, pTe
f240: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
f250: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
f260: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
f270: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
f280: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
f290: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
f2a0: 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72     assert( (pTer
f2b0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 26 28 70 54  m->eOperator&(pT
f2c0: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 2d 31  erm->eOperator-1
f2d0: 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 74 65 73  ))==0 );.    tes
f2e0: 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f  tcase( pTerm->eO
f2f0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29  perator==WO_IN )
f300: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
f310: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
f320: 3d 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20  ==WO_ISNULL );. 
f330: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
f340: 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49 4e  perator & (WO_IN
f350: 7c 57 4f 5f 49 53 4e 55 4c 4c 29 20 29 20 63 6f  |WO_ISNULL) ) co
f360: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 49 64 78  ntinue;.    pIdx
f370: 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20  Cons[j].iColumn 
f380: 3d 20 70 54 65 72 6d 2d 3e 75 2e 6c 65 66 74 43  = pTerm->u.leftC
f390: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78 43  olumn;.    pIdxC
f3a0: 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73  ons[j].iTermOffs
f3b0: 65 74 20 3d 20 69 3b 0a 20 20 20 20 70 49 64 78  et = i;.    pIdx
f3c0: 43 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 28 75 38  Cons[j].op = (u8
f3d0: 29 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  )pTerm->eOperato
f3e0: 72 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 69  r;.    /* The di
f3f0: 72 65 63 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  rect assignment 
f400: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
f410: 6c 69 6e 65 20 69 73 20 70 6f 73 73 69 62 6c 65  line is possible
f420: 20 6f 6e 6c 79 20 62 65 63 61 75 73 65 0a 20 20   only because.  
f430: 20 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64    ** the WO_ and
f440: 20 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f   SQLITE_INDEX_CO
f450: 4e 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20  NSTRAINT_ codes 
f460: 61 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  are identical.  
f470: 54 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  The.    ** follo
f480: 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65 72  wing asserts ver
f490: 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ify this fact. *
f4a0: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 57 4f  /.    assert( WO
f4b0: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
f4c0: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
f4d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 57  );.    assert( W
f4e0: 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  O_LT==SQLITE_IND
f4f0: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54  EX_CONSTRAINT_LT
f500: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
f510: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
f520: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
f530: 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  E );.    assert(
f540: 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_GT==SQLITE_I
f550: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
f560: 47 54 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  GT );.    assert
f570: 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45 5f  ( WO_GE==SQLITE_
f580: 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54  INDEX_CONSTRAINT
f590: 5f 47 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  _GE );.    asser
f5a0: 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c  t( WO_MATCH==SQL
f5b0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
f5c0: 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20  AINT_MATCH );.  
f5d0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
f5e0: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f  >eOperator & (WO
f5f0: 5f 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c  _EQ|WO_LT|WO_LE|
f600: 57 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d  WO_GT|WO_GE|WO_M
f610: 41 54 43 48 29 20 29 3b 0a 20 20 20 20 6a 2b 2b  ATCH) );.    j++
f620: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
f630: 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b 2b   i<nOrderBy; i++
f640: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
f650: 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61  pr = pOrderBy->a
f660: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [i].pExpr;.    p
f670: 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
f680: 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
f690: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 70 49 64 78  Column;.    pIdx
f6a0: 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63 20  OrderBy[i].desc 
f6b0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
f6c0: 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 7d 0a  .sortOrder;.  }.
f6d0: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
f6e0: 66 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  fo;.}../*.** The
f6f0: 20 74 61 62 6c 65 20 6f 62 6a 65 63 74 20 72 65   table object re
f700: 66 65 72 65 6e 63 65 20 70 61 73 73 65 64 20 61  ference passed a
f710: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
f720: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
f730: 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 72  nction.** must r
f740: 65 70 72 65 73 65 6e 74 20 61 20 76 69 72 74 75  epresent a virtu
f750: 61 6c 20 74 61 62 6c 65 2e 20 54 68 69 73 20 66  al table. This f
f760: 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 73 20  unction invokes 
f770: 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 28 29  the xBestIndex()
f780: 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
f790: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
f7a0: 77 69 74 68 20 74 68 65 20 73 71 6c 69 74 65 33  with the sqlite3
f7b0: 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 70 6f 69 6e  _index_info poin
f7c0: 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
f7d0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
f7e0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
f7f0: 20 6f 63 63 75 72 73 2c 20 70 50 61 72 73 65 20   occurs, pParse 
f800: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
f810: 68 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  h an error messa
f820: 67 65 20 61 6e 64 20 61 0a 2a 2a 20 6e 6f 6e 2d  ge and a.** non-
f830: 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 72 65  zero value is re
f840: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
f850: 65 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  e, 0 is returned
f860: 20 61 6e 64 20 74 68 65 20 6f 75 74 70 75 74 0a   and the output.
f870: 2a 2a 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  ** part of the s
f880: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
f890: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 6c  o structure is l
f8a0: 65 66 74 20 70 6f 70 75 6c 61 74 65 64 2e 0a 2a  eft populated..*
f8b0: 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f 72 20  *.** Whether or 
f8c0: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 20 69 73 20  not an error is 
f8d0: 72 65 74 75 72 6e 65 64 2c 20 69 74 20 69 73 20  returned, it is 
f8e0: 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
f8f0: 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
f900: 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
f910: 79 20 66 72 65 65 20 70 2d 3e 69 64 78 53 74 72  y free p->idxStr
f920: 20 69 66 20 70 2d 3e 6e 65 65 64 54 6f 46 72 65   if p->needToFre
f930: 65 49 64 78 53 74 72 20 69 6e 64 69 63 61 74 65  eIdxStr indicate
f940: 73 0a 2a 2a 20 74 68 61 74 20 74 68 69 73 20 69  s.** that this i
f950: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
f960: 74 61 74 69 63 20 69 6e 74 20 76 74 61 62 42 65  tatic int vtabBe
f970: 73 74 49 6e 64 65 78 28 50 61 72 73 65 20 2a 70  stIndex(Parse *p
f980: 50 61 72 73 65 2c 20 54 61 62 6c 65 20 2a 70 54  Parse, Table *pT
f990: 61 62 2c 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  ab, sqlite3_inde
f9a0: 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 73 71  x_info *p){.  sq
f9b0: 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
f9c0: 62 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 54  b = sqlite3GetVT
f9d0: 61 62 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c  able(pParse->db,
f9e0: 20 70 54 61 62 29 2d 3e 70 56 74 61 62 3b 0a 20   pTab)->pVtab;. 
f9f0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
fa00: 3b 0a 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74  ;..  (void)sqlit
fa10: 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72  e3SafetyOff(pPar
fa20: 73 65 2d 3e 64 62 29 3b 0a 20 20 57 48 45 52 45  se->db);.  WHERE
fa30: 54 52 41 43 45 28 28 22 78 42 65 73 74 49 6e 64  TRACE(("xBestInd
fa40: 65 78 20 66 6f 72 20 25 73 5c 6e 22 2c 20 70 54  ex for %s\n", pT
fa50: 61 62 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 54  ab->zName));.  T
fa60: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
fa70: 70 29 3b 0a 20 20 72 63 20 3d 20 70 56 74 61 62  p);.  rc = pVtab
fa80: 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42 65 73 74  ->pModule->xBest
fa90: 49 6e 64 65 78 28 70 56 74 61 62 2c 20 70 29 3b  Index(pVtab, p);
faa0: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
fab0: 50 55 54 53 28 70 29 3b 0a 20 20 28 76 6f 69 64  PUTS(p);.  (void
fac0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e  )sqlite3SafetyOn
fad0: 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 0a 20  (pParse->db);.. 
fae0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
faf0: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
fb00: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
fb10: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
fb20: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fb30: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
fb40: 69 66 28 20 21 70 56 74 61 62 2d 3e 7a 45 72 72  if( !pVtab->zErr
fb50: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Msg ){.      sql
fb60: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
fb70: 72 73 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74  rse, "%s", sqlit
fb80: 65 33 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20  e3ErrStr(rc));. 
fb90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fba0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
fbb0: 70 50 61 72 73 65 2c 20 22 25 73 22 2c 20 70 56  pParse, "%s", pV
fbc0: 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  tab->zErrMsg);. 
fbd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
fbe0: 65 33 44 62 46 72 65 65 28 70 50 61 72 73 65 2d  e3DbFree(pParse-
fbf0: 3e 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  >db, pVtab->zErr
fc00: 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a  Msg);.  pVtab->z
fc10: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 66  ErrMsg = 0;..  f
fc20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f  or(i=0; i<p->nCo
fc30: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
fc40: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6e      if( !p->aCon
fc50: 73 74 72 61 69 6e 74 5b 69 5d 2e 75 73 61 62 6c  straint[i].usabl
fc60: 65 20 26 26 20 70 2d 3e 61 43 6f 6e 73 74 72 61  e && p->aConstra
fc70: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61 72 67 76  intUsage[i].argv
fc80: 49 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20  Index>0 ){.     
fc90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
fca0: 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20 20  (pParse, .      
fcb0: 20 20 20 20 22 74 61 62 6c 65 20 25 73 3a 20 78      "table %s: x
fcc0: 42 65 73 74 49 6e 64 65 78 20 72 65 74 75 72 6e  BestIndex return
fcd0: 65 64 20 61 6e 20 69 6e 76 61 6c 69 64 20 70 6c  ed an invalid pl
fce0: 61 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65  an", pTab->zName
fcf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
fd00: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
fd10: 45 72 72 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  Err;.}.../*.** C
fd20: 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20  ompute the best 
fd30: 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74  index for a virt
fd40: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
fd50: 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
fd60: 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  is computed by t
fd70: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
fd80: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
fd90: 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64  ual.** table mod
fda0: 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ule.  This routi
fdb0: 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  ne is really jus
fdc0: 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74  t a wrapper that
fdd0: 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20   sets up.** the 
fde0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
fdf0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
fe00: 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  t is used to com
fe10: 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a  municate with.**
fe20: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a   xBestIndex..**.
fe30: 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68  ** In a join, th
fe40: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
fe50: 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69   be called multi
fe60: 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68  ple times for th
fe70: 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61  e.** same virtua
fe80: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71  l table.  The sq
fe90: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
fea0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
feb0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69  eated.** and ini
fec0: 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20  tialized on the 
fed0: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
fee0: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61   and reused on a
fef0: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
ff00: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54   invocations.  T
ff10: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
ff20: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
ff30: 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
ff40: 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  n.** code is gen
ff50: 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73  erated to access
ff60: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
ff70: 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e  le.  The whereIn
ff80: 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72  foDelete() .** r
ff90: 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72  outine takes car
ffa0: 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65  e of freeing the
ffb0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
ffc0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66  nfo structure af
ffd0: 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79  ter.** everybody
ffe0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69   has finished wi
fff0: 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  th it..*/.static
10000 20 76 6f 69 64 20 62 65 73 74 56 69 72 74 75 61   void bestVirtua
10010 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  lIndex(.  Parse 
10020 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
10030 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
10040 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
10050 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
10060 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
10070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
10080 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
10090 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
100a0 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 20 2f  em *pSrc,      /
100b0 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
100c0 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
100d0 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
100e0 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
100f0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
10100 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
10110 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
10120 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
10130 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
10140 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 72 64 65       /* The orde
10150 72 20 62 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20  r by clause */. 
10160 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f 73   WhereCost *pCos
10170 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
10180 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74 20   /* Lowest cost 
10190 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 20 20  query plan */.  
101a0 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
101b0 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 20  fo **ppIdxInfo  
101c0 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61  /* Index informa
101d0 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78  tion passed to x
101e0 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a  BestIndex */.){.
101f0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
10200 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71  pSrc->pTab;.  sq
10210 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
10220 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74   *pIdxInfo;.  st
10230 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
10240 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70  ex_constraint *p
10250 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63  IdxCons;.  struc
10260 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
10270 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
10280 20 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72   *pUsage;.  Wher
10290 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
102a0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20  int i, j;.  int 
102b0 6e 4f 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20  nOrderBy;..  /* 
102c0 4d 61 6b 65 20 73 75 72 65 20 77 73 46 6c 61 67  Make sure wsFlag
102d0 73 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  s is initialized
102e0 20 74 6f 20 73 6f 6d 65 20 73 61 6e 65 20 76 61   to some sane va
102f0 6c 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  lue. Otherwise, 
10300 69 66 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 6c  if the .  ** mal
10310 6c 6f 63 20 69 6e 20 61 6c 6c 6f 63 61 74 65 49  loc in allocateI
10320 6e 64 65 78 49 6e 66 6f 28 29 20 66 61 69 6c 73  ndexInfo() fails
10330 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
10340 6f 6e 20 72 65 74 75 72 6e 73 20 6c 65 61 76 69  on returns leavi
10350 6e 67 0a 20 20 2a 2a 20 77 73 46 6c 61 67 73 20  ng.  ** wsFlags 
10360 69 6e 20 61 6e 20 75 6e 69 6e 69 74 69 61 6c 69  in an uninitiali
10370 7a 65 64 20 73 74 61 74 65 2c 20 74 68 65 20 63  zed state, the c
10380 61 6c 6c 65 72 20 6d 61 79 20 62 65 68 61 76 65  aller may behave
10390 20 75 6e 70 72 65 64 69 63 74 61 62 6c 79 2e 0a   unpredictably..
103a0 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 70 43    */.  memset(pC
103b0 6f 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ost, 0, sizeof(*
103c0 70 43 6f 73 74 29 29 3b 0a 20 20 70 43 6f 73 74  pCost));.  pCost
103d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
103e0 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
103f0 42 4c 45 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  BLE;..  /* If th
10400 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
10410 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 68  info structure h
10420 61 73 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76  as not been prev
10430 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f  iously.  ** allo
10440 63 61 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61  cated and initia
10450 6c 69 7a 65 64 2c 20 74 68 65 6e 20 61 6c 6c 6f  lized, then allo
10460 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
10470 69 7a 65 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f  ize it now..  */
10480 0a 20 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70  .  pIdxInfo = *p
10490 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pIdxInfo;.  if( 
104a0 70 49 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20  pIdxInfo==0 ){. 
104b0 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20     *ppIdxInfo = 
104c0 70 49 64 78 49 6e 66 6f 20 3d 20 61 6c 6c 6f 63  pIdxInfo = alloc
104d0 61 74 65 49 6e 64 65 78 49 6e 66 6f 28 70 50 61  ateIndexInfo(pPa
104e0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
104f0 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 7d 0a 20  pOrderBy);.  }. 
10500 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
10510 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   ){.    return;.
10520 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69    }..  /* At thi
10530 73 20 70 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c  s point, the sql
10540 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
10550 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 70  structure that p
10560 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20  IdxInfo points. 
10570 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68 61 76 65   ** to will have
10580 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
10590 64 2c 20 65 69 74 68 65 72 20 64 75 72 69 6e 67  d, either during
105a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
105b0 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20  ocation or.  ** 
105c0 64 75 72 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f  during some prio
105d0 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e  r invocation.  N
105e0 6f 77 20 77 65 20 6a 75 73 74 20 68 61 76 65 20  ow we just have 
105f0 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20 74 68 65  to customize the
10600 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66  .  ** details of
10610 20 70 49 64 78 49 6e 66 6f 20 66 6f 72 20 74 68   pIdxInfo for th
10620 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
10630 74 69 6f 6e 20 61 6e 64 20 70 61 73 73 20 69 74  tion and pass it
10640 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e   to.  ** xBestIn
10650 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  dex..  */..  /* 
10660 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20  The module name 
10670 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 2e  must be defined.
10680 20 41 6c 73 6f 2c 20 62 79 20 74 68 69 73 20 70   Also, by this p
10690 6f 69 6e 74 20 74 68 65 72 65 20 6d 75 73 74 0a  oint there must.
106a0 20 20 2a 2a 20 62 65 20 61 20 70 6f 69 6e 74 65    ** be a pointe
106b0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
106c0 76 74 61 62 20 73 74 72 75 63 74 75 72 65 2e 20  vtab structure. 
106d0 4f 74 68 65 72 77 69 73 65 0a 20 20 2a 2a 20 73  Otherwise.  ** s
106e0 71 6c 69 74 65 33 56 69 65 77 47 65 74 43 6f 6c  qlite3ViewGetCol
106f0 75 6d 6e 4e 61 6d 65 73 28 29 20 77 6f 75 6c 64  umnNames() would
10700 20 68 61 76 65 20 70 69 63 6b 65 64 20 75 70 20   have picked up 
10710 74 68 65 20 65 72 72 6f 72 2e 20 0a 20 20 2a 2f  the error. .  */
10720 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
10730 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
10740 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
10750 67 5b 30 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  g[0] );.  assert
10760 28 20 73 71 6c 69 74 65 33 47 65 74 56 54 61 62  ( sqlite3GetVTab
10770 6c 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  le(pParse->db, p
10780 54 61 62 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Tab) );..  /* Se
10790 74 20 74 68 65 20 61 43 6f 6e 73 74 72 61 69 6e  t the aConstrain
107a0 74 5b 5d 2e 75 73 61 62 6c 65 20 66 69 65 6c 64  t[].usable field
107b0 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  s and initialize
107c0 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75   all .  ** outpu
107d0 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 7a  t variables to z
107e0 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61  ero..  **.  ** a
107f0 43 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61  Constraint[].usa
10800 62 6c 65 20 69 73 20 74 72 75 65 20 66 6f 72 20  ble is true for 
10810 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 68 65 72  constraints wher
10820 65 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  e the right-hand
10830 0a 20 20 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61  .  ** side conta
10840 69 6e 73 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e  ins only referen
10850 63 65 73 20 74 6f 20 74 61 62 6c 65 73 20 74 6f  ces to tables to
10860 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68 65   the left of the
10870 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61   current.  ** ta
10880 62 6c 65 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ble.  In other w
10890 6f 72 64 73 2c 20 69 66 20 74 68 65 20 63 6f 6e  ords, if the con
108a0 73 74 72 61 69 6e 74 20 69 73 20 6f 66 20 74 68  straint is of th
108b0 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a  e form:.  **.  *
108c0 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75  *           colu
108d0 6d 6e 20 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20  mn = expr.  **. 
108e0 20 2a 2a 20 61 6e 64 20 77 65 20 61 72 65 20 65   ** and we are e
108f0 76 61 6c 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e  valuating a join
10900 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 73 74  , then the const
10910 72 61 69 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20  raint on column 
10920 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61  is .  ** only va
10930 6c 69 64 20 69 66 20 61 6c 6c 20 74 61 62 6c 65  lid if all table
10940 73 20 72 65 66 65 72 65 6e 63 65 64 20 69 6e 20  s referenced in 
10950 65 78 70 72 20 6f 63 63 75 72 20 74 6f 20 74 68  expr occur to th
10960 65 20 6c 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74  e left.  ** of t
10970 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
10980 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a  ing column..  **
10990 0a 20 20 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74  .  ** The aConst
109a0 72 61 69 6e 74 73 5b 5d 20 61 72 72 61 79 20 63  raints[] array c
109b0 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
109c0 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  for all constrai
109d0 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  nts.  ** on the 
109e0 63 75 72 72 65 6e 74 20 74 61 62 6c 65 2e 20 20  current table.  
109f0 54 68 61 74 20 77 61 79 20 77 65 20 6f 6e 6c 79  That way we only
10a00 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74 65   have to compute
10a10 20 69 74 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76   it once.  ** ev
10a20 65 6e 20 74 68 6f 75 67 68 20 77 65 20 6d 69 67  en though we mig
10a30 68 74 20 74 72 79 20 74 6f 20 70 69 63 6b 20 74  ht try to pick t
10a40 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 6d 75  he best index mu
10a50 6c 74 69 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20  ltiple times..  
10a60 2a 2a 20 46 6f 72 20 65 61 63 68 20 61 74 74 65  ** For each atte
10a70 6d 70 74 20 61 74 20 70 69 63 6b 69 6e 67 20 61  mpt at picking a
10a80 6e 20 69 6e 64 65 78 2c 20 74 68 65 20 6f 72 64  n index, the ord
10a90 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
10aa0 74 68 65 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69  the.  ** join mi
10ab0 67 68 74 20 62 65 20 64 69 66 66 65 72 65 6e 74  ght be different
10ac0 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 72   so we have to r
10ad0 65 63 6f 6d 70 75 74 65 20 74 68 65 20 75 73 61  ecompute the usa
10ae0 62 6c 65 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61  ble flag.  ** ea
10af0 63 68 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ch time..  */.  
10b00 70 49 64 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72  pIdxCons = *(str
10b10 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
10b20 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26  x_constraint**)&
10b30 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
10b40 72 61 69 6e 74 3b 0a 20 20 70 55 73 61 67 65 20  raint;.  pUsage 
10b50 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e  = pIdxInfo->aCon
10b60 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
10b70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78 49  for(i=0; i<pIdxI
10b80 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
10b90 3b 20 69 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b  ; i++, pIdxCons+
10ba0 2b 29 7b 0a 20 20 20 20 6a 20 3d 20 70 49 64 78  +){.    j = pIdx
10bb0 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65  Cons->iTermOffse
10bc0 74 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 26  t;.    pTerm = &
10bd0 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70  pWC->a[j];.    p
10be0 49 64 78 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20  IdxCons->usable 
10bf0 3d 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  = (pTerm->prereq
10c00 52 69 67 68 74 26 6e 6f 74 52 65 61 64 79 29 20  Right&notReady) 
10c10 3f 20 30 20 3a 20 31 3b 0a 20 20 7d 0a 20 20 6d  ? 0 : 1;.  }.  m
10c20 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20 30 2c  emset(pUsage, 0,
10c30 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65 5b 30   sizeof(pUsage[0
10c40 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f  ])*pIdxInfo->nCo
10c50 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69 66 28  nstraint);.  if(
10c60 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54   pIdxInfo->needT
10c70 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
10c80 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10c90 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
10ca0 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49 6e 66  );.  }.  pIdxInf
10cb0 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b 0a 20  o->idxStr = 0;. 
10cc0 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
10cd0 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66  m = 0;.  pIdxInf
10ce0 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
10cf0 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Str = 0;.  pIdxI
10d00 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73  nfo->orderByCons
10d10 75 6d 65 64 20 3d 20 30 3b 0a 20 20 2f 2a 20 28  umed = 0;.  /* (
10d20 28 64 6f 75 62 6c 65 29 32 29 20 49 6e 20 63 61  (double)2) In ca
10d30 73 65 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49  se of SQLITE_OMI
10d40 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
10d50 2e 2e 2e 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  ... */.  pIdxInf
10d60 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74  o->estimatedCost
10d70 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42   = SQLITE_BIG_DB
10d80 4c 20 2f 20 28 28 64 6f 75 62 6c 65 29 32 29 3b  L / ((double)2);
10d90 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
10da0 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
10db0 3b 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72 42  ;.  if( !pOrderB
10dc0 79 20 29 7b 0a 20 20 20 20 70 49 64 78 49 6e 66  y ){.    pIdxInf
10dd0 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  o->nOrderBy = 0;
10de0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 74 61 62  .  }..  if( vtab
10df0 42 65 73 74 49 6e 64 65 78 28 70 50 61 72 73 65  BestIndex(pParse
10e00 2c 20 70 54 61 62 2c 20 70 49 64 78 49 6e 66 6f  , pTab, pIdxInfo
10e10 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ) ){.    return;
10e20 0a 20 20 7d 0a 0a 20 20 70 49 64 78 43 6f 6e 73  .  }..  pIdxCons
10e30 20 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69   = *(struct sqli
10e40 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
10e50 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
10e60 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->aConstraint;. 
10e70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 64 78   for(i=0; i<pIdx
10e80 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
10e90 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  t; i++){.    if(
10ea0 20 70 55 73 61 67 65 5b 69 5d 2e 61 72 67 76 49   pUsage[i].argvI
10eb0 6e 64 65 78 3e 30 20 29 7b 0a 20 20 20 20 20 20  ndex>0 ){.      
10ec0 70 43 6f 73 74 2d 3e 75 73 65 64 20 7c 3d 20 70  pCost->used |= p
10ed0 57 43 2d 3e 61 5b 70 49 64 78 43 6f 6e 73 5b 69  WC->a[pIdxCons[i
10ee0 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 5d 2e 70  ].iTermOffset].p
10ef0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
10f00 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
10f10 63 6f 73 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  cost is not allo
10f20 77 65 64 20 74 6f 20 62 65 20 6c 61 72 67 65 72  wed to be larger
10f30 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 49 47   than SQLITE_BIG
10f40 5f 44 42 4c 20 28 74 68 65 0a 20 20 2a 2a 20 69  _DBL (the.  ** i
10f50 6e 69 74 61 6c 20 76 61 6c 75 65 20 6f 66 20 6c  nital value of l
10f60 6f 77 65 73 74 43 6f 73 74 20 69 6e 20 74 68 69  owestCost in thi
10f70 73 20 6c 6f 6f 70 2e 20 49 66 20 69 74 20 69 73  s loop. If it is
10f80 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 2a 2a 20  , then the.  ** 
10f90 28 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74  (cost<lowestCost
10fa0 29 20 74 65 73 74 20 62 65 6c 6f 77 20 77 69 6c  ) test below wil
10fb0 6c 20 6e 65 76 65 72 20 62 65 20 74 72 75 65 2e  l never be true.
10fc0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 55 73 65 20  .  ** .  ** Use 
10fd0 22 28 64 6f 75 62 6c 65 29 32 22 20 69 6e 73 74  "(double)2" inst
10fe0 65 61 64 20 6f 66 20 22 32 2e 30 22 20 69 6e 20  ead of "2.0" in 
10ff0 63 61 73 65 20 4f 4d 49 54 5f 46 4c 4f 41 54 49  case OMIT_FLOATI
11000 4e 47 5f 50 4f 49 4e 54 20 0a 20 20 2a 2a 20 69  NG_POINT .  ** i
11010 73 20 64 65 66 69 6e 65 64 2e 0a 20 20 2a 2f 0a  s defined..  */.
11020 20 20 69 66 28 20 28 53 51 4c 49 54 45 5f 42 49    if( (SQLITE_BI
11030 47 5f 44 42 4c 2f 28 28 64 6f 75 62 6c 65 29 32  G_DBL/((double)2
11040 29 29 3c 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  ))<pIdxInfo->est
11050 69 6d 61 74 65 64 43 6f 73 74 20 29 7b 0a 20 20  imatedCost ){.  
11060 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d    pCost->rCost =
11070 20 28 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c   (SQLITE_BIG_DBL
11080 2f 28 28 64 6f 75 62 6c 65 29 32 29 29 3b 0a 20  /((double)2));. 
11090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 6f 73   }else{.    pCos
110a0 74 2d 3e 72 43 6f 73 74 20 3d 20 70 49 64 78 49  t->rCost = pIdxI
110b0 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f  nfo->estimatedCo
110c0 73 74 3b 0a 20 20 7d 0a 20 20 70 43 6f 73 74 2d  st;.  }.  pCost-
110d0 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
110e0 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 20 20 69   = pIdxInfo;.  i
110f0 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64  f( pIdxInfo->ord
11100 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a  erByConsumed ){.
11110 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
11120 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52 45  wsFlags |= WHERE
11130 5f 4f 52 44 45 52 42 59 3b 0a 20 20 7d 0a 20 20  _ORDERBY;.  }.  
11140 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20  pCost->plan.nEq 
11150 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
11160 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64  >nOrderBy = nOrd
11170 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  erBy;..  /* Try 
11180 74 6f 20 66 69 6e 64 20 61 20 6d 6f 72 65 20 65  to find a more e
11190 66 66 69 63 69 65 6e 74 20 61 63 63 65 73 73 20  fficient access 
111a0 70 61 74 74 65 72 6e 20 62 79 20 75 73 69 6e 67  pattern by using
111b0 20 6d 75 6c 74 69 70 6c 65 20 69 6e 64 65 78 65   multiple indexe
111c0 73 0a 20 20 2a 2a 20 74 6f 20 6f 70 74 69 6d 69  s.  ** to optimi
111d0 7a 65 20 61 6e 20 4f 52 20 65 78 70 72 65 73 73  ze an OR express
111e0 69 6f 6e 20 77 69 74 68 69 6e 20 74 68 65 20 57  ion within the W
111f0 48 45 52 45 20 63 6c 61 75 73 65 2e 20 0a 20 20  HERE clause. .  
11200 2a 2f 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73  */.  bestOrClaus
11210 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
11220 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
11230 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  dy, pOrderBy, pC
11240 6f 73 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ost);.}.#endif /
11250 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11260 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f  RTUALTABLE */../
11270 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75  *.** Find the qu
11280 65 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63  ery plan for acc
11290 65 73 73 69 6e 67 20 61 20 70 61 72 74 69 63 75  essing a particu
112a0 6c 61 72 20 74 61 62 6c 65 2e 20 20 57 72 69 74  lar table.  Writ
112b0 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71 75  e the.** best qu
112c0 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74 73  ery plan and its
112d0 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20 57   cost into the W
112e0 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74 20  hereCost object 
112f0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
11300 2a 2a 20 6c 61 73 74 20 70 61 72 61 6d 65 74 65  ** last paramete
11310 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  r..**.** The low
11320 65 73 74 20 63 6f 73 74 20 70 6c 61 6e 20 77 69  est cost plan wi
11330 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69 73  ns.  The cost is
11340 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20   an estimate of 
11350 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a  the amount of.**
11360 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49 2f   CPU and disk I/
11370 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65 73  O need to proces
11380 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75 73  s the request us
11390 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65 64  ing the selected
113a0 20 70 6c 61 6e 2e 0a 2a 2a 20 46 61 63 74 6f 72   plan..** Factor
113b0 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e 63 65  s that influence
113c0 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a   cost include:.*
113d0 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65 20 65  *.**    *  The e
113e0 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
113f0 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11400 6c 20 62 65 20 72 65 74 72 69 65 76 65 64 2e 20  l be retrieved. 
11410 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20 20 66   (The.**       f
11420 65 77 65 72 20 74 68 65 20 62 65 74 74 65 72 2e  ewer the better.
11430 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68  ).**.**    *  Wh
11440 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72  ether or not sor
11450 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75 72 2e  ting must occur.
11460 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65  .**.**    *  Whe
11470 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 72  ther or not ther
11480 65 20 6d 75 73 74 20 62 65 20 73 65 70 61 72 61  e must be separa
11490 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68  te lookups in th
114a0 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64 65 78  e.**       index
114b0 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61 69 6e   and in the main
114c0 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
114d0 20 74 68 65 72 65 20 77 61 73 20 61 6e 20 49 4e   there was an IN
114e0 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 20  DEXED BY clause 
114f0 28 70 53 72 63 2d 3e 70 49 6e 64 65 78 29 20 61  (pSrc->pIndex) a
11500 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 74  ttached to the t
11510 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 53  able in.** the S
11520 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  QL statement, th
11530 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
11540 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 73 20   only considers 
11550 70 6c 61 6e 73 20 75 73 69 6e 67 20 74 68 65 20  plans using the 
11560 0a 2a 2a 20 6e 61 6d 65 64 20 69 6e 64 65 78 2e  .** named index.
11570 20 49 66 20 6e 6f 20 73 75 63 68 20 70 6c 61 6e   If no such plan
11580 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20   is found, then 
11590 74 68 65 20 72 65 74 75 72 6e 65 64 20 63 6f 73  the returned cos
115a0 74 20 69 73 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  t is.** SQLITE_B
115b0 49 47 5f 44 42 4c 2e 20 49 66 20 61 20 70 6c 61  IG_DBL. If a pla
115c0 6e 20 69 73 20 66 6f 75 6e 64 20 74 68 61 74 20  n is found that 
115d0 75 73 65 73 20 74 68 65 20 6e 61 6d 65 64 20 69  uses the named i
115e0 6e 64 65 78 2c 20 0a 2a 2a 20 74 68 65 6e 20 74  ndex, .** then t
115f0 68 65 20 63 6f 73 74 20 69 73 20 63 61 6c 63 75  he cost is calcu
11600 6c 61 74 65 64 20 69 6e 20 74 68 65 20 75 73 75  lated in the usu
11610 61 6c 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  al way..**.** If
11620 20 61 20 4e 4f 54 20 49 4e 44 45 58 45 44 20 63   a NOT INDEXED c
11630 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 6e 6f 74  lause (pSrc->not
11640 49 6e 64 65 78 65 64 21 3d 30 29 20 77 61 73 20  Indexed!=0) was 
11650 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20  attached to the 
11660 74 61 62 6c 65 20 0a 2a 2a 20 69 6e 20 74 68 65  table .** in the
11670 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
11680 74 2c 20 74 68 65 6e 20 6e 6f 20 69 6e 64 65 78  t, then no index
11690 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
116a0 64 2e 20 48 6f 77 65 76 65 72 2c 20 74 68 65 20  d. However, the 
116b0 0a 2a 2a 20 73 65 6c 65 63 74 65 64 20 70 6c 61  .** selected pla
116c0 6e 20 6d 61 79 20 73 74 69 6c 6c 20 74 61 6b 65  n may still take
116d0 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68   advantage of th
116e0 65 20 74 61 62 6c 65 73 20 62 75 69 6c 74 2d 69  e tables built-i
116f0 6e 20 72 6f 77 69 64 0a 2a 2a 20 69 6e 64 65 78  n rowid.** index
11700 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11710 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78 28   bestBtreeIndex(
11720 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
11730 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
11740 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
11750 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
11760 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
11770 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
11780 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
11790 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
117a0 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
117b0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
117c0 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
117d0 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
117e0 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
117f0 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
11800 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
11810 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
11820 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
11830 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
11840 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
11850 20 2a 2f 0a 20 20 57 68 65 72 65 43 6f 73 74 20   */.  WhereCost 
11860 2a 70 43 6f 73 74 20 20 20 20 20 20 20 20 20 20  *pCost          
11870 20 20 2f 2a 20 4c 6f 77 65 73 74 20 63 6f 73 74    /* Lowest cost
11880 20 71 75 65 72 79 20 70 6c 61 6e 20 2a 2f 0a 29   query plan */.)
11890 7b 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  {.  int iCur = p
118a0 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
118b0 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
118c0 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
118d0 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
118e0 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
118f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
11900 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
11910 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 49 6e  aluating */.  In
11920 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
11930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
11940 79 20 6f 66 20 70 50 72 6f 62 65 2c 20 6f 72 20  y of pProbe, or 
11950 7a 65 72 6f 20 66 6f 72 20 49 50 4b 20 69 6e 64  zero for IPK ind
11960 65 78 20 2a 2f 0a 20 20 69 6e 74 20 65 71 54 65  ex */.  int eqTe
11970 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
11980 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d      /* Current m
11990 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65 71 75  ask of valid equ
119a0 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72 73 20  ality operators 
119b0 2a 2f 0a 20 20 69 6e 74 20 69 64 78 45 71 54 65  */.  int idxEqTe
119c0 72 6d 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rmMask;         
119d0 20 2f 2a 20 49 6e 64 65 78 20 6d 61 73 6b 20 6f   /* Index mask o
119e0 66 20 76 61 6c 69 64 20 65 71 75 61 6c 69 74 79  f valid equality
119f0 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 0a 20   operators */.. 
11a00 20 49 6e 64 65 78 20 70 6b 3b 0a 20 20 75 6e 73   Index pk;.  uns
11a10 69 67 6e 65 64 20 69 6e 74 20 70 6b 69 6e 74 5b  igned int pkint[
11a20 32 5d 20 3d 20 7b 31 30 30 30 30 30 30 2c 20 31  2] = {1000000, 1
11a30 7d 3b 0a 20 20 69 6e 74 20 70 6b 69 63 6f 6c 20  };.  int pkicol 
11a40 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 77 73 46 6c  = -1;.  int wsFl
11a50 61 67 4d 61 73 6b 3b 0a 0a 20 20 6d 65 6d 73 65  agMask;..  memse
11a60 74 28 70 43 6f 73 74 2c 20 30 2c 20 73 69 7a 65  t(pCost, 0, size
11a70 6f 66 28 2a 70 43 6f 73 74 29 29 3b 0a 20 20 70  of(*pCost));.  p
11a80 43 6f 73 74 2d 3e 72 43 6f 73 74 20 3d 20 53 51  Cost->rCost = SQ
11a90 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20  LITE_BIG_DBL;.. 
11aa0 20 2f 2a 20 49 66 20 74 68 65 20 70 53 72 63 20   /* If the pSrc 
11ab0 74 61 62 6c 65 20 69 73 20 74 68 65 20 72 69 67  table is the rig
11ac0 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45  ht table of a LE
11ad0 46 54 20 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20  FT JOIN then we 
11ae0 6d 61 79 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65  may not.  ** use
11af0 20 61 6e 20 69 6e 64 65 78 20 74 6f 20 73 61 74   an index to sat
11b00 69 73 66 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e  isfy IS NULL con
11b10 73 74 72 61 69 6e 74 73 20 6f 6e 20 74 68 61 74  straints on that
11b20 20 74 61 62 6c 65 2e 20 20 54 68 69 73 20 69 73   table.  This is
11b30 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20 63 6f  .  ** because co
11b40 6c 75 6d 6e 73 20 6d 69 67 68 74 20 65 6e 64 20  lumns might end 
11b50 75 70 20 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66  up being NULL if
11b60 20 74 68 65 20 74 61 62 6c 65 20 64 6f 65 73 20   the table does 
11b70 6e 6f 74 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a  not match -.  **
11b80 20 61 20 63 69 72 63 75 6d 73 74 61 6e 63 65 20   a circumstance 
11b90 77 68 69 63 68 20 74 68 65 20 69 6e 64 65 78 20  which the index 
11ba0 63 61 6e 6e 6f 74 20 68 65 6c 70 20 75 73 20 64  cannot help us d
11bb0 69 73 63 6f 76 65 72 2e 20 20 54 69 63 6b 65 74  iscover.  Ticket
11bc0 20 23 32 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69   #2177..  */.  i
11bd0 66 28 20 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70  f( pSrc->jointyp
11be0 65 20 26 20 4a 54 5f 4c 45 46 54 20 29 7b 0a 20  e & JT_LEFT ){. 
11bf0 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b     idxEqTermMask
11c00 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a   = WO_EQ|WO_IN;.
11c10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78    }else{.    idx
11c20 45 71 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f  EqTermMask = WO_
11c30 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55  EQ|WO_IN|WO_ISNU
11c40 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  LL;.  }..  if( p
11c50 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 7b 0a 20  Src->pIndex ){. 
11c60 20 20 20 70 49 64 78 20 3d 20 70 50 72 6f 62 65     pIdx = pProbe
11c70 20 3d 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3b   = pSrc->pIndex;
11c80 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
11c90 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
11ca0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
11cb0 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
11cc0 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
11cd0 6d 4d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  mMask;.  }else{.
11ce0 20 20 20 20 49 6e 64 65 78 20 2a 70 46 69 72 73      Index *pFirs
11cf0 74 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e  t = pSrc->pTab->
11d00 70 49 6e 64 65 78 3b 0a 20 20 20 20 6d 65 6d 73  pIndex;.    mems
11d10 65 74 28 26 70 6b 2c 20 30 2c 20 73 69 7a 65 6f  et(&pk, 0, sizeo
11d20 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 70  f(Index));.    p
11d30 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31 3b 0a 20  k.nColumn = 1;. 
11d40 20 20 20 70 6b 2e 61 69 43 6f 6c 75 6d 6e 20 3d     pk.aiColumn =
11d50 20 26 70 6b 69 63 6f 6c 3b 0a 20 20 20 20 70 6b   &pkicol;.    pk
11d60 2e 61 69 52 6f 77 45 73 74 20 3d 20 70 6b 69 6e  .aiRowEst = pkin
11d70 74 3b 0a 20 20 20 20 70 6b 2e 6f 6e 45 72 72 6f  t;.    pk.onErro
11d80 72 20 3d 20 4f 45 5f 52 65 70 6c 61 63 65 3b 0a  r = OE_Replace;.
11d90 20 20 20 20 70 6b 2e 70 54 61 62 6c 65 20 3d 20      pk.pTable = 
11da0 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 20 20  pSrc->pTab;.    
11db0 69 66 28 20 70 53 72 63 2d 3e 6e 6f 74 49 6e 64  if( pSrc->notInd
11dc0 65 78 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  exed==0 ){.     
11dd0 20 70 6b 2e 70 4e 65 78 74 20 3d 20 70 46 69 72   pk.pNext = pFir
11de0 73 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  st;.    }.    if
11df0 28 20 70 46 69 72 73 74 20 26 26 20 70 46 69 72  ( pFirst && pFir
11e00 73 74 2d 3e 61 69 52 6f 77 45 73 74 20 29 7b 0a  st->aiRowEst ){.
11e10 20 20 20 20 20 20 70 6b 69 6e 74 5b 30 5d 20 3d        pkint[0] =
11e20 20 70 46 69 72 73 74 2d 3e 61 69 52 6f 77 45 73   pFirst->aiRowEs
11e30 74 5b 30 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  t[0];.    }.    
11e40 70 50 72 6f 62 65 20 3d 20 26 70 6b 3b 0a 20 20  pProbe = &pk;.  
11e50 20 20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e    wsFlagMask = ~
11e60 28 0a 20 20 20 20 20 20 20 20 57 48 45 52 45 5f  (.        WHERE_
11e70 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
11e80 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48 45 52 45 5f  COLUMN_EQ|WHERE_
11e90 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 7c 57 48 45 52  COLUMN_NULL|WHER
11ea0 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 0a 20  E_COLUMN_RANGE. 
11eb0 20 20 20 29 3b 0a 20 20 20 20 65 71 54 65 72 6d     );.    eqTerm
11ec0 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f  Mask = WO_EQ|WO_
11ed0 49 4e 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 30  IN;.    pIdx = 0
11ee0 3b 0a 20 20 7d 0a 0a 0a 20 20 66 6f 72 28 3b 20  ;.  }...  for(; 
11ef0 70 50 72 6f 62 65 3b 20 70 49 64 78 3d 70 50 72  pProbe; pIdx=pPr
11f00 6f 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78  obe=pProbe->pNex
11f10 74 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  t){.    const un
11f20 73 69 67 6e 65 64 20 69 6e 74 20 2a 20 63 6f 6e  signed int * con
11f30 73 74 20 61 69 52 6f 77 45 73 74 20 3d 20 70 50  st aiRowEst = pP
11f40 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 3b 0a  robe->aiRowEst;.
11f50 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
11f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f70 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
11f80 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20 20 20 64   pProbe */.    d
11f90 6f 75 62 6c 65 20 6e 52 6f 77 3b 20 20 20 20 20  ouble nRow;     
11fa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73             /* Es
11fb0 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f  timated number o
11fc0 66 20 72 6f 77 73 20 69 6e 20 72 65 73 75 6c 74  f rows in result
11fd0 20 73 65 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20   set */.    int 
11fe0 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  rev;            
11ff0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
12000 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72  to scan in rever
12010 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  se order */.    
12020 69 6e 74 20 77 73 46 6c 61 67 73 20 3d 20 30 3b  int wsFlags = 0;
12030 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 75 73 65  .    Bitmask use
12040 64 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 54  d = 0;..    /* T
12050 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
12060 69 61 62 6c 65 73 20 61 72 65 20 70 6f 70 75 6c  iables are popul
12070 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
12080 65 20 70 72 6f 70 65 72 74 69 65 73 20 6f 66 0a  e properties of.
12090 20 20 20 20 2a 2a 20 73 63 61 6e 20 62 65 69 6e      ** scan bein
120a0 67 20 65 76 61 6c 75 61 74 65 64 2e 20 54 68 65  g evaluated. The
120b0 79 20 61 72 65 20 74 68 65 6e 20 75 73 65 64 20  y are then used 
120c0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
120d0 20 65 78 70 65 63 74 65 64 0a 20 20 20 20 2a 2a   expected.    **
120e0 20 63 6f 73 74 20 61 6e 64 20 6e 75 6d 62 65 72   cost and number
120f0 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65   of rows returne
12100 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
12110 20 20 6e 45 71 3a 20 0a 20 20 20 20 2a 2a 20 20    nEq: .    **  
12120 20 20 4e 75 6d 62 65 72 20 6f 66 20 65 71 75 61    Number of equa
12130 6c 69 74 79 20 74 65 72 6d 73 20 74 68 61 74 20  lity terms that 
12140 63 61 6e 20 62 65 20 69 6d 70 6c 65 6d 65 6e 74  can be implement
12150 65 64 20 75 73 69 6e 67 20 74 68 65 20 69 6e 64  ed using the ind
12160 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ex..    **.    *
12170 2a 20 20 6e 49 6e 4d 75 6c 3a 20 20 0a 20 20 20  *  nInMul:  .   
12180 20 2a 2a 20 20 20 20 54 68 65 20 22 69 6e 2d 6d   **    The "in-m
12190 75 6c 74 69 70 6c 69 65 72 22 2e 20 54 68 69 73  ultiplier". This
121a0 20 69 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20   is an estimate 
121b0 6f 66 20 68 6f 77 20 6d 61 6e 79 20 73 65 65 6b  of how many seek
121c0 20 6f 70 65 72 61 74 69 6f 6e 73 20 0a 20 20 20   operations .   
121d0 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20 6d 75   **    SQLite mu
121e0 73 74 20 70 65 72 66 6f 72 6d 20 6f 6e 20 74 68  st perform on th
121f0 65 20 69 6e 64 65 78 20 69 6e 20 71 75 65 73 74  e index in quest
12200 69 6f 6e 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ion. For example
12210 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
12220 20 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65      WHERE clause
12230 20 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20   is:.    **.    
12240 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
12250 49 4e 20 28 31 2c 20 32 2c 20 33 29 20 41 4e 44  IN (1, 2, 3) AND
12260 20 62 20 49 4e 20 28 34 2c 20 35 2c 20 36 29 0a   b IN (4, 5, 6).
12270 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
12280 20 53 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72   SQLite must per
12290 66 6f 72 6d 20 39 20 6c 6f 6f 6b 75 70 73 20 6f  form 9 lookups o
122a0 6e 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 28 61  n an index on (a
122b0 2c 20 62 29 2c 20 73 6f 20 6e 49 6e 4d 75 6c 20  , b), so nInMul 
122c0 69 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 73 65  is .    **    se
122d0 74 20 74 6f 20 39 2e 20 47 69 76 65 6e 20 74 68  t to 9. Given th
122e0 65 20 73 61 6d 65 20 73 63 68 65 6d 61 20 61 6e  e same schema an
122f0 64 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  d either of the 
12300 66 6f 6c 6c 6f 77 69 6e 67 20 57 48 45 52 45 20  following WHERE 
12310 0a 20 20 20 20 2a 2a 20 20 20 20 63 6c 61 75 73  .    **    claus
12320 65 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  es:.    **.    *
12330 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20 3d  *      WHERE a =
12340 20 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20    1.    **      
12350 57 48 45 52 45 20 61 20 3e 3d 20 32 0a 20 20 20  WHERE a >= 2.   
12360 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 6e 49   **.    **    nI
12370 6e 4d 75 6c 20 69 73 20 73 65 74 20 74 6f 20 31  nMul is set to 1
12380 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12390 20 20 20 49 66 20 74 68 65 72 65 20 65 78 69 73     If there exis
123a0 74 73 20 61 20 57 48 45 52 45 20 74 65 72 6d 20  ts a WHERE term 
123b0 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20 49  of the form "x I
123c0 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 2c  N (SELECT ...)",
123d0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 20 20   then .    **   
123e0 20 74 68 65 20 73 75 62 2d 73 65 6c 65 63 74 20   the sub-select 
123f0 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 72 65  is assumed to re
12400 74 75 72 6e 20 32 35 20 72 6f 77 73 20 66 6f 72  turn 25 rows for
12410 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
12420 20 0a 20 20 20 20 2a 2a 20 20 20 20 64 65 74 65   .    **    dete
12430 72 6d 69 6e 69 6e 67 20 6e 49 6e 4d 75 6c 2e 0a  rmining nInMul..
12440 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62      **.    **  b
12450 49 6e 45 73 74 3a 20 20 0a 20 20 20 20 2a 2a 20  InEst:  .    ** 
12460 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 69     Set to true i
12470 66 20 74 68 65 72 65 20 77 61 73 20 61 74 20 6c  f there was at l
12480 65 61 73 74 20 6f 6e 65 20 22 78 20 49 4e 20 28  east one "x IN (
12490 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 74 65 72  SELECT ...)" ter
124a0 6d 20 75 73 65 64 20 0a 20 20 20 20 2a 2a 20 20  m used .    **  
124b0 20 20 69 6e 20 64 65 74 65 72 6d 69 6e 69 6e 67    in determining
124c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 49   the value of nI
124d0 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  nMul..    **.   
124e0 20 2a 2a 20 20 6e 42 6f 75 6e 64 3a 20 20 0a 20   **  nBound:  . 
124f0 20 20 20 2a 2a 20 20 20 20 53 65 74 20 62 61 73     **    Set bas
12500 65 64 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ed on whether or
12510 20 6e 6f 74 20 74 68 65 72 65 20 69 73 20 61 20   not there is a 
12520 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
12530 20 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   on the .    ** 
12540 20 20 20 28 6e 45 71 2b 31 29 74 68 20 63 6f 6c     (nEq+1)th col
12550 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78  umn of the index
12560 2e 20 31 20 69 66 20 74 68 65 72 65 20 69 73 20  . 1 if there is 
12570 6e 65 69 74 68 65 72 20 61 6e 20 75 70 70 65 72  neither an upper
12580 20 6f 72 20 0a 20 20 20 20 2a 2a 20 20 20 20 6c   or .    **    l
12590 6f 77 65 72 20 62 6f 75 6e 64 2c 20 33 20 69 66  ower bound, 3 if
125a0 20 74 68 65 72 65 20 69 73 20 61 6e 20 75 70 70   there is an upp
125b0 65 72 20 6f 72 20 6c 6f 77 65 72 20 62 6f 75 6e  er or lower boun
125c0 64 2c 20 6f 72 20 39 20 69 66 20 74 68 65 72 65  d, or 9 if there
125d0 20 0a 20 20 20 20 2a 2a 20 20 20 20 69 73 20 62   .    **    is b
125e0 6f 74 68 20 61 6e 20 75 70 70 65 72 20 61 6e 64  oth an upper and
125f0 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2e 0a 20 20   lower bound..  
12600 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 62 53 6f    **.    **  bSo
12610 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a 20 20 20  rt:   .    **   
12620 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
12630 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52  f there is an OR
12640 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 74 68  DER BY clause th
12650 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
12660 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20 65 78  an .    **    ex
12670 74 65 72 6e 61 6c 20 73 6f 72 74 20 28 69 2e 65  ternal sort (i.e
12680 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68 65 20 69  . scanning the i
12690 6e 64 65 78 20 62 65 69 6e 67 20 65 76 61 6c 75  ndex being evalu
126a0 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74 20 0a 20  ated will not . 
126b0 20 20 20 2a 2a 20 20 20 20 63 6f 72 72 65 63 74     **    correct
126c0 6c 79 20 6f 72 64 65 72 20 72 65 63 6f 72 64 73  ly order records
126d0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
126e0 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20 20 20 20    bLookup: .    
126f0 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54  **    Boolean. T
12700 72 75 65 20 69 66 20 66 6f 72 20 65 61 63 68 20  rue if for each 
12710 69 6e 64 65 78 20 65 6e 74 72 79 20 76 69 73 69  index entry visi
12720 74 65 64 20 61 20 6c 6f 6f 6b 75 70 20 6f 6e 20  ted a lookup on 
12730 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 63  the .    **    c
12740 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 61 62  orresponding tab
12750 6c 65 20 62 2d 74 72 65 65 20 69 73 20 72 65 71  le b-tree is req
12760 75 69 72 65 64 2e 20 54 68 69 73 20 69 73 20 61  uired. This is a
12770 6c 77 61 79 73 20 66 61 6c 73 65 20 0a 20 20 20  lways false .   
12780 20 2a 2a 20 20 20 20 66 6f 72 20 74 68 65 20 72   **    for the r
12790 6f 77 69 64 20 69 6e 64 65 78 2e 20 46 6f 72 20  owid index. For 
127a0 6f 74 68 65 72 20 69 6e 64 65 78 65 73 2c 20 69  other indexes, i
127b0 74 20 69 73 20 74 72 75 65 20 75 6e 6c 65 73 73  t is true unless
127c0 20 61 6c 6c 20 74 68 65 20 0a 20 20 20 20 2a 2a   all the .    **
127d0 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74      columns of t
127e0 68 65 20 74 61 62 6c 65 20 75 73 65 64 20 62 79  he table used by
127f0 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
12800 65 6d 65 6e 74 20 61 72 65 20 70 72 65 73 65 6e  ement are presen
12810 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20 20 20 20  t in .    **    
12820 74 68 65 20 69 6e 64 65 78 20 28 73 75 63 68 20  the index (such 
12830 61 6e 20 69 6e 64 65 78 20 69 73 20 73 6f 6d 65  an index is some
12840 74 69 6d 65 73 20 64 65 73 63 72 69 62 65 64 20  times described 
12850 61 73 20 61 20 63 6f 76 65 72 69 6e 67 20 69 6e  as a covering in
12860 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20 20 20 20  dex)..    **    
12870 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 67 69 76  For example, giv
12880 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 20  en the index on 
12890 28 61 2c 20 62 29 2c 20 74 68 65 20 73 65 63 6f  (a, b), the seco
128a0 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nd of the follow
128b0 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20 20 20 74  ing .    **    t
128c0 77 6f 20 71 75 65 72 69 65 73 20 72 65 71 75 69  wo queries requi
128d0 72 65 73 20 74 61 62 6c 65 20 62 2d 74 72 65 65  res table b-tree
128e0 20 6c 6f 6f 6b 75 70 73 2c 20 62 75 74 20 74 68   lookups, but th
128f0 65 20 66 69 72 73 74 20 64 6f 65 73 20 6e 6f 74  e first does not
12900 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
12910 20 20 20 20 20 20 20 20 20 20 20 20 53 45 4c 45              SELE
12920 43 54 20 61 2c 20 62 20 20 20 20 46 52 4f 4d 20  CT a, b    FROM 
12930 74 62 6c 20 57 48 45 52 45 20 61 20 3d 20 31 3b  tbl WHERE a = 1;
12940 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
12950 20 20 20 20 53 45 4c 45 43 54 20 61 2c 20 62 2c      SELECT a, b,
12960 20 63 20 46 52 4f 4d 20 74 62 6c 20 57 48 45 52   c FROM tbl WHER
12970 45 20 61 20 3d 20 31 3b 0a 20 20 20 20 2a 2f 0a  E a = 1;.    */.
12980 20 20 20 20 69 6e 74 20 6e 45 71 3b 0a 20 20 20      int nEq;.   
12990 20 69 6e 74 20 62 49 6e 45 73 74 20 3d 20 30 3b   int bInEst = 0;
129a0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d 75 6c 20  .    int nInMul 
129b0 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 6e 42 6f  = 1;.    int nBo
129c0 75 6e 64 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  und = 1;.    int
129d0 20 62 53 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20   bSort = 0;.    
129e0 69 6e 74 20 62 4c 6f 6f 6b 75 70 20 3d 20 30 3b  int bLookup = 0;
129f0 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d 69  ..    /* Determi
12a00 6e 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  ne the values of
12a10 20 6e 45 71 20 61 6e 64 20 6e 49 6e 4d 75 6c 20   nEq and nInMul 
12a20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 45 71 3d 30  */.    for(nEq=0
12a30 3b 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e 6e 43  ; nEq<pProbe->nC
12a40 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20  olumn; nEq++){. 
12a50 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
12a60 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
12a70 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72   /* A single ter
12a80 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  m of the WHERE c
12a90 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 69  lause */.      i
12aa0 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
12ab0 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20  iColumn[nEq];.  
12ac0 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
12ad0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
12ae0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 65 71 54  j, notReady, eqT
12af0 65 72 6d 4d 61 73 6b 2c 20 70 49 64 78 29 3b 0a  ermMask, pIdx);.
12b00 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d        if( pTerm=
12b10 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
12b20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57 48    wsFlags |= (WH
12b30 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 7c 57 48  ERE_COLUMN_EQ|WH
12b40 45 52 45 5f 52 4f 57 49 44 5f 45 51 29 3b 0a 20  ERE_ROWID_EQ);. 
12b50 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
12b60 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49  eOperator & WO_I
12b70 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  N ){.        Exp
12b80 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d  r *pExpr = pTerm
12b90 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12ba0 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52   wsFlags |= WHER
12bb0 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20  E_COLUMN_IN;.   
12bc0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
12bd0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
12be0 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
12bf0 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e 4d 75  .          nInMu
12c00 6c 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  l *= 25;.       
12c10 20 20 20 62 49 6e 45 73 74 20 3d 20 31 3b 0a 20     bInEst = 1;. 
12c20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12c30 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20   pExpr->x.pList 
12c40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 49 6e  ){.          nIn
12c50 4d 75 6c 20 2a 3d 20 70 45 78 70 72 2d 3e 78 2e  Mul *= pExpr->x.
12c60 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31  pList->nExpr + 1
12c70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12c80 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 65 72    }else if( pTer
12c90 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  m->eOperator & W
12ca0 4f 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  O_ISNULL ){.    
12cb0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57      wsFlags |= W
12cc0 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
12cd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ce0 75 73 65 64 20 7c 3d 20 70 54 65 72 6d 2d 3e 70  used |= pTerm->p
12cf0 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20 20  rereqRight;.    
12d00 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 74 65 72 6d  }..    /* Determ
12d10 69 6e 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ine the value of
12d20 20 6e 42 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20   nBound. */.    
12d30 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
12d40 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
12d50 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
12d60 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
12d70 20 20 20 20 20 20 69 66 28 20 66 69 6e 64 54 65        if( findTe
12d80 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
12d90 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
12da0 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
12db0 47 45 2c 20 70 49 64 78 29 20 29 7b 0a 20 20 20  GE, pIdx) ){.   
12dc0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
12dd0 70 54 6f 70 20 3d 20 66 69 6e 64 54 65 72 6d 28  pTop = findTerm(
12de0 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f  pWC, iCur, j, no
12df0 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
12e00 5f 4c 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  _LE, pIdx);.    
12e10 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
12e20 42 74 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  Btm = findTerm(p
12e30 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
12e40 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f  Ready, WO_GT|WO_
12e50 47 45 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  GE, pIdx);.     
12e60 20 20 20 69 66 28 20 70 54 6f 70 20 29 7b 0a 20     if( pTop ){. 
12e70 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
12e80 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
12e90 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  MIT;.          n
12ea0 42 6f 75 6e 64 20 2a 3d 20 33 3b 0a 20 20 20 20  Bound *= 3;.    
12eb0 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54        used |= pT
12ec0 6f 70 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  op->prereqRight;
12ed0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ee0 20 20 20 69 66 28 20 70 42 74 6d 20 29 7b 0a 20     if( pBtm ){. 
12ef0 20 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73           wsFlags
12f00 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49   |= WHERE_BTM_LI
12f10 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  MIT;.          n
12f20 42 6f 75 6e 64 20 2a 3d 20 33 3b 0a 20 20 20 20  Bound *= 3;.    
12f30 20 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 42        used |= pB
12f40 74 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  tm->prereqRight;
12f50 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12f60 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28 57     wsFlags |= (W
12f70 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
12f80 45 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  E|WHERE_ROWID_RA
12f90 4e 47 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NGE);.      }.  
12fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 72 6f    }else if( pPro
12fb0 62 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f  be->onError!=OE_
12fc0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 20 20 74 65  None ){.      te
12fd0 73 74 63 61 73 65 28 20 77 73 46 6c 61 67 73 20  stcase( wsFlags 
12fe0 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49  & WHERE_COLUMN_I
12ff0 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  N );.      testc
13000 61 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57  ase( wsFlags & W
13010 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c  HERE_COLUMN_NULL
13020 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 77   );.      if( (w
13030 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  sFlags & (WHERE_
13040 43 4f 4c 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f  COLUMN_IN|WHERE_
13050 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30  COLUMN_NULL))==0
13060 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
13070 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
13080 51 55 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  QUE;.      }.   
13090 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
130a0 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52 20  ere is an ORDER 
130b0 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  BY clause and th
130c0 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 63 6f  e index being co
130d0 6e 73 69 64 65 72 65 64 20 77 69 6c 6c 0a 20 20  nsidered will.  
130e0 20 20 2a 2a 20 6e 61 74 75 72 61 6c 6c 79 20 73    ** naturally s
130f0 63 61 6e 20 72 6f 77 73 20 69 6e 20 74 68 65 20  can rows in the 
13100 72 65 71 75 69 72 65 64 20 6f 72 64 65 72 2c 20  required order, 
13110 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72 69  set the appropri
13120 61 74 65 20 66 6c 61 67 73 0a 20 20 20 20 2a 2a  ate flags.    **
13130 20 69 6e 20 77 73 46 6c 61 67 73 2e 20 4f 74 68   in wsFlags. Oth
13140 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 72 65  erwise, if there
13150 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
13160 63 6c 61 75 73 65 20 62 75 74 20 74 68 65 20 69  clause but the i
13170 6e 64 65 78 0a 20 20 20 20 2a 2a 20 77 69 6c 6c  ndex.    ** will
13180 20 73 63 61 6e 20 72 6f 77 73 20 69 6e 20 61 20   scan rows in a 
13190 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72 2c  different order,
131a0 20 73 65 74 20 74 68 65 20 62 53 6f 72 74 20 76   set the bSort v
131b0 61 72 69 61 62 6c 65 2e 20 20 2a 2f 0a 20 20 20  ariable.  */.   
131c0 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
131d0 0a 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c  .      if( (wsFl
131e0 61 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c  ags & (WHERE_COL
131f0 55 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c  UMN_IN|WHERE_COL
13200 55 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20  UMN_NULL))==0.  
13210 20 20 20 20 20 20 26 26 20 69 73 53 6f 72 74 69        && isSorti
13220 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70  ngIndex(pParse,p
13230 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50 72  WC->pMaskSet,pPr
13240 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42  obe,iCur,pOrderB
13250 79 2c 6e 45 71 2c 26 72 65 76 29 0a 20 20 20 20  y,nEq,&rev).    
13260 20 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46    ){.        wsF
13270 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 4f  lags |= WHERE_RO
13280 57 49 44 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f  WID_RANGE|WHERE_
13290 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48 45  COLUMN_RANGE|WHE
132a0 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20  RE_ORDERBY;.    
132b0 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 28      wsFlags |= (
132c0 72 65 76 20 3f 20 57 48 45 52 45 5f 52 45 56 45  rev ? WHERE_REVE
132d0 52 53 45 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  RSE : 0);.      
132e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
132f0 53 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sort = 1;.      
13300 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
13310 49 66 20 63 75 72 72 65 6e 74 6c 79 20 63 61 6c  If currently cal
13320 63 75 6c 61 74 69 6e 67 20 74 68 65 20 63 6f 73  culating the cos
13330 74 20 6f 66 20 75 73 69 6e 67 20 61 6e 20 69 6e  t of using an in
13340 64 65 78 20 28 6e 6f 74 20 74 68 65 20 49 50 4b  dex (not the IPK
13350 0a 20 20 20 20 2a 2a 20 69 6e 64 65 78 29 2c 20  .    ** index), 
13360 64 65 74 65 72 6d 69 6e 65 20 69 66 20 61 6c 6c  determine if all
13370 20 72 65 71 75 69 72 65 64 20 63 6f 6c 75 6d 6e   required column
13380 20 64 61 74 61 20 6d 61 79 20 62 65 20 6f 62 74   data may be obt
13390 61 69 6e 65 64 20 77 69 74 68 6f 75 74 20 0a 20  ained without . 
133a0 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 6f     ** seeking to
133b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
133c0 6d 61 69 6e 20 74 61 62 6c 65 20 28 69 2e 65 2e  main table (i.e.
133d0 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   if the index is
133e0 20 61 20 63 6f 76 65 72 69 6e 67 0a 20 20 20 20   a covering.    
133f0 2a 2a 20 69 6e 64 65 78 20 66 6f 72 20 74 68 69  ** index for thi
13400 73 20 71 75 65 72 79 29 2e 20 49 66 20 69 74 20  s query). If it 
13410 69 73 2c 20 73 65 74 20 74 68 65 20 57 48 45 52  is, set the WHER
13420 45 5f 49 44 58 5f 4f 4e 4c 59 20 66 6c 61 67 20  E_IDX_ONLY flag 
13430 69 6e 0a 20 20 20 20 2a 2a 20 77 73 46 6c 61 67  in.    ** wsFlag
13440 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  s. Otherwise, se
13450 74 20 74 68 65 20 62 4c 6f 6f 6b 75 70 20 76 61  t the bLookup va
13460 72 69 61 62 6c 65 20 74 6f 20 74 72 75 65 2e 20  riable to true. 
13470 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 64 78   */.    if( pIdx
13480 20 26 26 20 77 73 46 6c 61 67 73 20 29 7b 0a 20   && wsFlags ){. 
13490 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d       Bitmask m =
134a0 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a   pSrc->colUsed;.
134b0 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
134c0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49     for(j=0; j<pI
134d0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b  dx->nColumn; j++
134e0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78  ){.        int x
134f0 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
13500 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  n[j];.        if
13510 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20  ( x<BMS-1 ){.   
13520 20 20 20 20 20 20 20 6d 20 26 3d 20 7e 28 28 28         m &= ~(((
13530 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a  Bitmask)1)<<x);.
13540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13550 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 3d 3d 30  }.      if( m==0
13560 20 29 7b 0a 20 20 20 20 20 20 20 20 77 73 46 6c   ){.        wsFl
13570 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 49 44 58  ags |= WHERE_IDX
13580 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  _ONLY;.      }el
13590 73 65 7b 0a 20 20 20 20 20 20 20 20 62 4c 6f 6f  se{.        bLoo
135a0 6b 75 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  kup = 1;.      }
135b0 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20  .    }..#if 0.  
135c0 20 20 69 66 28 20 62 49 6e 45 73 74 20 26 26 20    if( bInEst && 
135d0 28 6e 49 6e 4d 75 6c 2a 61 69 52 6f 77 45 73 74  (nInMul*aiRowEst
135e0 5b 6e 45 71 5d 29 3e 28 61 69 52 6f 77 45 73 74  [nEq])>(aiRowEst
135f0 5b 30 5d 2f 32 29 20 29 7b 0a 20 20 20 20 20 20  [0]/2) ){.      
13600 6e 49 6e 4d 75 6c 20 3d 20 61 69 52 6f 77 45 73  nInMul = aiRowEs
13610 74 5b 30 5d 20 2f 20 28 32 20 2a 20 61 69 52 6f  t[0] / (2 * aiRo
13620 77 45 73 74 5b 6e 45 71 5d 29 3b 0a 20 20 20 20  wEst[nEq]);.    
13630 7d 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64 6f  }.    nRow = (do
13640 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b 6e  uble)(aiRowEst[n
13650 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 20 2f 20  Eq] * nInMul) / 
13660 6e 42 6f 75 6e 64 3b 0a 20 20 20 20 63 6f 73 74  nBound;.    cost
13670 20 3d 20 28 6e 45 71 3e 30 29 20 2a 20 6e 49 6e   = (nEq>0) * nIn
13680 4d 75 6c 20 2a 20 65 73 74 4c 6f 67 28 61 69 52  Mul * estLog(aiR
13690 6f 77 45 73 74 5b 30 5d 29 0a 20 20 20 20 20 20  owEst[0]).      
136a0 20 20 20 2b 20 6e 52 6f 77 0a 20 20 20 20 20 20     + nRow.      
136b0 20 20 20 2b 20 62 53 6f 72 74 20 2a 20 6e 52 6f     + bSort * nRo
136c0 77 20 2a 20 65 73 74 4c 6f 67 28 6e 52 6f 77 29  w * estLog(nRow)
136d0 0a 20 20 20 20 20 20 20 20 20 2b 20 62 4c 6f 6f  .         + bLoo
136e0 6b 75 70 20 2a 20 6e 52 6f 77 20 2a 20 65 73 74  kup * nRow * est
136f0 4c 6f 67 28 61 69 52 6f 77 45 73 74 5b 30 5d 29  Log(aiRowEst[0])
13700 3b 0a 23 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20  ;.#else..    /* 
13710 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
13720 6f 63 6b 20 63 61 6c 63 75 6c 61 74 65 73 20 6e  ock calculates n
13730 52 6f 77 20 61 6e 64 20 63 6f 73 74 20 66 6f 72  Row and cost for
13740 20 74 68 65 20 69 6e 64 65 78 20 73 63 61 6e 0a   the index scan.
13750 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 73 61      ** in the sa
13760 6d 65 20 77 61 79 20 61 73 20 53 51 4c 69 74 65  me way as SQLite
13770 20 76 65 72 73 69 6f 6e 73 20 33 2e 36 2e 31 37   versions 3.6.17
13780 20 61 6e 64 20 65 61 72 6c 69 65 72 2e 20 53 6f   and earlier. So
13790 6d 65 20 65 6c 65 6d 65 6e 74 73 0a 20 20 20 20  me elements.    
137a0 2a 2a 20 6f 66 20 74 68 69 73 20 63 61 6c 63 75  ** of this calcu
137b0 6c 61 74 69 6f 6e 20 61 72 65 20 64 69 66 66 69  lation are diffi
137c0 63 75 6c 74 20 74 6f 20 6a 75 73 74 69 66 79 2e  cult to justify.
137d0 20 42 75 74 20 75 73 69 6e 67 20 74 68 69 73 20   But using this 
137e0 73 74 72 61 74 65 67 79 0a 20 20 20 20 2a 2a 20  strategy.    ** 
137f0 77 6f 72 6b 73 20 77 65 6c 6c 20 69 6e 20 70 72  works well in pr
13800 61 63 74 69 63 65 20 61 6e 64 20 63 61 75 73 65  actice and cause
13810 73 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  s the test suite
13820 20 74 6f 20 70 61 73 73 2e 20 20 2a 2f 0a 20 20   to pass.  */.  
13830 20 20 6e 52 6f 77 20 3d 20 28 64 6f 75 62 6c 65    nRow = (double
13840 29 28 61 69 52 6f 77 45 73 74 5b 6e 45 71 5d 20  )(aiRowEst[nEq] 
13850 2a 20 6e 49 6e 4d 75 6c 29 3b 0a 20 20 20 20 69  * nInMul);.    i
13860 66 28 20 62 49 6e 45 73 74 20 26 26 20 6e 52 6f  f( bInEst && nRo
13870 77 2a 32 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20  w*2>aiRowEst[0] 
13880 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 3d 20  ){.      nRow = 
13890 61 69 52 6f 77 45 73 74 5b 30 5d 2f 32 3b 0a 20  aiRowEst[0]/2;. 
138a0 20 20 20 20 20 6e 49 6e 4d 75 6c 20 3d 20 6e 52       nInMul = nR
138b0 6f 77 20 2f 20 61 69 52 6f 77 45 73 74 5b 6e 45  ow / aiRowEst[nE
138c0 71 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f  q];.    }.    co
138d0 73 74 20 3d 20 6e 52 6f 77 20 2b 20 6e 49 6e 4d  st = nRow + nInM
138e0 75 6c 2a 65 73 74 4c 6f 67 28 61 69 52 6f 77 45  ul*estLog(aiRowE
138f0 73 74 5b 30 5d 29 3b 0a 20 20 20 20 6e 52 6f 77  st[0]);.    nRow
13900 20 2f 3d 20 6e 42 6f 75 6e 64 3b 0a 20 20 20 20   /= nBound;.    
13910 63 6f 73 74 20 2f 3d 20 6e 42 6f 75 6e 64 3b 0a  cost /= nBound;.
13920 20 20 20 20 69 66 28 20 62 53 6f 72 74 20 29 7b      if( bSort ){
13930 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63  .      cost += c
13940 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29  ost*estLog(cost)
13950 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13960 70 49 64 78 20 26 26 20 62 4c 6f 6f 6b 75 70 3d  pIdx && bLookup=
13970 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 73 74  =0 ){.      cost
13980 20 2f 3d 20 32 3b 0a 20 20 20 20 7d 0a 23 65 6e   /= 2;.    }.#en
13990 64 69 66 0a 0a 20 20 20 20 57 48 45 52 45 54 52  dif..    WHERETR
139a0 41 43 45 28 28 0a 20 20 20 20 20 20 22 74 62 6c  ACE((.      "tbl
139b0 3d 25 73 20 69 64 78 3d 25 73 20 6e 45 71 3d 25  =%s idx=%s nEq=%
139c0 64 20 6e 49 6e 4d 75 6c 3d 25 64 20 6e 42 6f 75  d nInMul=%d nBou
139d0 6e 64 3d 25 64 20 62 53 6f 72 74 3d 25 64 20 62  nd=%d bSort=%d b
139e0 4c 6f 6f 6b 75 70 3d 25 64 22 0a 20 20 20 20 20  Lookup=%d".     
139f0 20 22 20 77 73 46 6c 61 67 73 3d 25 64 20 20 20   " wsFlags=%d   
13a00 28 6e 52 6f 77 3d 25 2e 32 66 20 63 6f 73 74 3d  (nRow=%.2f cost=
13a10 25 2e 32 66 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %.2f)\n",.      
13a20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  pSrc->pTab->zNam
13a30 65 2c 20 28 70 49 64 78 20 3f 20 70 49 64 78 2d  e, (pIdx ? pIdx-
13a40 3e 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 2c  >zName : "ipk"),
13a50 20 0a 20 20 20 20 20 20 6e 45 71 2c 20 6e 49 6e   .      nEq, nIn
13a60 4d 75 6c 2c 20 6e 42 6f 75 6e 64 2c 20 62 53 6f  Mul, nBound, bSo
13a70 72 74 2c 20 62 4c 6f 6f 6b 75 70 2c 20 77 73 46  rt, bLookup, wsF
13a80 6c 61 67 73 2c 20 6e 52 6f 77 2c 20 63 6f 73 74  lags, nRow, cost
13a90 0a 20 20 20 20 29 29 3b 0a 0a 20 20 20 20 69 66  .    ));..    if
13aa0 28 20 28 21 70 49 64 78 20 7c 7c 20 77 73 46 6c  ( (!pIdx || wsFl
13ab0 61 67 73 29 20 26 26 20 63 6f 73 74 3c 70 43 6f  ags) && cost<pCo
13ac0 73 74 2d 3e 72 43 6f 73 74 20 29 7b 0a 20 20 20  st->rCost ){.   
13ad0 20 20 20 70 43 6f 73 74 2d 3e 72 43 6f 73 74 20     pCost->rCost 
13ae0 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 70 43  = cost;.      pC
13af0 6f 73 74 2d 3e 6e 52 6f 77 20 3d 20 6e 52 6f 77  ost->nRow = nRow
13b00 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 75  ;.      pCost->u
13b10 73 65 64 20 3d 20 75 73 65 64 3b 0a 20 20 20 20  sed = used;.    
13b20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73    pCost->plan.ws
13b30 46 6c 61 67 73 20 3d 20 28 77 73 46 6c 61 67 73  Flags = (wsFlags
13b40 26 77 73 46 6c 61 67 4d 61 73 6b 29 3b 0a 20 20  &wsFlagMask);.  
13b50 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e      pCost->plan.
13b60 6e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  nEq = nEq;.     
13b70 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70   pCost->plan.u.p
13b80 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
13b90 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 2d  }..    if( pSrc-
13ba0 3e 70 49 6e 64 65 78 20 29 20 62 72 65 61 6b 3b  >pIndex ) break;
13bb0 0a 20 20 20 20 77 73 46 6c 61 67 4d 61 73 6b 20  .    wsFlagMask 
13bc0 3d 20 7e 28 57 48 45 52 45 5f 52 4f 57 49 44 5f  = ~(WHERE_ROWID_
13bd0 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  EQ|WHERE_ROWID_R
13be0 41 4e 47 45 29 3b 0a 20 20 20 20 65 71 54 65 72  ANGE);.    eqTer
13bf0 6d 4d 61 73 6b 20 3d 20 69 64 78 45 71 54 65 72  mMask = idxEqTer
13c00 6d 4d 61 73 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  mMask;.  }..  /*
13c10 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
13c20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
13c30 61 6e 64 20 74 68 65 20 53 51 4c 49 54 45 5f 52  and the SQLITE_R
13c40 65 76 65 72 73 65 4f 72 64 65 72 20 66 6c 61 67  everseOrder flag
13c50 0a 20 20 2a 2a 20 69 73 20 73 65 74 2c 20 74 68  .  ** is set, th
13c60 65 6e 20 72 65 76 65 72 73 65 20 74 68 65 20 6f  en reverse the o
13c70 72 64 65 72 20 74 68 61 74 20 74 68 65 20 69 6e  rder that the in
13c80 64 65 78 20 77 69 6c 6c 20 62 65 20 73 63 61 6e  dex will be scan
13c90 6e 65 64 0a 20 20 2a 2a 20 69 6e 2e 20 54 68 69  ned.  ** in. Thi
13ca0 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 61 70  s is used for ap
13cb0 70 6c 69 63 61 74 69 6f 6e 20 74 65 73 74 69 6e  plication testin
13cc0 67 2c 20 74 6f 20 68 65 6c 70 20 66 69 6e 64 20  g, to help find 
13cd0 63 61 73 65 73 0a 20 20 2a 2a 20 77 68 65 72 65  cases.  ** where
13ce0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 62 65 68   application beh
13cf0 61 76 69 6f 75 72 20 64 65 70 65 6e 64 73 20 6f  aviour depends o
13d00 6e 20 74 68 65 20 28 75 6e 64 65 66 69 6e 65 64  n the (undefined
13d10 29 20 6f 72 64 65 72 20 74 68 61 74 0a 20 20 2a  ) order that.  *
13d20 2a 20 53 51 4c 69 74 65 20 6f 75 74 70 75 74 73  * SQLite outputs
13d30 20 72 6f 77 73 20 69 6e 20 69 6e 20 74 68 65 20   rows in in the 
13d40 61 62 73 65 6e 63 65 20 6f 66 20 61 6e 20 4f 52  absence of an OR
13d50 44 45 52 20 42 59 20 63 6c 61 75 73 65 2e 20 20  DER BY clause.  
13d60 2a 2f 0a 20 20 69 66 28 20 21 70 4f 72 64 65 72  */.  if( !pOrder
13d70 42 79 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62  By && pParse->db
13d80 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ->flags & SQLITE
13d90 5f 52 65 76 65 72 73 65 4f 72 64 65 72 20 29 7b  _ReverseOrder ){
13da0 0a 20 20 20 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  .    pCost->plan
13db0 2e 77 73 46 6c 61 67 73 20 7c 3d 20 57 48 45 52  .wsFlags |= WHER
13dc0 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 7d 0a 0a  E_REVERSE;.  }..
13dd0 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
13de0 42 79 20 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c  By || (pCost->pl
13df0 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
13e00 5f 4f 52 44 45 52 42 59 29 3d 3d 30 20 29 3b 0a  _ORDERBY)==0 );.
13e10 20 20 61 73 73 65 72 74 28 20 70 43 6f 73 74 2d    assert( pCost-
13e20 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3d 3d 30 20  >plan.u.pIdx==0 
13e30 7c 7c 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e  || (pCost->plan.
13e40 77 73 46 6c 61 67 73 26 57 48 45 52 45 5f 52 4f  wsFlags&WHERE_RO
13e50 57 49 44 5f 45 51 29 3d 3d 30 20 29 3b 0a 20 20  WID_EQ)==0 );.  
13e60 61 73 73 65 72 74 28 20 70 53 72 63 2d 3e 70 49  assert( pSrc->pI
13e70 6e 64 65 78 3d 3d 30 20 0a 20 20 20 20 20 20 20  ndex==0 .       
13e80 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75  || pCost->plan.u
13e90 2e 70 49 64 78 3d 3d 30 20 0a 20 20 20 20 20 20  .pIdx==0 .      
13ea0 20 7c 7c 20 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e   || pCost->plan.
13eb0 75 2e 70 49 64 78 3d 3d 70 53 72 63 2d 3e 70 49  u.pIdx==pSrc->pI
13ec0 6e 64 65 78 20 0a 20 20 29 3b 0a 0a 20 20 57 48  ndex .  );..  WH
13ed0 45 52 45 54 52 41 43 45 28 28 22 62 65 73 74 20  ERETRACE(("best 
13ee0 69 6e 64 65 78 20 69 73 3a 20 25 73 5c 6e 22 2c  index is: %s\n",
13ef0 20 0a 20 20 20 20 28 70 43 6f 73 74 2d 3e 70 6c   .    (pCost->pl
13f00 61 6e 2e 75 2e 70 49 64 78 20 3f 20 70 43 6f 73  an.u.pIdx ? pCos
13f10 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  t->plan.u.pIdx->
13f20 7a 4e 61 6d 65 20 3a 20 22 69 70 6b 22 29 0a 20  zName : "ipk"). 
13f30 20 29 29 3b 0a 20 20 0a 20 20 62 65 73 74 4f 72   ));.  .  bestOr
13f40 43 6c 61 75 73 65 49 6e 64 65 78 28 70 50 61 72  ClauseIndex(pPar
13f50 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
13f60 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42  otReady, pOrderB
13f70 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 70 43 6f  y, pCost);.  pCo
13f80 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  st->plan.wsFlags
13f90 20 7c 3d 20 65 71 54 65 72 6d 4d 61 73 6b 3b 0a   |= eqTermMask;.
13fa0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
13fb0 65 20 71 75 65 72 79 20 70 6c 61 6e 20 66 6f 72  e query plan for
13fc0 20 61 63 63 65 73 73 69 6e 67 20 74 61 62 6c 65   accessing table
13fd0 20 70 53 72 63 2d 3e 70 54 61 62 2e 20 57 72 69   pSrc->pTab. Wri
13fe0 74 65 20 74 68 65 0a 2a 2a 20 62 65 73 74 20 71  te the.** best q
13ff0 75 65 72 79 20 70 6c 61 6e 20 61 6e 64 20 69 74  uery plan and it
14000 73 20 63 6f 73 74 20 69 6e 74 6f 20 74 68 65 20  s cost into the 
14010 57 68 65 72 65 43 6f 73 74 20 6f 62 6a 65 63 74  WhereCost object
14020 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 61 73   supplied .** as
14030 20 74 68 65 20 6c 61 73 74 20 70 61 72 61 6d 65   the last parame
14040 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ter. This functi
14050 6f 6e 20 6d 61 79 20 63 61 6c 63 75 6c 61 74 65  on may calculate
14060 20 74 68 65 20 63 6f 73 74 20 6f 66 0a 2a 2a 20   the cost of.** 
14070 62 6f 74 68 20 72 65 61 6c 20 61 6e 64 20 76 69  both real and vi
14080 72 74 75 61 6c 20 74 61 62 6c 65 20 73 63 61 6e  rtual table scan
14090 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
140a0 64 20 62 65 73 74 49 6e 64 65 78 28 0a 20 20 50  d bestIndex(.  P
140b0 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
140c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
140d0 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
140e0 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
140f0 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
14100 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
14110 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75  clause */.  stru
14120 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
14130 2a 70 53 72 63 2c 20 20 2f 2a 20 54 68 65 20 46  *pSrc,  /* The F
14140 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
14150 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 42  to search */.  B
14160 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
14170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
14180 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
14190 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
141a0 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
141b0 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
141c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44        /* The ORD
141d0 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
141e0 20 20 57 68 65 72 65 43 6f 73 74 20 2a 70 43 6f    WhereCost *pCo
141f0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st            /*
14200 20 4c 6f 77 65 73 74 20 63 6f 73 74 20 71 75 65   Lowest cost que
14210 72 79 20 70 6c 61 6e 20 2a 2f 0a 29 7b 0a 23 69  ry plan */.){.#i
14220 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14230 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
14240 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
14250 53 72 63 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  Src->pTab) ){.  
14260 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
14270 69 6e 66 6f 20 2a 70 20 3d 20 30 3b 0a 20 20 20  info *p = 0;.   
14280 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65   bestVirtualInde
14290 78 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70  x(pParse, pWC, p
142a0 53 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70  Src, notReady, p
142b0 4f 72 64 65 72 42 79 2c 20 70 43 6f 73 74 2c 20  OrderBy, pCost, 
142c0 26 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  &p);.    if( p->
142d0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
142e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
142f0 33 5f 66 72 65 65 28 70 2d 3e 69 64 78 53 74 72  3_free(p->idxStr
14300 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
14310 69 74 65 33 44 62 46 72 65 65 28 70 50 61 72 73  ite3DbFree(pPars
14320 65 2d 3e 64 62 2c 20 70 29 3b 0a 20 20 7d 65 6c  e->db, p);.  }el
14330 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20  se.#endif.  {.  
14340 20 20 62 65 73 74 42 74 72 65 65 49 6e 64 65 78    bestBtreeIndex
14350 28 70 50 61 72 73 65 2c 20 70 57 43 2c 20 70 53  (pParse, pWC, pS
14360 72 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4f  rc, notReady, pO
14370 72 64 65 72 42 79 2c 20 70 43 6f 73 74 29 3b 0a  rderBy, pCost);.
14380 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73    }.}../*.** Dis
14390 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74  able a term in t
143a0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
143b0 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74    Except, do not
143c0 20 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72   disable the ter
143d0 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72  m.** if it contr
143e0 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52  ols a LEFT OUTER
143f0 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64   JOIN and it did
14400 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69   not originate i
14410 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55  n the ON.** or U
14420 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74  SING clause of t
14430 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20  hat join..**.** 
14440 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72  Consider the ter
14450 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74  m t2.z='ok' in t
14460 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65  he following que
14470 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31  ries:.**.**   (1
14480 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
14490 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
144a0 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48   ON t1.a=t2.x WH
144b0 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  ERE t2.z='ok'.**
144c0 20 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a     (2)  SELECT *
144d0 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f   FROM t1 LEFT JO
144e0 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32  IN t2 ON t1.a=t2
144f0 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
14500 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43  .**   (3)  SELEC
14510 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20  T * FROM t1, t2 
14520 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20  WHERE t1.a=t2.x 
14530 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
14540 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b  .** The t2.z='ok
14550 27 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  ' is disabled in
14560 20 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61   the in (2) beca
14570 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65  use it originate
14580 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63  s.** in the ON c
14590 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d  lause.  The term
145a0 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
145b0 28 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69  (3) because it i
145c0 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66  s not part.** of
145d0 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
145e0 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65  IN.  In (1), the
145f0 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73   term is not dis
14600 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73  abled..**.** Dis
14610 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61  abling a term ca
14620 75 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74  uses that term t
14630 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20  o not be tested 
14640 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f  in the inner loo
14650 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e  p.** of the join
14660 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20  .  Disabling is 
14670 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  an optimization.
14680 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61 72 65    When terms are
14690 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20 62 79   satisfied.** by
146a0 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64 69 73   indices, we dis
146b0 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70 72 65  able them to pre
146c0 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74 20 74  vent redundant t
146d0 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e 6e 65  ests in the inne
146e0 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77  r.** loop.  We w
146f0 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63 6f 72  ould get the cor
14700 72 65 63 74 20 72 65 73 75 6c 74 73 20 69 66 20  rect results if 
14710 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65 76 65  nothing were eve
14720 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62  r disabled,.** b
14730 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72  ut joins might r
14740 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77  un a little slow
14750 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b 20 69  er.  The trick i
14760 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61 73 20  s to disable as 
14770 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20 63 61  much.** as we ca
14780 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61 62 6c  n without disabl
14790 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49  ing too much.  I
147a0 66 20 77 65 20 64 69 73 61 62 6c 65 64 20 69 6e  f we disabled in
147b0 20 28 31 29 2c 20 77 65 27 64 20 67 65 74 0a 2a   (1), we'd get.*
147c0 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e 73 77  * the wrong answ
147d0 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20  er.  See ticket 
147e0 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  #813..*/.static 
147f0 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65 72 6d  void disableTerm
14800 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65  (WhereLevel *pLe
14810 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d 20 2a  vel, WhereTerm *
14820 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20 70 54  pTerm){.  if( pT
14830 65 72 6d 0a 20 20 20 20 20 20 26 26 20 41 4c 57  erm.      && ALW
14840 41 59 53 28 28 70 54 65 72 6d 2d 3e 77 74 46 6c  AYS((pTerm->wtFl
14850 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44  ags & TERM_CODED
14860 29 3d 3d 30 29 0a 20 20 20 20 20 20 26 26 20 28  )==0).      && (
14870 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
14880 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
14890 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
148a0 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
148b0 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  n)).  ){.    pTe
148c0 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20 54  rm->wtFlags |= T
148d0 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69  ERM_CODED;.    i
148e0 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e  f( pTerm->iParen
148f0 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68  t>=0 ){.      Wh
14900 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20  ereTerm *pOther 
14910 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61  = &pTerm->pWC->a
14920 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  [pTerm->iParent]
14930 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70  ;.      if( (--p
14940 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d  Other->nChild)==
14950 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  0 ){.        dis
14960 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
14970 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20   pOther);.      
14980 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14990 2a 0a 2a 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f  *.** Code an OP_
149a0 41 66 66 69 6e 69 74 79 20 6f 70 63 6f 64 65 20  Affinity opcode 
149b0 74 6f 20 61 70 70 6c 79 20 74 68 65 20 63 6f 6c  to apply the col
149c0 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
149d0 69 6e 67 20 7a 41 66 66 0a 2a 2a 20 74 6f 20 74  ing zAff.** to t
149e0 68 65 20 6e 20 72 65 67 69 73 74 65 72 73 20 73  he n registers s
149f0 74 61 72 74 69 6e 67 20 61 74 20 62 61 73 65 2e  tarting at base.
14a00 20 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20 7a   .**.** Buffer z
14a10 41 66 66 20 77 61 73 20 61 6c 6c 6f 63 61 74 65  Aff was allocate
14a20 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  d using sqlite3D
14a30 62 4d 61 6c 6c 6f 63 28 29 2e 20 49 74 20 69 73  bMalloc(). It is
14a40 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
14a50 69 62 69 6c 69 74 79 20 6f 66 20 74 68 69 73 20  ibility of this 
14a60 66 75 6e 63 74 69 6f 6e 20 74 6f 20 61 72 72 61  function to arra
14a70 6e 67 65 20 66 6f 72 20 69 74 20 74 6f 20 62 65  nge for it to be
14a80 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20 66   eventually.** f
14a90 72 65 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  reed using sqlit
14aa0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  e3DbFree()..*/.s
14ab0 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
14ac0 70 70 6c 79 41 66 66 69 6e 69 74 79 28 50 61 72  pplyAffinity(Par
14ad0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14ae0 62 61 73 65 2c 20 69 6e 74 20 6e 2c 20 63 68 61  base, int n, cha
14af0 72 20 2a 7a 41 66 66 29 7b 0a 20 20 56 64 62 65  r *zAff){.  Vdbe
14b00 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
14b10 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76  dbe;.  assert( v
14b20 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
14b30 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
14b40 5f 41 66 66 69 6e 69 74 79 2c 20 62 61 73 65 2c  _Affinity, base,
14b50 20 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   n);.  sqlite3Vd
14b60 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
14b70 2c 20 7a 41 66 66 2c 20 50 34 5f 44 59 4e 41 4d  , zAff, P4_DYNAM
14b80 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  IC);.  sqlite3Ex
14b90 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
14ba0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 62 61  hange(pParse, ba
14bb0 73 65 2c 20 6e 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  se, n);.}.../*.*
14bc0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
14bd0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
14be0 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
14bf0 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
14c00 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
14c10 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
14c20 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
14c30 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
14c40 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
14c50 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
14c60 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
14c70 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
14c80 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
14c90 20 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65   in register iRe
14ca0 67 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63  g..**.** For a c
14cb0 6f 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65  onstraint of the
14cc0 20 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68   form X=expr, th
14cd0 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
14ce0 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74  evaluated and it
14cf0 73 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c  s.** result is l
14d00 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  eft on the stack
14d10 2e 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e  .  For constrain
14d20 74 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58  ts of the form X
14d30 20 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69   IN (...).** thi
14d40 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75  s routine sets u
14d50 70 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69  p a loop that wi
14d60 6c 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20  ll iterate over 
14d70 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e  all values of X.
14d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
14d90 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
14da0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
14db0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
14dc0 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
14dd0 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
14de0 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
14df0 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
14e00 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
14e10 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76  ed */.  WhereLev
14e20 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57  el *pLevel, /* W
14e30 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  hen level of the
14e40 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20   FROM clause we 
14e50 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a  are working on *
14e60 2f 0a 20 20 69 6e 74 20 69 54 61 72 67 65 74 20  /.  int iTarget 
14e70 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 65 6d          /* Attem
14e80 70 74 20 74 6f 20 6c 65 61 76 65 20 72 65 73 75  pt to leave resu
14e90 6c 74 73 20 69 6e 20 74 68 69 73 20 72 65 67 69  lts in this regi
14ea0 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  ster */.){.  Exp
14eb0 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
14ec0 45 78 70 72 3b 0a 20 20 56 64 62 65 20 2a 76 20  Expr;.  Vdbe *v 
14ed0 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
14ee0 0a 20 20 69 6e 74 20 69 52 65 67 3b 20 20 20 20  .  int iReg;    
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f00 20 52 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e   Register holdin
14f10 67 20 72 65 73 75 6c 74 73 20 2a 2f 0a 0a 20 20  g results */..  
14f20 61 73 73 65 72 74 28 20 69 54 61 72 67 65 74 3e  assert( iTarget>
14f30 30 20 29 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  0 );.  if( pX->o
14f40 70 3d 3d 54 4b 5f 45 51 20 29 7b 0a 20 20 20 20  p==TK_EQ ){.    
14f50 69 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  iReg = sqlite3Ex
14f60 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
14f70 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c  rse, pX->pRight,
14f80 20 69 54 61 72 67 65 74 29 3b 0a 20 20 7d 65 6c   iTarget);.  }el
14f90 73 65 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54  se if( pX->op==T
14fa0 4b 5f 49 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  K_ISNULL ){.    
14fb0 69 52 65 67 20 3d 20 69 54 61 72 67 65 74 3b 0a  iReg = iTarget;.
14fc0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14fd0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
14fe0 2c 20 30 2c 20 69 52 65 67 29 3b 0a 23 69 66 6e  , 0, iReg);.#ifn
14ff0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15000 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65  SUBQUERY.  }else
15010 7b 0a 20 20 20 20 69 6e 74 20 65 54 79 70 65 3b  {.    int eType;
15020 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
15030 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f 70     struct InLoop
15040 20 2a 70 49 6e 3b 0a 0a 20 20 20 20 61 73 73 65   *pIn;..    asse
15050 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49  rt( pX->op==TK_I
15060 4e 20 29 3b 0a 20 20 20 20 69 52 65 67 20 3d 20  N );.    iReg = 
15070 69 54 61 72 67 65 74 3b 0a 20 20 20 20 65 54 79  iTarget;.    eTy
15080 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  pe = sqlite3Find
15090 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  InIndex(pParse, 
150a0 70 58 2c 20 30 29 3b 0a 20 20 20 20 69 54 61 62  pX, 0);.    iTab
150b0 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
150c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
150d0 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
150e0 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  d, iTab, 0);.   
150f0 20 61 73 73 65 72 74 28 20 70 4c 65 76 65 6c 2d   assert( pLevel-
15100 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
15110 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 29 3b  WHERE_IN_ABLE );
15120 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
15130 3e 75 2e 69 6e 2e 6e 49 6e 3d 3d 30 20 29 7b 0a  >u.in.nIn==0 ){.
15140 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64        pLevel->ad
15150 64 72 4e 78 74 20 3d 20 73 71 6c 69 74 65 33 56  drNxt = sqlite3V
15160 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
15170 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65  .    }.    pLeve
15180 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20  l->u.in.nIn++;. 
15190 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e     pLevel->u.in.
151a0 61 49 6e 4c 6f 6f 70 20 3d 0a 20 20 20 20 20 20  aInLoop =.      
151b0 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
151c0 63 4f 72 46 72 65 65 28 70 50 61 72 73 65 2d 3e  cOrFree(pParse->
151d0 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  db, pLevel->u.in
151e0 2e 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20  .aInLoop,.      
151f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15200 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
15210 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
15220 6f 6f 70 5b 30 5d 29 2a 70 4c 65 76 65 6c 2d 3e  oop[0])*pLevel->
15230 75 2e 69 6e 2e 6e 49 6e 29 3b 0a 20 20 20 20 70  u.in.nIn);.    p
15240 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69  In = pLevel->u.i
15250 6e 2e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69  n.aInLoop;.    i
15260 66 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 20 20  f( pIn ){.      
15270 70 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 75  pIn += pLevel->u
15280 2e 69 6e 2e 6e 49 6e 20 2d 20 31 3b 0a 20 20 20  .in.nIn - 1;.   
15290 20 20 20 70 49 6e 2d 3e 69 43 75 72 20 3d 20 69     pIn->iCur = i
152a0 54 61 62 3b 0a 20 20 20 20 20 20 69 66 28 20 65  Tab;.      if( e
152b0 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
152c0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  OWID ){.        
152d0 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d  pIn->addrInTop =
152e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
152f0 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20  p2(v, OP_Rowid, 
15300 69 54 61 62 2c 20 69 52 65 67 29 3b 0a 20 20 20  iTab, iReg);.   
15310 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15320 20 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70    pIn->addrInTop
15330 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
15340 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
15350 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69 52 65 67  n, iTab, 0, iReg
15360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15370 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
15380 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p1(v, OP_IsNull,
15390 20 69 52 65 67 29 3b 0a 20 20 20 20 7d 65 6c 73   iReg);.    }els
153a0 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
153b0 3e 75 2e 69 6e 2e 6e 49 6e 20 3d 20 30 3b 0a 20  >u.in.nIn = 0;. 
153c0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
153d0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
153e0 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
153f0 72 65 74 75 72 6e 20 69 52 65 67 3b 0a 7d 0a 0a  return iReg;.}..
15400 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
15410 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
15420 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
15430 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
15440 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
15450 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f  .  The values fo
15460 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  r all constraint
15470 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68  s are left on th
15480 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
15490 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
154a0 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
154b0 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
154c0 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
154d0 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
154e0 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
154f0 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
15500 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
15510 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
15520 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
15530 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
15540 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
15550 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
15560 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
15570 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
15580 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
15590 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
155a0 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
155b0 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
155c0 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
155d0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
155e0 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
155f0 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
15600 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
15610 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
15620 20 62 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65   b will be store
15630 64 0a 2a 2a 20 69 6e 20 63 6f 6e 73 65 63 75 74  d.** in consecut
15640 69 76 65 20 72 65 67 69 73 74 65 72 73 20 61 6e  ive registers an
15650 64 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  d the index of t
15660 68 65 20 66 69 72 73 74 20 72 65 67 69 73 74 65  he first registe
15670 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  r is returned..*
15680 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
15690 70 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32  ple above nEq==2
156a0 2e 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72  .  But this subr
156b0 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72  outine works for
156c0 20 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66   any value.** of
156d0 20 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30   nEq including 0
156e0 2e 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68  .  If nEq==0, th
156f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65  is routine is ne
15700 61 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  arly a no-op..**
15710 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
15720 69 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63  it does is alloc
15730 61 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e  ate the pLevel->
15740 69 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  iMem memory cell
15750 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
15760 74 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f  tine always allo
15770 63 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f  cates at least o
15780 6e 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  ne memory cell a
15790 6e 64 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68  nd returns.** th
157a0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
157b0 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 54 68 65  memory cell. The
157c0 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61   code that.** ca
157d0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
157e0 20 77 69 6c 6c 20 75 73 65 20 74 68 61 74 20 6d   will use that m
157f0 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 73 74  emory cell to st
15800 6f 72 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ore the terminat
15810 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61 6c 75 65  ion.** key value
15820 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49   of the loop.  I
15830 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 49 4e  f one or more IN
15840 20 6f 70 65 72 61 74 6f 72 73 20 61 70 70 65 61   operators appea
15850 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  r, then.** this 
15860 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
15870 73 20 61 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  s an additional 
15880 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  nEq memory cells
15890 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   for internal.**
158a0 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f   use..**.** Befo
158b0 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70  re returning, *p
158c0 7a 41 66 66 20 69 73 20 73 65 74 20 74 6f 20 70  zAff is set to p
158d0 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
158e0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 0a 2a 2a   containing a.**
158f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f 6c   copy of the col
15900 75 6d 6e 20 61 66 66 69 6e 69 74 79 20 73 74 72  umn affinity str
15910 69 6e 67 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ing of the index
15920 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67   allocated using
15930 0a 2a 2a 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  .** sqlite3DbMal
15940 6c 6f 63 28 29 2e 20 45 78 63 65 70 74 2c 20 65  loc(). Except, e
15950 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 63 6f  ntries in the co
15960 70 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  py of the string
15970 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
15980 69 74 68 20 65 71 75 61 6c 69 74 79 20 63 6f 6e  ith equality con
15990 73 74 72 61 69 6e 74 73 20 74 68 61 74 20 75 73  straints that us
159a0 65 20 4e 4f 4e 45 20 61 66 66 69 6e 69 74 79 20  e NONE affinity 
159b0 61 72 65 20 73 65 74 20 74 6f 0a 2a 2a 20 53 51  are set to.** SQ
159c0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20 54  LITE_AFF_NONE. T
159d0 68 69 73 20 69 73 20 74 6f 20 64 65 61 6c 20 77  his is to deal w
159e0 69 74 68 20 53 51 4c 20 73 75 63 68 20 61 73 20  ith SQL such as 
159f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
15a00 2a 0a 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41  *.**   CREATE TA
15a10 42 4c 45 20 74 31 28 61 20 54 45 58 54 20 50 52  BLE t1(a TEXT PR
15a20 49 4d 41 52 59 20 4b 45 59 2c 20 62 29 3b 0a 2a  IMARY KEY, b);.*
15a30 2a 20 20 20 53 45 4c 45 43 54 20 2e 2e 2e 20 46  *   SELECT ... F
15a40 52 4f 4d 20 74 31 20 41 53 20 74 32 2c 20 74 31  ROM t1 AS t2, t1
15a50 20 57 48 45 52 45 20 74 31 2e 61 20 3d 20 74 32   WHERE t1.a = t2
15a60 2e 62 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  .b;.**.** In the
15a70 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
15a80 74 68 65 20 69 6e 64 65 78 20 6f 6e 20 74 31 28  the index on t1(
15a90 61 29 20 68 61 73 20 54 45 58 54 20 61 66 66 69  a) has TEXT affi
15aa0 6e 69 74 79 2e 20 42 75 74 20 73 69 6e 63 65 0a  nity. But since.
15ab0 2a 2a 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  ** the right han
15ac0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 65 71  d side of the eq
15ad0 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
15ae0 74 20 28 74 32 2e 62 29 20 68 61 73 20 4e 4f 4e  t (t2.b) has NON
15af0 45 20 61 66 66 69 6e 69 74 79 2c 0a 2a 2a 20 6e  E affinity,.** n
15b00 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 20 73 68 6f  o conversion sho
15b10 75 6c 64 20 62 65 20 61 74 74 65 6d 70 74 65 64  uld be attempted
15b20 20 62 65 66 6f 72 65 20 75 73 69 6e 67 20 61 20   before using a 
15b30 74 32 2e 62 20 76 61 6c 75 65 20 61 73 20 70 61  t2.b value as pa
15b40 72 74 20 6f 66 0a 2a 2a 20 61 20 6b 65 79 20 74  rt of.** a key t
15b50 6f 20 73 65 61 72 63 68 20 74 68 65 20 69 6e 64  o search the ind
15b60 65 78 2e 20 48 65 6e 63 65 20 74 68 65 20 66 69  ex. Hence the fi
15b70 72 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20  rst byte in the 
15b80 72 65 74 75 72 6e 65 64 20 61 66 66 69 6e 69 74  returned affinit
15b90 79 0a 2a 2a 20 73 74 72 69 6e 67 20 69 6e 20 74  y.** string in t
15ba0 68 69 73 20 65 78 61 6d 70 6c 65 20 77 6f 75 6c  his example woul
15bb0 64 20 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49  d be set to SQLI
15bc0 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a  TE_AFF_NONE..*/.
15bd0 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41  static int codeA
15be0 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
15bf0 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
15c00 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
15c10 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
15c20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
15c30 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
15c40 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
15c50 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
15c60 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
15c70 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
15c80 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
15c90 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
15ca0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
15cb0 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
15cc0 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
15cd0 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
15ce0 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65  /.  int nExtraRe
15cf0 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
15d00 62 65 72 20 6f 66 20 65 78 74 72 61 20 72 65 67  ber of extra reg
15d10 69 73 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61  isters to alloca
15d20 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  te */.  char **p
15d30 7a 41 66 66 20 20 20 20 20 20 20 20 20 20 2f 2a  zAff          /*
15d40 20 4f 55 54 3a 20 53 65 74 20 74 6f 20 70 6f 69   OUT: Set to poi
15d50 6e 74 20 74 6f 20 61 66 66 69 6e 69 74 79 20 73  nt to affinity s
15d60 74 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e  tring */.){.  in
15d70 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
15d80 70 6c 61 6e 2e 6e 45 71 3b 20 20 20 2f 2a 20 54  plan.nEq;   /* T
15d90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
15da0 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
15db0 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 56  s to code */.  V
15dc0 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
15dd0 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
15de0 54 68 65 20 76 6d 20 75 6e 64 65 72 20 63 6f 6e  The vm under con
15df0 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49  struction */.  I
15e00 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20  ndex *pIdx;     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15e20 54 68 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20  The index being 
15e30 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 6c 6f  used for this lo
15e40 6f 70 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  op */.  int iCur
15e50 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43   = pLevel->iTabC
15e60 75 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75 72  ur;   /* The cur
15e70 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  sor of the table
15e80 20 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20   */.  WhereTerm 
15e90 2a 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20  *pTerm;         
15ea0 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
15eb0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 20  constraint term 
15ec0 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20  */.  int j;     
15ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ee0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
15ef0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 42  er */.  int regB
15f00 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ase;            
15f10 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65        /* Base re
15f20 67 69 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  gister */.  int 
15f30 6e 52 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nReg;           
15f40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
15f50 62 65 72 20 6f 66 20 72 65 67 69 73 74 65 72 73  ber of registers
15f60 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a   to allocate */.
15f70 20 20 63 68 61 72 20 2a 7a 41 66 66 3b 20 20 20    char *zAff;   
15f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f90 2f 2a 20 41 66 66 69 6e 69 74 79 20 73 74 72 69  /* Affinity stri
15fa0 6e 67 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ng to return */.
15fb0 0a 20 20 2f 2a 20 54 68 69 73 20 6d 6f 64 75 6c  .  /* This modul
15fc0 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  e is only called
15fd0 20 6f 6e 20 71 75 65 72 79 20 70 6c 61 6e 73 20   on query plans 
15fe0 74 68 61 74 20 75 73 65 20 61 6e 20 69 6e 64 65  that use an inde
15ff0 78 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  x. */.  assert( 
16000 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
16010 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 4e 44  lags & WHERE_IND
16020 45 58 45 44 20 29 3b 0a 20 20 70 49 64 78 20 3d  EXED );.  pIdx =
16030 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e   pLevel->plan.u.
16040 70 49 64 78 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  pIdx;..  /* Figu
16050 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
16060 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 77 65 20  memory cells we 
16070 77 69 6c 6c 20 6e 65 65 64 20 74 68 65 6e 20 61  will need then a
16080 6c 6c 6f 63 61 74 65 20 74 68 65 6d 2e 0a 20 20  llocate them..  
16090 2a 2f 0a 20 20 72 65 67 42 61 73 65 20 3d 20 70  */.  regBase = p
160a0 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b  Parse->nMem + 1;
160b0 0a 20 20 6e 52 65 67 20 3d 20 70 4c 65 76 65 6c  .  nReg = pLevel
160c0 2d 3e 70 6c 61 6e 2e 6e 45 71 20 2b 20 6e 45 78  ->plan.nEq + nEx
160d0 74 72 61 52 65 67 3b 0a 20 20 70 50 61 72 73 65  traReg;.  pParse
160e0 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b 0a  ->nMem += nReg;.
160f0 0a 20 20 7a 41 66 66 20 3d 20 73 71 6c 69 74 65  .  zAff = sqlite
16100 33 44 62 53 74 72 44 75 70 28 70 50 61 72 73 65  3DbStrDup(pParse
16110 2d 3e 64 62 2c 20 73 71 6c 69 74 65 33 49 6e 64  ->db, sqlite3Ind
16120 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
16130 20 70 49 64 78 29 29 3b 0a 20 20 69 66 28 20 21   pIdx));.  if( !
16140 7a 41 66 66 20 29 7b 0a 20 20 20 20 70 50 61 72  zAff ){.    pPar
16150 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
16160 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  iled = 1;.  }.. 
16170 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
16180 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
16190 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73  aints.  */.  ass
161a0 65 72 74 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75  ert( pIdx->nColu
161b0 6d 6e 3e 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72  mn>=nEq );.  for
161c0 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
161d0 29 7b 0a 20 20 20 20 69 6e 74 20 72 31 3b 0a 20  ){.    int r1;. 
161e0 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d     int k = pIdx-
161f0 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
16200 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
16210 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
16220 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76 65   notReady, pLeve
16230 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 2c  l->plan.wsFlags,
16240 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20   pIdx);.    if( 
16250 4e 45 56 45 52 28 70 54 65 72 6d 3d 3d 30 29 20  NEVER(pTerm==0) 
16260 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73  ) break;.    ass
16270 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
16280 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
16290 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 72 31 20  D)==0 );.    r1 
162a0 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65  = codeEqualityTe
162b0 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
162c0 2c 20 70 4c 65 76 65 6c 2c 20 72 65 67 42 61 73  , pLevel, regBas
162d0 65 2b 6a 29 3b 0a 20 20 20 20 69 66 28 20 72 31  e+j);.    if( r1
162e0 21 3d 72 65 67 42 61 73 65 2b 6a 20 29 7b 0a 20  !=regBase+j ){. 
162f0 20 20 20 20 20 69 66 28 20 6e 52 65 67 3d 3d 31       if( nReg==1
16300 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
16310 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
16320 67 28 70 50 61 72 73 65 2c 20 72 65 67 42 61 73  g(pParse, regBas
16330 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 67 42  e);.        regB
16340 61 73 65 20 3d 20 72 31 3b 0a 20 20 20 20 20 20  ase = r1;.      
16350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
16360 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16370 28 76 2c 20 4f 50 5f 53 43 6f 70 79 2c 20 72 31  (v, OP_SCopy, r1
16380 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b 0a 20 20  , regBase+j);.  
16390 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
163a0 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
163b0 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
163c0 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 74 65  ISNULL );.    te
163d0 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 65  stcase( pTerm->e
163e0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
163f0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65   );.    if( (pTe
16400 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
16410 28 57 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e  (WO_ISNULL|WO_IN
16420 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ))==0 ){.      s
16430 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
16440 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
16450 65 67 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c  egBase+j, pLevel
16460 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20 20 20 20  ->addrBrk);.    
16470 20 20 69 66 28 20 7a 41 66 66 20 0a 20 20 20 20    if( zAff .    
16480 20 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6d     && sqlite3Com
16490 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 54 65  pareAffinity(pTe
164a0 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  rm->pExpr->pRigh
164b0 74 2c 20 7a 41 66 66 5b 6a 5d 29 3d 3d 53 51 4c  t, zAff[j])==SQL
164c0 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20  ITE_AFF_NONE.   
164d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 41     ){.        zA
164e0 66 66 5b 6a 5d 20 3d 20 53 51 4c 49 54 45 5f 41  ff[j] = SQLITE_A
164f0 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d  FF_NONE;.      }
16500 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
16510 41 66 66 20 3d 20 7a 41 66 66 3b 0a 20 20 72 65  Aff = zAff;.  re
16520 74 75 72 6e 20 72 65 67 42 61 73 65 3b 0a 7d 0a  turn regBase;.}.
16530 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
16540 63 6f 64 65 20 66 6f 72 20 74 68 65 20 73 74 61  code for the sta
16550 72 74 20 6f 66 20 74 68 65 20 69 4c 65 76 65 6c  rt of the iLevel
16560 2d 74 68 20 6c 6f 6f 70 20 69 6e 20 74 68 65 20  -th loop in the 
16570 57 48 45 52 45 20 63 6c 61 75 73 65 0a 2a 2a 20  WHERE clause.** 
16580 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
16590 65 73 63 72 69 62 65 64 20 62 79 20 70 57 49 6e  escribed by pWIn
165a0 66 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69  fo..*/.static Bi
165b0 74 6d 61 73 6b 20 63 6f 64 65 4f 6e 65 4c 6f 6f  tmask codeOneLoo
165c0 70 53 74 61 72 74 28 0a 20 20 57 68 65 72 65 49  pStart(.  WhereI
165d0 6e 66 6f 20 2a 70 57 49 6e 66 6f 2c 20 20 20 2f  nfo *pWInfo,   /
165e0 2a 20 43 6f 6d 70 6c 65 74 65 20 69 6e 66 6f 72  * Complete infor
165f0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
16600 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
16610 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
16620 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68          /* Which
16630 20 6c 65 76 65 6c 20 6f 66 20 70 57 49 6e 66 6f   level of pWInfo
16640 2d 3e 61 5b 5d 20 73 68 6f 75 6c 64 20 62 65 20  ->a[] should be 
16650 63 6f 64 65 64 20 2a 2f 0a 20 20 75 31 36 20 77  coded */.  u16 w
16660 63 74 72 6c 46 6c 61 67 73 2c 20 20 20 20 20 20  ctrlFlags,      
16670 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 57 48  /* One of the WH
16680 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65 66 69  ERE_* flags defi
16690 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49 6e 74  ned in sqliteInt
166a0 2e 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  .h */.  Bitmask 
166b0 6e 6f 74 52 65 61 64 79 20 20 20 20 20 2f 2a 20  notReady     /* 
166c0 57 68 69 63 68 20 74 61 62 6c 65 73 20 61 72 65  Which tables are
166d0 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c   currently avail
166e0 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  able */.){.  int
166f0 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
16700 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16710 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72  rs */.  int iCur
16720 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
16730 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
16740 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
16750 0a 20 20 69 6e 74 20 61 64 64 72 4e 78 74 3b 20  .  int addrNxt; 
16760 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
16770 20 74 6f 20 6a 75 6d 70 20 74 6f 20 63 6f 6e 74   to jump to cont
16780 69 6e 75 65 20 77 69 74 68 20 74 68 65 20 6e 65  inue with the ne
16790 78 74 20 49 4e 20 63 61 73 65 20 2a 2f 0a 20 20  xt IN case */.  
167a0 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20 20  int omitTable;  
167b0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
167c0 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78  we use the index
167d0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 62   only */.  int b
167e0 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rev;            
167f0 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65  /* True if we ne
16800 65 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65  ed to scan in re
16810 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
16820 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
16830 76 65 6c 3b 20 20 2f 2a 20 54 68 65 20 77 68 65  vel;  /* The whe
16840 72 65 20 6c 65 76 65 6c 20 74 6f 20 62 65 20 63  re level to be c
16850 6f 64 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 43  oded */.  WhereC
16860 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20 20 2f  lause *pWC;    /
16870 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20  * Decomposition 
16880 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 57 48  of the entire WH
16890 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
168a0 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
168b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
168c0 2f 2a 20 41 20 57 48 45 52 45 20 63 6c 61 75 73  /* A WHERE claus
168d0 65 20 74 65 72 6d 20 2a 2f 0a 20 20 50 61 72 73  e term */.  Pars
168e0 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20  e *pParse;      
168f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
16900 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
16910 2f 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20  /.  Vdbe *v;    
16920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16930 20 20 20 20 2f 2a 20 54 68 65 20 70 72 65 70 61      /* The prepa
16940 72 65 64 20 73 74 6d 74 20 75 6e 64 65 72 20 63  red stmt under c
16950 6f 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a  onstructions */.
16960 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
16970 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b  _item *pTabItem;
16980 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65    /* FROM clause
16990 20 74 65 72 6d 20 62 65 69 6e 67 20 63 6f 64 65   term being code
169a0 64 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 42  d */.  int addrB
169b0 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
169c0 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
169d0 65 72 65 20 74 6f 20 62 72 65 61 6b 20 6f 75 74  ere to break out
169e0 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a   of the loop */.
169f0 20 20 69 6e 74 20 61 64 64 72 43 6f 6e 74 3b 20    int addrCont; 
16a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a10 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
16a20 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20  o continue with 
16a30 6e 65 78 74 20 63 79 63 6c 65 20 2a 2f 0a 20 20  next cycle */.  
16a40 69 6e 74 20 69 52 6f 77 69 64 52 65 67 20 3d 20  int iRowidReg = 
16a50 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77  0;        /* Row
16a60 69 64 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  id is stored in 
16a70 74 68 69 73 20 72 65 67 69 73 74 65 72 2c 20 69  this register, i
16a80 66 20 6e 6f 74 20 7a 65 72 6f 20 2a 2f 0a 20 20  f not zero */.  
16a90 69 6e 74 20 69 52 65 6c 65 61 73 65 52 65 67 20  int iReleaseReg 
16aa0 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 65 6d  = 0;      /* Tem
16ab0 70 20 72 65 67 69 73 74 65 72 20 74 6f 20 66 72  p register to fr
16ac0 65 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ee before return
16ad0 69 6e 67 20 2a 2f 0a 0a 20 20 70 50 61 72 73 65  ing */..  pParse
16ae0 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
16af0 65 3b 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  e;.  v = pParse-
16b00 3e 70 56 64 62 65 3b 0a 20 20 70 57 43 20 3d 20  >pVdbe;.  pWC = 
16b10 70 57 49 6e 66 6f 2d 3e 70 57 43 3b 0a 20 20 70  pWInfo->pWC;.  p
16b20 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d  Level = &pWInfo-
16b30 3e 61 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 70 54  >a[iLevel];.  pT
16b40 61 62 49 74 65 6d 20 3d 20 26 70 57 49 6e 66 6f  abItem = &pWInfo
16b50 2d 3e 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c  ->pTabList->a[pL
16b60 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
16b70 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
16b80 3e 69 43 75 72 73 6f 72 3b 0a 20 20 62 52 65 76  >iCursor;.  bRev
16b90 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e   = (pLevel->plan
16ba0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
16bb0 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a 20 20  _REVERSE)!=0;.  
16bc0 6f 6d 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65  omitTable = (pLe
16bd0 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
16be0 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
16bf0 4c 59 29 21 3d 30 20 0a 20 20 20 20 20 20 20 20  LY)!=0 .        
16c00 20 20 20 26 26 20 28 77 63 74 72 6c 46 6c 61 67     && (wctrlFlag
16c10 73 20 26 20 57 48 45 52 45 5f 46 4f 52 43 45 5f  s & WHERE_FORCE_
16c20 54 41 42 4c 45 29 3d 3d 30 3b 0a 0a 20 20 2f 2a  TABLE)==0;..  /*
16c30 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
16c40 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
16c50 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
16c60 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 2a 2a 20  structions.  ** 
16c70 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
16c80 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 61  loop.  Jump to a
16c90 64 64 72 42 72 6b 20 74 6f 20 62 72 65 61 6b 20  ddrBrk to break 
16ca0 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20  out of a loop.. 
16cb0 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
16cc0 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
16cd0 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
16ce0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
16cf0 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a    ** loop..  **.
16d00 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 72 65 20    ** When there 
16d10 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  is an IN operato
16d20 72 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65 20  r, we also have 
16d30 61 20 22 61 64 64 72 4e 78 74 22 20 6c 61 62 65  a "addrNxt" labe
16d40 6c 20 74 68 61 74 0a 20 20 2a 2a 20 6d 65 61 6e  l that.  ** mean
16d50 73 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69  s to continue wi
16d60 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 76  th the next IN v
16d70 61 6c 75 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  alue combination
16d80 2e 20 20 57 68 65 6e 0a 20 20 2a 2a 20 74 68 65  .  When.  ** the
16d90 72 65 20 61 72 65 20 6e 6f 20 49 4e 20 6f 70 65  re are no IN ope
16da0 72 61 74 6f 72 73 20 69 6e 20 74 68 65 20 63 6f  rators in the co
16db0 6e 73 74 72 61 69 6e 74 73 2c 20 74 68 65 20 22  nstraints, the "
16dc0 61 64 64 72 4e 78 74 22 20 6c 61 62 65 6c 0a 20  addrNxt" label. 
16dd0 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
16de0 61 73 20 22 61 64 64 72 42 72 6b 22 2e 0a 20 20  as "addrBrk"..  
16df0 2a 2f 0a 20 20 61 64 64 72 42 72 6b 20 3d 20 70  */.  addrBrk = p
16e00 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72 6b 20 3d  Level->addrBrk =
16e10 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
16e20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
16e30 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 61 64  keLabel(v);.  ad
16e40 64 72 43 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d  drCont = pLevel-
16e50 3e 61 64 64 72 43 6f 6e 74 20 3d 20 73 71 6c 69  >addrCont = sqli
16e60 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
16e70 28 76 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (v);..  /* If th
16e80 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74 20  is is the right 
16e90 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
16ea0 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f  OUTER JOIN, allo
16eb0 63 61 74 65 20 61 6e 64 0a 20 20 2a 2a 20 69 6e  cate and.  ** in
16ec0 69 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72  itialize a memor
16ed0 79 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f  y cell that reco
16ee0 72 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c  rds if this tabl
16ef0 65 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20  e matches any.  
16f00 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65  ** row of the le
16f10 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20  ft table of the 
16f20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  join..  */.  if(
16f30 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
16f40 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 30 5d   && (pTabItem[0]
16f50 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  .jointype & JT_L
16f60 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 70  EFT)!=0 ){.    p
16f70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
16f80 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65   = ++pParse->nMe
16f90 6d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  m;.    sqlite3Vd
16fa0 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
16fb0 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
16fc0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
16fd0 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
16fe0 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20 4a 4f  v, "init LEFT JO
16ff0 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67  IN no-match flag
17000 22 29 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  "));.  }..#ifnde
17010 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
17020 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
17030 20 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e    (pLevel->plan.
17040 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
17050 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
17060 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
17070 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69 73  0:  The table is
17080 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65   a virtual-table
17090 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c 74  .  Use the VFilt
170a0 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20 20  er and VNext.   
170b0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20   **          to 
170c0 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 2e  access the data.
170d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  .    */.    int 
170e0 69 52 65 67 3b 20 20 20 2f 2a 20 50 33 20 56 61  iReg;   /* P3 Va
170f0 6c 75 65 20 66 6f 72 20 4f 50 5f 56 46 69 6c 74  lue for OP_VFilt
17100 65 72 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  er */.    sqlite
17110 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 56  3_index_info *pV
17120 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d  tabIdx = pLevel-
17130 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64 78  >plan.u.pVtabIdx
17140 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  ;.    int nConst
17150 72 61 69 6e 74 20 3d 20 70 56 74 61 62 49 64 78  raint = pVtabIdx
17160 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20  ->nConstraint;. 
17170 20 20 20 73 74 72 75 63 74 20 73 71 6c 69 74 65     struct sqlite
17180 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69  3_index_constrai
17190 6e 74 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65  nt_usage *aUsage
171a0 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
171b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171d0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
171e0 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
171f0 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20     const struct 
17200 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
17210 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74  nstraint *aConst
17220 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20  raint =.        
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17250 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78          pVtabIdx
17260 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 0a  ->aConstraint;..
17270 20 20 20 20 69 52 65 67 20 3d 20 73 71 6c 69 74      iReg = sqlit
17280 65 33 47 65 74 54 65 6d 70 52 61 6e 67 65 28 70  e3GetTempRange(p
17290 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69  Parse, nConstrai
172a0 6e 74 2b 32 29 3b 0a 20 20 20 20 66 6f 72 28 6a  nt+2);.    for(j
172b0 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73 74 72 61 69  =1; j<=nConstrai
172c0 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
172d0 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 43 6f 6e 73  for(k=0; k<nCons
172e0 74 72 61 69 6e 74 3b 20 6b 2b 2b 29 7b 0a 20 20  traint; k++){.  
172f0 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67 65        if( aUsage
17300 5b 6b 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d 6a  [k].argvIndex==j
17310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
17320 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
17330 72 61 69 6e 74 5b 6b 5d 2e 69 54 65 72 6d 4f 66  raint[k].iTermOf
17340 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
17350 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
17360 70 50 61 72 73 65 2c 20 70 57 43 2d 3e 61 5b 69  pParse, pWC->a[i
17370 54 65 72 6d 5d 2e 70 45 78 70 72 2d 3e 70 52 69  Term].pExpr->pRi
17380 67 68 74 2c 20 69 52 65 67 2b 6a 2b 31 29 3b 0a  ght, iReg+j+1);.
17390 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
173a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
173b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d   }.      if( k==
173c0 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72  nConstraint ) br
173d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
173e0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
173f0 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
17400 70 56 74 61 62 49 64 78 2d 3e 69 64 78 4e 75 6d  pVtabIdx->idxNum
17410 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 73 71 6c  , iReg);.    sql
17420 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17430 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 6a 2d  , OP_Integer, j-
17440 31 2c 20 69 52 65 67 2b 31 29 3b 0a 20 20 20 20  1, iReg+1);.    
17450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17460 34 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c  4(v, OP_VFilter,
17470 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20   iCur, addrBrk, 
17480 69 52 65 67 2c 20 70 56 74 61 62 49 64 78 2d 3e  iReg, pVtabIdx->
17490 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
174a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
174b0 74 61 62 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  tabIdx->needToFr
174c0 65 65 49 64 78 53 74 72 20 3f 20 50 34 5f 4d 50  eeIdxStr ? P4_MP
174d0 52 49 4e 54 46 20 3a 20 50 34 5f 53 54 41 54 49  RINTF : P4_STATI
174e0 43 29 3b 0a 20 20 20 20 70 56 74 61 62 49 64 78  C);.    pVtabIdx
174f0 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
17500 74 72 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  tr = 0;.    for(
17510 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74 72 61 69  j=0; j<nConstrai
17520 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; j++){.      
17530 69 66 28 20 61 55 73 61 67 65 5b 6a 5d 2e 6f 6d  if( aUsage[j].om
17540 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  it ){.        in
17550 74 20 69 54 65 72 6d 20 3d 20 61 43 6f 6e 73 74  t iTerm = aConst
17560 72 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66  raint[j].iTermOf
17570 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 64 69  fset;.        di
17580 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
17590 2c 20 26 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  , &pWC->a[iTerm]
175a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
175b0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20  .    pLevel->op 
175c0 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
175d0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
175e0 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  r;.    pLevel->p
175f0 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
17600 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
17610 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
17620 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
17630 65 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72  e, iReg, nConstr
17640 61 69 6e 74 2b 32 29 3b 0a 20 20 7d 65 6c 73 65  aint+2);.  }else
17650 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17660 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
17670 42 4c 45 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4c  BLE */..  if( pL
17680 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
17690 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44  gs & WHERE_ROWID
176a0 5f 45 51 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61  _EQ ){.    /* Ca
176b0 73 65 20 31 3a 20 20 57 65 20 63 61 6e 20 64 69  se 1:  We can di
176c0 72 65 63 74 6c 79 20 72 65 66 65 72 65 6e 63 65  rectly reference
176d0 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 20 75 73   a single row us
176e0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 20 20  ing an.    **   
176f0 20 20 20 20 20 20 20 65 71 75 61 6c 69 74 79 20         equality 
17700 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
17710 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
17720 6c 64 2e 20 20 4f 72 0a 20 20 20 20 2a 2a 20 20  ld.  Or.    **  
17730 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
17740 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
17750 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
17760 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
17770 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
17780 74 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  truct..    */.  
17790 20 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20    iReleaseReg = 
177a0 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65  sqlite3GetTempRe
177b0 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 70  g(pParse);.    p
177c0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
177d0 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
177e0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
177f0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 61 73  O_IN, 0);.    as
17800 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
17810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
17820 65 72 6d 2d 3e 70 45 78 70 72 21 3d 30 20 29 3b  erm->pExpr!=0 );
17830 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65  .    assert( pTe
17840 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d  rm->leftCursor==
17850 69 43 75 72 20 29 3b 0a 20 20 20 20 61 73 73 65  iCur );.    asse
17860 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
17870 20 29 3b 0a 20 20 20 20 69 52 6f 77 69 64 52 65   );.    iRowidRe
17880 67 20 3d 20 63 6f 64 65 45 71 75 61 6c 69 74 79  g = codeEquality
17890 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65  Term(pParse, pTe
178a0 72 6d 2c 20 70 4c 65 76 65 6c 2c 20 69 52 65 6c  rm, pLevel, iRel
178b0 65 61 73 65 52 65 67 29 3b 0a 20 20 20 20 61 64  easeReg);.    ad
178c0 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c 2d 3e  drNxt = pLevel->
178d0 61 64 64 72 4e 78 74 3b 0a 20 20 20 20 73 71 6c  addrNxt;.    sql
178e0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
178f0 2c 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20  , OP_MustBeInt, 
17900 69 52 6f 77 69 64 52 65 67 2c 20 61 64 64 72 4e  iRowidReg, addrN
17910 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  xt);.    sqlite3
17920 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17930 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72  _NotExists, iCur
17940 2c 20 61 64 64 72 4e 78 74 2c 20 69 52 6f 77 69  , addrNxt, iRowi
17950 64 52 65 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  dReg);.    sqlit
17960 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
17970 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d  (pParse, iCur, -
17980 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20  1, iRowidReg);. 
17990 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
179a0 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 70  v, "pk"));.    p
179b0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
179c0 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  oop;.  }else if(
179d0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
179e0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  Flags & WHERE_RO
179f0 57 49 44 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20  WID_RANGE ){.   
17a00 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20   /* Case 2:  We 
17a10 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
17a20 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
17a30 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
17a40 66 69 65 6c 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  field..    */.  
17a50 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f    int testOp = O
17a60 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20  P_Noop;.    int 
17a70 73 74 61 72 74 3b 0a 20 20 20 20 69 6e 74 20 6d  start;.    int m
17a80 65 6d 45 6e 64 56 61 6c 75 65 20 3d 20 30 3b 0a  emEndValue = 0;.
17a90 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
17aa0 53 74 61 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20  Start, *pEnd;.. 
17ab0 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
17ac0 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70  able==0 );.    p
17ad0 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
17ae0 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
17af0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
17b00 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 70  WO_GE, 0);.    p
17b10 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  End = findTerm(p
17b20 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
17b30 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f  tReady, WO_LT|WO
17b40 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  _LE, 0);.    if(
17b50 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 70   bRev ){.      p
17b60 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a 20  Term = pStart;. 
17b70 20 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 45       pStart = pE
17b80 6e 64 3b 0a 20 20 20 20 20 20 70 45 6e 64 20 3d  nd;.      pEnd =
17b90 20 70 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20   pTerm;.    }.  
17ba0 20 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a    if( pStart ){.
17bb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 20        Expr *pX; 
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
17bd0 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  he expression th
17be0 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 73  at defines the s
17bf0 74 61 72 74 20 62 6f 75 6e 64 20 2a 2f 0a 20 20  tart bound */.  
17c00 20 20 20 20 69 6e 74 20 72 31 2c 20 72 54 65 6d      int r1, rTem
17c10 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67  p;        /* Reg
17c20 69 73 74 65 72 73 20 66 6f 72 20 68 6f 6c 64 69  isters for holdi
17c30 6e 67 20 74 68 65 20 73 74 61 72 74 20 62 6f 75  ng the start bou
17c40 6e 64 61 72 79 20 2a 2f 0a 0a 20 20 20 20 20 20  ndary */..      
17c50 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
17c60 20 63 6f 6e 73 74 61 6e 74 20 6d 61 70 73 20 54   constant maps T
17c70 4b 5f 78 78 20 63 6f 64 65 73 20 69 6e 74 6f 20  K_xx codes into 
17c80 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 0a 20  corresponding . 
17c90 20 20 20 20 20 2a 2a 20 73 65 65 6b 20 6f 70 63       ** seek opc
17ca0 6f 64 65 73 2e 20 20 49 74 20 64 65 70 65 6e 64  odes.  It depend
17cb0 73 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  s on a particula
17cc0 72 20 6f 72 64 65 72 69 6e 67 20 6f 66 20 54 4b  r ordering of TK
17cd0 5f 78 78 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  _xx.      */.   
17ce0 20 20 20 63 6f 6e 73 74 20 75 38 20 61 4d 6f 76     const u8 aMov
17cf0 65 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  eOp[] = {.      
17d00 20 20 20 20 20 2f 2a 20 54 4b 5f 47 54 20 2a 2f       /* TK_GT */
17d10 20 20 4f 50 5f 53 65 65 6b 47 74 2c 0a 20 20 20    OP_SeekGt,.   
17d20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 45          /* TK_LE
17d30 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c 65 2c 0a   */  OP_SeekLe,.
17d40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b             /* TK
17d50 5f 4c 54 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 4c  _LT */  OP_SeekL
17d60 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,.           /*
17d70 20 54 4b 5f 47 45 20 2a 2f 20 20 4f 50 5f 53 65   TK_GE */  OP_Se
17d80 65 6b 47 65 0a 20 20 20 20 20 20 7d 3b 0a 20 20  ekGe.      };.  
17d90 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
17da0 45 3d 3d 54 4b 5f 47 54 2b 31 20 29 3b 20 20 20  E==TK_GT+1 );   
17db0 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
17dc0 74 68 65 20 6f 72 64 65 72 69 6e 67 2e 2e 20 2a  the ordering.. *
17dd0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
17de0 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20 29  TK_LT==TK_GT+2 )
17df0 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e 20 6f  ;      /*  ... o
17e00 66 20 74 68 65 20 54 4b 5f 78 78 20 76 61 6c 75  f the TK_xx valu
17e10 65 73 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 61  es... */.      a
17e20 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b  ssert( TK_GE==TK
17e30 5f 47 54 2b 33 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+3 );      /*
17e40 20 20 2e 2e 2e 20 69 73 20 63 6f 72 72 65 63 63    ... is correcc
17e50 74 2e 20 2a 2f 0a 0a 20 20 20 20 20 20 70 58 20  t. */..      pX 
17e60 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
17e70 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
17e80 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
17e90 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
17ea0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
17eb0 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c  ;.      r1 = sql
17ec0 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
17ed0 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
17ee0 67 68 74 2c 20 26 72 54 65 6d 70 29 3b 0a 20 20  ght, &rTemp);.  
17ef0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
17f00 64 64 4f 70 33 28 76 2c 20 61 4d 6f 76 65 4f 70  ddOp3(v, aMoveOp
17f10 5b 70 58 2d 3e 6f 70 2d 54 4b 5f 47 54 5d 2c 20  [pX->op-TK_GT], 
17f20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 2c 20 72  iCur, addrBrk, r
17f30 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  1);.      VdbeCo
17f40 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29  mment((v, "pk"))
17f50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
17f60 78 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79  xprCacheAffinity
17f70 43 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 72  Change(pParse, r
17f80 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 1);.      sql
17f90 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
17fa0 65 67 28 70 50 61 72 73 65 2c 20 72 54 65 6d 70  eg(pParse, rTemp
17fb0 29 3b 0a 20 20 20 20 20 20 64 69 73 61 62 6c 65  );.      disable
17fc0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74  Term(pLevel, pSt
17fd0 61 72 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  art);.    }else{
17fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
17ff0 62 65 41 64 64 4f 70 32 28 76 2c 20 62 52 65 76  beAddOp2(v, bRev
18000 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
18010 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 61 64  Rewind, iCur, ad
18020 64 72 42 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  drBrk);.    }.  
18030 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
18040 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20      Expr *pX;.  
18050 20 20 20 20 70 58 20 3d 20 70 45 6e 64 2d 3e 70      pX = pEnd->p
18060 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73 65  Expr;.      asse
18070 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
18080 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
18090 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
180a0 72 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 45 6e  r );.      memEn
180b0 64 56 61 6c 75 65 20 3d 20 2b 2b 70 50 61 72 73  dValue = ++pPars
180c0 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 73  e->nMem;.      s
180d0 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
180e0 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68  Parse, pX->pRigh
180f0 74 2c 20 6d 65 6d 45 6e 64 56 61 6c 75 65 29 3b  t, memEndValue);
18100 0a 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f  .      if( pX->o
18110 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e  p==TK_LT || pX->
18120 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20  op==TK_GT ){.   
18130 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52       testOp = bR
18140 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f  ev ? OP_Le : OP_
18150 47 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  Ge;.      }else{
18160 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
18170 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a  = bRev ? OP_Lt :
18180 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20 20 7d 0a   OP_Gt;.      }.
18190 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
181a0 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b  m(pLevel, pEnd);
181b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 72 74  .    }.    start
181c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
181d0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
181e0 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
181f0 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
18200 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
18210 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
18220 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
18230 20 73 74 61 72 74 3b 0a 20 20 20 20 70 4c 65 76   start;.    pLev
18240 65 6c 2d 3e 70 35 20 3d 20 28 70 53 74 61 72 74  el->p5 = (pStart
18250 3d 3d 30 20 26 26 20 70 45 6e 64 3d 3d 30 29 20  ==0 && pEnd==0) 
18260 3f 31 3a 30 3b 0a 20 20 20 20 69 66 28 20 74 65  ?1:0;.    if( te
18270 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
18280 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52 65 67  .      iRowidReg
18290 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67 20 3d   = iReleaseReg =
182a0 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70 52   sqlite3GetTempR
182b0 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  eg(pParse);.    
182c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
182d0 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  Op2(v, OP_Rowid,
182e0 20 69 43 75 72 2c 20 69 52 6f 77 69 64 52 65 67   iCur, iRowidReg
182f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18300 45 78 70 72 43 61 63 68 65 53 74 6f 72 65 28 70  ExprCacheStore(p
18310 50 61 72 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c  Parse, iCur, -1,
18320 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
18330 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
18340 64 4f 70 33 28 76 2c 20 74 65 73 74 4f 70 2c 20  dOp3(v, testOp, 
18350 6d 65 6d 45 6e 64 56 61 6c 75 65 2c 20 61 64 64  memEndValue, add
18360 72 42 72 6b 2c 20 69 52 6f 77 69 64 52 65 67 29  rBrk, iRowidReg)
18370 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18380 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 53  dbeChangeP5(v, S
18390 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
183a0 43 20 7c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49  C | SQLITE_JUMPI
183b0 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  FNULL);.    }.  
183c0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
183d0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
183e0 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52   (WHERE_COLUMN_R
183f0 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  ANGE|WHERE_COLUM
18400 4e 5f 45 51 29 20 29 7b 0a 20 20 20 20 2f 2a 20  N_EQ) ){.    /* 
18410 43 61 73 65 20 33 3a 20 41 20 73 63 61 6e 20 75  Case 3: A scan u
18420 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 2e 0a 20  sing an index.. 
18430 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
18440 20 20 20 20 20 54 68 65 20 57 48 45 52 45 20 63       The WHERE c
18450 6c 61 75 73 65 20 6d 61 79 20 63 6f 6e 74 61 69  lause may contai
18460 6e 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 65  n zero or more e
18470 71 75 61 6c 69 74 79 20 0a 20 20 20 20 2a 2a 20  quality .    ** 
18480 20 20 20 20 20 20 20 20 74 65 72 6d 73 20 28 22          terms ("
18490 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72  ==" or "IN" oper
184a0 61 74 6f 72 73 29 20 74 68 61 74 20 72 65 66 65  ators) that refe
184b0 72 20 74 6f 20 74 68 65 20 4e 0a 20 20 20 20 2a  r to the N.    *
184c0 2a 20 20 20 20 20 20 20 20 20 6c 65 66 74 2d 6d  *         left-m
184d0 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  ost columns of t
184e0 68 65 20 69 6e 64 65 78 2e 20 49 74 20 6d 61 79  he index. It may
184f0 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 0a 20 20   also contain.  
18500 20 20 2a 2a 20 20 20 20 20 20 20 20 20 69 6e 65    **         ine
18510 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
18520 6e 74 73 20 28 3e 2c 20 3c 2c 20 3e 3d 20 6f 72  nts (>, <, >= or
18530 20 3c 3d 29 20 6f 6e 20 74 68 65 20 69 6e 64 65   <=) on the inde
18540 78 65 64 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  xed.    **      
18550 20 20 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 69     column that i
18560 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
18570 77 73 20 74 68 65 20 4e 20 65 71 75 61 6c 69 74  ws the N equalit
18580 69 65 73 2e 20 4f 6e 6c 79 20 0a 20 20 20 20 2a  ies. Only .    *
18590 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69  *         the ri
185a0 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  ght-most column 
185b0 63 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61  can be an inequa
185c0 6c 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20  lity - the rest 
185d0 6d 75 73 74 0a 20 20 20 20 2a 2a 20 20 20 20 20  must.    **     
185e0 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
185f0 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
18600 6f 72 73 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65  ors. For example
18610 2c 20 69 66 20 74 68 65 20 0a 20 20 20 20 2a 2a  , if the .    **
18620 20 20 20 20 20 20 20 20 20 69 6e 64 65 78 20 69           index i
18630 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 2c 20 74 68  s on (x,y,z), th
18640 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  en the following
18650 20 63 6c 61 75 73 65 73 20 61 72 65 20 61 6c 6c   clauses are all
18660 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20   .    **        
18670 20 6f 70 74 69 6d 69 7a 65 64 3a 0a 20 20 20 20   optimized:.    
18680 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
18690 20 20 20 20 20 78 3d 35 0a 20 20 20 20 2a 2a 20       x=5.    ** 
186a0 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
186b0 4e 44 20 79 3d 31 30 0a 20 20 20 20 2a 2a 20 20  ND y=10.    **  
186c0 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e            x=5 AN
186d0 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20 20 20  D y<10.    **   
186e0 20 20 20 20 20 20 20 20 20 78 3d 35 20 41 4e 44           x=5 AND
186f0 20 79 3e 35 20 41 4e 44 20 79 3c 31 30 0a 20 20   y>5 AND y<10.  
18700 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
18710 78 3d 35 20 41 4e 44 20 79 3d 35 20 41 4e 44 20  x=5 AND y=5 AND 
18720 7a 3c 3d 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20  z<=10.    **.   
18730 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 65 20   **         The 
18740 7a 3c 31 30 20 74 65 72 6d 20 6f 66 20 74 68 65  z<10 term of the
18750 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6e 6e 6f   following canno
18760 74 20 62 65 20 75 73 65 64 2c 20 6f 6e 6c 79 0a  t be used, only.
18770 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74      **         t
18780 68 65 20 78 3d 35 20 74 65 72 6d 3a 0a 20 20 20  he x=5 term:.   
18790 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
187a0 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 7a 3c        x=5 AND z<
187b0 31 30 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  10.    **.    **
187c0 20 20 20 20 20 20 20 20 20 4e 20 6d 61 79 20 62           N may b
187d0 65 20 7a 65 72 6f 20 69 66 20 74 68 65 72 65 20  e zero if there 
187e0 61 72 65 20 69 6e 65 71 75 61 6c 69 74 79 20 63  are inequality c
187f0 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
18800 2a 2a 20 20 20 20 20 20 20 20 20 49 66 20 74 68  **         If th
18810 65 72 65 20 61 72 65 20 6e 6f 20 69 6e 65 71 75  ere are no inequ
18820 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
18830 73 2c 20 74 68 65 6e 20 4e 20 69 73 20 61 74 0a  s, then N is at.
18840 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 6c      **         l
18850 65 61 73 74 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  east one..    **
18860 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
18870 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
18880 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
18890 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
188a0 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 20 20 20  lause.    **    
188b0 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73       constraints
188c0 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73   but an index is
188d0 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79   selected anyway
188e0 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a  , in order.    *
188f0 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
18900 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
18910 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
18920 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
18930 20 20 20 2a 2f 20 20 0a 20 20 20 20 69 6e 74 20     */  .    int 
18940 61 53 74 61 72 74 4f 70 5b 5d 20 3d 20 7b 0a 20  aStartOp[] = {. 
18950 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 30 2c       0,.      0,
18960 0a 20 20 20 20 20 20 4f 50 5f 52 65 77 69 6e 64  .      OP_Rewind
18970 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32  ,           /* 2
18980 3a 20 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72  : (!start_constr
18990 61 69 6e 74 73 20 26 26 20 73 74 61 72 74 45 71  aints && startEq
189a0 20 26 26 20 20 21 62 52 65 76 29 20 2a 2f 0a 20   &&  !bRev) */. 
189b0 20 20 20 20 20 4f 50 5f 4c 61 73 74 2c 20 20 20       OP_Last,   
189c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33 3a 20            /* 3: 
189d0 28 21 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69  (!start_constrai
189e0 6e 74 73 20 26 26 20 73 74 61 72 74 45 71 20 26  nts && startEq &
189f0 26 20 20 20 62 52 65 76 29 20 2a 2f 0a 20 20 20  &   bRev) */.   
18a00 20 20 20 4f 50 5f 53 65 65 6b 47 74 2c 20 20 20     OP_SeekGt,   
18a10 20 20 20 20 20 20 20 20 2f 2a 20 34 3a 20 28 73          /* 4: (s
18a20 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
18a30 20 20 26 26 20 21 73 74 61 72 74 45 71 20 26 26    && !startEq &&
18a40 20 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20   !bRev) */.     
18a50 20 4f 50 5f 53 65 65 6b 4c 74 2c 20 20 20 20 20   OP_SeekLt,     
18a60 20 20 20 20 20 20 2f 2a 20 35 3a 20 28 73 74 61        /* 5: (sta
18a70 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20  rt_constraints  
18a80 26 26 20 21 73 74 61 72 74 45 71 20 26 26 20 20  && !startEq &&  
18a90 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f  bRev) */.      O
18aa0 50 5f 53 65 65 6b 47 65 2c 20 20 20 20 20 20 20  P_SeekGe,       
18ab0 20 20 20 20 2f 2a 20 36 3a 20 28 73 74 61 72 74      /* 6: (start
18ac0 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26  _constraints  &&
18ad0 20 20 73 74 61 72 74 45 71 20 26 26 20 21 62 52    startEq && !bR
18ae0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
18af0 53 65 65 6b 4c 65 20 20 20 20 20 20 20 20 20 20  SeekLe          
18b00 20 20 2f 2a 20 37 3a 20 28 73 74 61 72 74 5f 63    /* 7: (start_c
18b10 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 20  onstraints  &&  
18b20 73 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76  startEq &&  bRev
18b30 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
18b40 69 6e 74 20 61 45 6e 64 4f 70 5b 5d 20 3d 20 7b  int aEndOp[] = {
18b50 0a 20 20 20 20 20 20 4f 50 5f 4e 6f 6f 70 2c 20  .      OP_Noop, 
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
18b70 3a 20 28 21 65 6e 64 5f 63 6f 6e 73 74 72 61 69  : (!end_constrai
18b80 6e 74 73 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  nts) */.      OP
18b90 5f 49 64 78 47 45 2c 20 20 20 20 20 20 20 20 20  _IdxGE,         
18ba0 20 20 20 2f 2a 20 31 3a 20 28 65 6e 64 5f 63 6f     /* 1: (end_co
18bb0 6e 73 74 72 61 69 6e 74 73 20 26 26 20 21 62 52  nstraints && !bR
18bc0 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f  ev) */.      OP_
18bd0 49 64 78 4c 54 20 20 20 20 20 20 20 20 20 20 20  IdxLT           
18be0 20 20 2f 2a 20 32 3a 20 28 65 6e 64 5f 63 6f 6e    /* 2: (end_con
18bf0 73 74 72 61 69 6e 74 73 20 26 26 20 62 52 65 76  straints && bRev
18c00 29 20 2a 2f 0a 20 20 20 20 7d 3b 0a 20 20 20 20  ) */.    };.    
18c10 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
18c20 2d 3e 70 6c 61 6e 2e 6e 45 71 3b 0a 20 20 20 20  ->plan.nEq;.    
18c30 69 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d  int isMinQuery =
18c40 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
18c50 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 6f 70  If this is an op
18c60 74 69 6d 69 7a 65 64 20 53 45 4c 45 43 54 20 6d  timized SELECT m
18c70 69 6e 28 78 29 2e 2e 20 2a 2f 0a 20 20 20 20 69  in(x).. */.    i
18c80 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20  nt regBase;     
18c90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
18ca0 61 73 65 20 72 65 67 69 73 74 65 72 20 68 6f 6c  ase register hol
18cb0 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e 74 20  ding constraint 
18cc0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 6e  values */.    in
18cd0 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
18ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
18cf0 6d 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 20  mp register */. 
18d00 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 52     WhereTerm *pR
18d10 61 6e 67 65 53 74 61 72 74 20 3d 20 30 3b 20 20  angeStart = 0;  
18d20 2f 2a 20 49 6e 65 71 75 61 6c 69 74 79 20 63 6f  /* Inequality co
18d30 6e 73 74 72 61 69 6e 74 20 61 74 20 72 61 6e 67  nstraint at rang
18d40 65 20 73 74 61 72 74 20 2a 2f 0a 20 20 20 20 57  e start */.    W
18d50 68 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65  hereTerm *pRange
18d60 45 6e 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 49  End = 0;    /* I
18d70 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
18d80 61 69 6e 74 20 61 74 20 72 61 6e 67 65 20 65 6e  aint at range en
18d90 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 74 61  d */.    int sta
18da0 72 74 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rtEq;           
18db0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18dc0 20 72 61 6e 67 65 20 73 74 61 72 74 20 75 73 65   range start use
18dd0 73 20 3d 3d 2c 20 3e 3d 20 6f 72 20 3c 3d 20 2a  s ==, >= or <= *
18de0 2f 0a 20 20 20 20 69 6e 74 20 65 6e 64 45 71 3b  /.    int endEq;
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61     /* True if ra
18e10 6e 67 65 20 65 6e 64 20 75 73 65 73 20 3d 3d 2c  nge end uses ==,
18e20 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
18e30 20 69 6e 74 20 73 74 61 72 74 5f 63 6f 6e 73 74   int start_const
18e40 72 61 69 6e 74 73 3b 20 20 20 20 20 20 20 2f 2a  raints;       /*
18e50 20 53 74 61 72 74 20 6f 66 20 72 61 6e 67 65 20   Start of range 
18e60 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 2a  is constrained *
18e70 2f 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73 74  /.    int nConst
18e80 72 61 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20  raint;          
18e90 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18ea0 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73  constraint terms
18eb0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
18ec0 49 64 78 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Idx;         /* 
18ed0 54 68 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c  The index we wil
18ee0 6c 20 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20  l be using */.  
18ef0 20 20 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20    int iIdxCur;  
18f00 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44         /* The VD
18f10 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
18f20 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  e index */.    i
18f30 6e 74 20 6e 45 78 74 72 61 52 65 67 20 3d 20 30  nt nExtraReg = 0
18f40 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  ;   /* Number of
18f50 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72 73   extra registers
18f60 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 20 20 69   needed */.    i
18f70 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
18f80 20 20 20 20 2f 2a 20 49 6e 73 74 72 75 63 74 69      /* Instructi
18f90 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  on opcode */.   
18fa0 20 63 68 61 72 20 2a 7a 41 66 66 3b 0a 0a 20 20   char *zAff;..  
18fb0 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
18fc0 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a 20 20  >plan.u.pIdx;.  
18fd0 20 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76    iIdxCur = pLev
18fe0 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
18ff0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
19000 75 6d 6e 5b 6e 45 71 5d 3b 20 20 20 20 20 2f 2a  umn[nEq];     /*
19010 20 43 6f 6c 75 6d 6e 20 66 6f 72 20 69 6e 65 71   Column for ineq
19020 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
19030 74 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 49 66  ts */..    /* If
19040 20 74 68 69 73 20 6c 6f 6f 70 20 73 61 74 69 73   this loop satis
19050 66 69 65 73 20 61 20 73 6f 72 74 20 6f 72 64 65  fies a sort orde
19060 72 20 28 70 4f 72 64 65 72 42 79 29 20 72 65 71  r (pOrderBy) req
19070 75 65 73 74 20 74 68 61 74 20 0a 20 20 20 20 2a  uest that .    *
19080 2a 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20  * was passed to 
19090 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f  this function to
190a0 20 69 6d 70 6c 65 6d 65 6e 74 20 61 20 22 53 45   implement a "SE
190b0 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e 2e 2e 22  LECT min(x) ..."
190c0 20 0a 20 20 20 20 2a 2a 20 71 75 65 72 79 2c 20   .    ** query, 
190d0 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20  then the caller 
190e0 77 69 6c 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20  will only allow 
190f0 74 68 65 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20  the loop to run 
19100 66 6f 72 0a 20 20 20 20 2a 2a 20 61 20 73 69 6e  for.    ** a sin
19110 67 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54  gle iteration. T
19120 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74  his means that t
19130 68 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74  he first row ret
19140 75 72 6e 65 64 0a 20 20 20 20 2a 2a 20 73 68 6f  urned.    ** sho
19150 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20 4e  uld not have a N
19160 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65 64  ULL value stored
19170 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c 75   in 'x'. If colu
19180 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 2a 2a  mn 'x' is.    **
19190 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 20 61   the first one a
191a0 66 74 65 72 20 74 68 65 20 6e 45 71 20 65 71 75  fter the nEq equ
191b0 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
191c0 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c 0a  s in the index,.
191d0 20 20 20 20 2a 2a 20 74 68 69 73 20 72 65 71 75      ** this requ
191e0 69 72 65 73 20 73 6f 6d 65 20 73 70 65 63 69 61  ires some specia
191f0 6c 20 68 61 6e 64 6c 69 6e 67 2e 0a 20 20 20 20  l handling..    
19200 2a 2f 0a 20 20 20 20 69 66 28 20 28 77 63 74 72  */.    if( (wctr
19210 6c 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44  lFlags&WHERE_ORD
19220 45 52 42 59 5f 4d 49 4e 29 21 3d 30 0a 20 20 20  ERBY_MIN)!=0.   
19230 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 70 6c    && (pLevel->pl
19240 61 6e 2e 77 73 46 6c 61 67 73 26 57 48 45 52 45  an.wsFlags&WHERE
19250 5f 4f 52 44 45 52 42 59 29 0a 20 20 20 20 20 26  _ORDERBY).     &
19260 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  & (pIdx->nColumn
19270 3e 6e 45 71 29 0a 20 20 20 20 29 7b 0a 20 20 20  >nEq).    ){.   
19280 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 4f     /* assert( pO
19290 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3d 3d 31  rderBy->nExpr==1
192a0 20 29 3b 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   ); */.      /* 
192b0 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
192c0 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 69 43  ->a[0].pExpr->iC
192d0 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
192e0 6f 6c 75 6d 6e 5b 6e 45 71 5d 20 29 3b 20 2a 2f  olumn[nEq] ); */
192f0 0a 20 20 20 20 20 20 69 73 4d 69 6e 51 75 65 72  .      isMinQuer
19300 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 45 78  y = 1;.      nEx
19310 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20  traReg = 1;.    
19320 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  }..    /* Find a
19330 6e 79 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  ny inequality co
19340 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 66  nstraint terms f
19350 6f 72 20 74 68 65 20 73 74 61 72 74 20 61 6e 64  or the start and
19360 20 65 6e 64 20 0a 20 20 20 20 2a 2a 20 6f 66 20   end .    ** of 
19370 74 68 65 20 72 61 6e 67 65 2e 20 0a 20 20 20 20  the range. .    
19380 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  */.    if( pLeve
19390 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
193a0 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  & WHERE_TOP_LIMI
193b0 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e 67  T ){.      pRang
193c0 65 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d 28  eEnd = findTerm(
193d0 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  pWC, iCur, k, no
193e0 74 52 65 61 64 79 2c 20 28 57 4f 5f 4c 54 7c 57  tReady, (WO_LT|W
193f0 4f 5f 4c 45 29 2c 20 70 49 64 78 29 3b 0a 20 20  O_LE), pIdx);.  
19400 20 20 20 20 6e 45 78 74 72 61 52 65 67 20 3d 20      nExtraReg = 
19410 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
19420 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
19430 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  Flags & WHERE_BT
19440 4d 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 20  M_LIMIT ){.     
19450 20 70 52 61 6e 67 65 53 74 61 72 74 20 3d 20 66   pRangeStart = f
19460 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
19470 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, k, notReady, 
19480 28 57 4f 5f 47 54 7c 57 4f 5f 47 45 29 2c 20 70  (WO_GT|WO_GE), p
19490 49 64 78 29 3b 0a 20 20 20 20 20 20 6e 45 78 74  Idx);.      nExt
194a0 72 61 52 65 67 20 3d 20 31 3b 0a 20 20 20 20 7d  raReg = 1;.    }
194b0 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74  ..    /* Generat
194c0 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61  e code to evalua
194d0 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e  te all constrain
194e0 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d  t terms using ==
194f0 20 6f 72 20 49 4e 0a 20 20 20 20 2a 2a 20 61 6e   or IN.    ** an
19500 64 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75  d store the valu
19510 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
19520 73 20 69 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  s in an array of
19530 20 72 65 67 69 73 74 65 72 73 0a 20 20 20 20 2a   registers.    *
19540 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 72 65  * starting at re
19550 67 42 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  gBase..    */.  
19560 20 20 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65    regBase = code
19570 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73  AllEqualityTerms
19580 28 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  (.        pParse
19590 2c 20 70 4c 65 76 65 6c 2c 20 70 57 43 2c 20 6e  , pLevel, pWC, n
195a0 6f 74 52 65 61 64 79 2c 20 6e 45 78 74 72 61 52  otReady, nExtraR
195b0 65 67 2c 20 26 7a 41 66 66 0a 20 20 20 20 29 3b  eg, &zAff.    );
195c0 0a 20 20 20 20 61 64 64 72 4e 78 74 20 3d 20 70  .    addrNxt = p
195d0 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 3b 0a  Level->addrNxt;.
195e0 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
195f0 65 20 64 6f 69 6e 67 20 61 20 72 65 76 65 72 73  e doing a revers
19600 65 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e 20  e order scan on 
19610 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
19620 65 78 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 61 20  ex, or.    ** a 
19630 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 73 63  forward order sc
19640 61 6e 20 6f 6e 20 61 20 64 65 73 63 65 6e 64 69  an on a descendi
19650 6e 67 20 69 6e 64 65 78 2c 20 69 6e 74 65 72 63  ng index, interc
19660 68 61 6e 67 65 20 74 68 65 20 0a 20 20 20 20 2a  hange the .    *
19670 2a 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  * start and end 
19680 74 65 72 6d 73 20 28 70 52 61 6e 67 65 53 74 61  terms (pRangeSta
19690 72 74 20 61 6e 64 20 70 52 61 6e 67 65 45 6e 64  rt and pRangeEnd
196a0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  )..    */.    if
196b0 28 20 62 52 65 76 3d 3d 28 70 49 64 78 2d 3e 61  ( bRev==(pIdx->a
196c0 53 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d  SortOrder[nEq]==
196d0 53 51 4c 49 54 45 5f 53 4f 5f 41 53 43 29 20 29  SQLITE_SO_ASC) )
196e0 7b 0a 20 20 20 20 20 20 53 57 41 50 28 57 68 65  {.      SWAP(Whe
196f0 72 65 54 65 72 6d 20 2a 2c 20 70 52 61 6e 67 65  reTerm *, pRange
19700 45 6e 64 2c 20 70 52 61 6e 67 65 53 74 61 72 74  End, pRangeStart
19710 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 65  );.    }..    te
19720 73 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74  stcase( pRangeSt
19730 61 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61  art && pRangeSta
19740 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
19750 57 4f 5f 4c 45 20 29 3b 0a 20 20 20 20 74 65 73  WO_LE );.    tes
19760 74 63 61 73 65 28 20 70 52 61 6e 67 65 53 74 61  tcase( pRangeSta
19770 72 74 20 26 26 20 70 52 61 6e 67 65 53 74 61 72  rt && pRangeStar
19780 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57  t->eOperator & W
19790 4f 5f 47 45 20 29 3b 0a 20 20 20 20 74 65 73 74  O_GE );.    test
197a0 63 61 73 65 28 20 70 52 61 6e 67 65 45 6e 64 20  case( pRangeEnd 
197b0 26 26 20 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f  && pRangeEnd->eO
197c0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45 20  perator & WO_LE 
197d0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
197e0 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
197f0 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
19800 6f 72 20 26 20 57 4f 5f 47 45 20 29 3b 0a 20 20  or & WO_GE );.  
19810 20 20 73 74 61 72 74 45 71 20 3d 20 21 70 52 61    startEq = !pRa
19820 6e 67 65 53 74 61 72 74 20 7c 7c 20 70 52 61 6e  ngeStart || pRan
19830 67 65 53 74 61 72 74 2d 3e 65 4f 70 65 72 61 74  geStart->eOperat
19840 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47  or & (WO_LE|WO_G
19850 45 29 3b 0a 20 20 20 20 65 6e 64 45 71 20 3d 20  E);.    endEq = 
19860 20 20 21 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20    !pRangeEnd || 
19870 70 52 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72  pRangeEnd->eOper
19880 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f  ator & (WO_LE|WO
19890 5f 47 45 29 3b 0a 20 20 20 20 73 74 61 72 74 5f  _GE);.    start_
198a0 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d 20 70 52  constraints = pR
198b0 61 6e 67 65 53 74 61 72 74 20 7c 7c 20 6e 45 71  angeStart || nEq
198c0 3e 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65 6b  >0;..    /* Seek
198d0 20 74 68 65 20 69 6e 64 65 78 20 63 75 72 73 6f   the index curso
198e0 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
198f0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
19900 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20      nConstraint 
19910 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28 20 70  = nEq;.    if( p
19920 52 61 6e 67 65 53 74 61 72 74 20 29 7b 0a 20 20  RangeStart ){.  
19930 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
19940 20 3d 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e   = pRangeStart->
19950 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
19960 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19970 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
19980 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45 71  ght, regBase+nEq
19990 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
199a0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
199b0 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65  _IsNull, regBase
199c0 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b 0a  +nEq, addrNxt);.
199d0 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20 0a        if( zAff .
199e0 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
199f0 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79  3CompareAffinity
19a00 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6e 43  (pRight, zAff[nC
19a10 6f 6e 73 74 72 61 69 6e 74 5d 29 3d 3d 53 51 4c  onstraint])==SQL
19a20 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20 20  ITE_AFF_NONE.   
19a30 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
19a40 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70 61   Since the compa
19a50 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20 70  rison is to be p
19a60 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e 6f  erformed with no
19a70 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 70 70   conversions app
19a80 6c 69 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  lied.        ** 
19a90 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73 2c  to the operands,
19aa0 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69 74   set the affinit
19ab0 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70 52  y to apply to pR
19ac0 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20 20  ight to .       
19ad0 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e   ** SQLITE_AFF_N
19ae0 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ONE.  */.       
19af0 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e   zAff[nConstrain
19b00 74 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f  t] = SQLITE_AFF_
19b10 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  NONE;.      }.  
19b20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b      nConstraint+
19b30 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  +;.    }else if(
19b40 20 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20   isMinQuery ){. 
19b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
19b60 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
19b70 6c 2c 20 30 2c 20 72 65 67 42 61 73 65 2b 6e 45  l, 0, regBase+nE
19b80 71 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e 73 74  q);.      nConst
19b90 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  raint++;.      s
19ba0 74 61 72 74 45 71 20 3d 20 30 3b 0a 20 20 20 20  tartEq = 0;.    
19bb0 20 20 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69    start_constrai
19bc0 6e 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nts = 1;.    }. 
19bd0 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66 66 69     codeApplyAffi
19be0 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72 65 67  nity(pParse, reg
19bf0 42 61 73 65 2c 20 6e 43 6f 6e 73 74 72 61 69 6e  Base, nConstrain
19c00 74 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 6f 70  t, zAff);.    op
19c10 20 3d 20 61 53 74 61 72 74 4f 70 5b 28 73 74 61   = aStartOp[(sta
19c20 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 3c 3c  rt_constraints<<
19c30 32 29 20 2b 20 28 73 74 61 72 74 45 71 3c 3c 31  2) + (startEq<<1
19c40 29 20 2b 20 62 52 65 76 5d 3b 0a 20 20 20 20 61  ) + bRev];.    a
19c50 73 73 65 72 74 28 20 6f 70 21 3d 30 20 29 3b 0a  ssert( op!=0 );.
19c60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
19c70 3d 3d 4f 50 5f 52 65 77 69 6e 64 20 29 3b 0a 20  ==OP_Rewind );. 
19c80 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
19c90 3d 4f 50 5f 4c 61 73 74 20 29 3b 0a 20 20 20 20  =OP_Last );.    
19ca0 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50  testcase( op==OP
19cb0 5f 53 65 65 6b 47 74 20 29 3b 0a 20 20 20 20 74  _SeekGt );.    t
19cc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
19cd0 53 65 65 6b 47 65 20 29 3b 0a 20 20 20 20 74 65  SeekGe );.    te
19ce0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53  stcase( op==OP_S
19cf0 65 65 6b 4c 65 20 29 3b 0a 20 20 20 20 74 65 73  eekLe );.    tes
19d00 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65  tcase( op==OP_Se
19d10 65 6b 4c 74 20 29 3b 0a 20 20 20 20 73 71 6c 69  ekLt );.    sqli
19d20 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
19d30 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61 64   op, iIdxCur, ad
19d40 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c 20  drNxt, regBase, 
19d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d60 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e         SQLITE_IN
19d70 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72  T_TO_PTR(nConstr
19d80 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33 32 29  aint), P4_INT32)
19d90 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74  ;..    /* Load t
19da0 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
19db0 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73   inequality cons
19dc0 74 72 61 69 6e 74 20 61 74 20 74 68 65 20 65 6e  traint at the en
19dd0 64 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d of the.    ** 
19de0 72 61 6e 67 65 20 28 69 66 20 61 6e 79 29 2e 0a  range (if any)..
19df0 20 20 20 20 2a 2f 0a 20 20 20 20 6e 43 6f 6e 73      */.    nCons
19e00 74 72 61 69 6e 74 20 3d 20 6e 45 71 3b 0a 20 20  traint = nEq;.  
19e10 20 20 69 66 28 20 70 52 61 6e 67 65 45 6e 64 20    if( pRangeEnd 
19e20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
19e30 52 69 67 68 74 20 3d 20 70 52 61 6e 67 65 45 6e  Right = pRangeEn
19e40 64 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74  d->pExpr->pRight
19e50 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
19e60 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70  xprCacheRemove(p
19e70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2b 6e  Parse, regBase+n
19e80 45 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Eq);.      sqlit
19e90 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
19ea0 65 2c 20 70 52 69 67 68 74 2c 20 72 65 67 42 61  e, pRight, regBa
19eb0 73 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 73  se+nEq);.      s
19ec0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
19ed0 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72  (v, OP_IsNull, r
19ee0 65 67 42 61 73 65 2b 6e 45 71 2c 20 61 64 64 72  egBase+nEq, addr
19ef0 4e 78 74 29 3b 0a 20 20 20 20 20 20 7a 41 66 66  Nxt);.      zAff
19f00 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
19f10 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  up(pParse->db, z
19f20 41 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Aff);.      if( 
19f30 7a 41 66 66 20 0a 20 20 20 20 20 20 20 26 26 20  zAff .       && 
19f40 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
19f50 66 69 6e 69 74 79 28 70 52 69 67 68 74 2c 20 7a  finity(pRight, z
19f60 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d  Aff[nConstraint]
19f70 29 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  )==SQLITE_AFF_NO
19f80 4e 45 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  NE.      ){.    
19f90 20 20 20 20 2f 2a 20 53 69 6e 63 65 20 74 68 65      /* Since the
19fa0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 74   comparison is t
19fb0 6f 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20 77  o be performed w
19fc0 69 74 68 20 6e 6f 20 63 6f 6e 76 65 72 73 69 6f  ith no conversio
19fd0 6e 73 20 61 70 70 6c 69 65 64 0a 20 20 20 20 20  ns applied.     
19fe0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 6f 70 65     ** to the ope
19ff0 72 61 6e 64 73 2c 20 73 65 74 20 74 68 65 20 61  rands, set the a
1a000 66 66 69 6e 69 74 79 20 74 6f 20 61 70 70 6c 79  ffinity to apply
1a010 20 74 6f 20 70 52 69 67 68 74 20 74 6f 20 0a 20   to pRight to . 
1a020 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45         ** SQLITE
1a030 5f 41 46 46 5f 4e 4f 4e 45 2e 20 20 2a 2f 0a 20  _AFF_NONE.  */. 
1a040 20 20 20 20 20 20 20 7a 41 66 66 5b 6e 43 6f 6e         zAff[nCon
1a050 73 74 72 61 69 6e 74 5d 20 3d 20 53 51 4c 49 54  straint] = SQLIT
1a060 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1a070 20 20 7d 0a 20 20 20 20 20 20 63 6f 64 65 41 70    }.      codeAp
1a080 70 6c 79 41 66 66 69 6e 69 74 79 28 70 50 61 72  plyAffinity(pPar
1a090 73 65 2c 20 72 65 67 42 61 73 65 2c 20 6e 45 71  se, regBase, nEq
1a0a0 2b 31 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20  +1, zAff);.     
1a0b0 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a   nConstraint++;.
1a0c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 6f      }..    /* To
1a0d0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 62 6f  p of the loop bo
1a0e0 64 79 20 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c  dy */.    pLevel
1a0f0 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56 64  ->p2 = sqlite3Vd
1a100 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
1a110 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1a120 69 66 20 74 68 65 20 69 6e 64 65 78 20 63 75 72  if the index cur
1a130 73 6f 72 20 69 73 20 70 61 73 74 20 74 68 65 20  sor is past the 
1a140 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
1a150 2e 20 2a 2f 0a 20 20 20 20 6f 70 20 3d 20 61 45  . */.    op = aE
1a160 6e 64 4f 70 5b 28 70 52 61 6e 67 65 45 6e 64 20  ndOp[(pRangeEnd 
1a170 7c 7c 20 6e 45 71 29 20 2a 20 28 31 20 2b 20 62  || nEq) * (1 + b
1a180 52 65 76 29 5d 3b 0a 20 20 20 20 74 65 73 74 63  Rev)];.    testc
1a190 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70  ase( op==OP_Noop
1a1a0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1a1b0 28 20 6f 70 3d 3d 4f 50 5f 49 64 78 47 45 20 29  ( op==OP_IdxGE )
1a1c0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1a1d0 6f 70 3d 3d 4f 50 5f 49 64 78 4c 54 20 29 3b 0a  op==OP_IdxLT );.
1a1e0 20 20 20 20 69 66 28 20 6f 70 21 3d 4f 50 5f 4e      if( op!=OP_N
1a1f0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  oop ){.      sql
1a200 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
1a210 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 61  , op, iIdxCur, a
1a220 64 64 72 4e 78 74 2c 20 72 65 67 42 61 73 65 2c  ddrNxt, regBase,
1a230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a240 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1a250 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 43 6f 6e 73  INT_TO_PTR(nCons
1a260 74 72 61 69 6e 74 29 2c 20 50 34 5f 49 4e 54 33  traint), P4_INT3
1a270 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
1a280 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c  3VdbeChangeP5(v,
1a290 20 65 6e 64 45 71 21 3d 62 52 65 76 20 3f 31 3a   endEq!=bRev ?1:
1a2a0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  0);.    }..    /
1a2b0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 69  * If there are i
1a2c0 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1a2d0 61 69 6e 74 73 2c 20 63 68 65 63 6b 20 74 68 61  aints, check tha
1a2e0 74 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20  t the value.    
1a2f0 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
1a300 63 6f 6c 75 6d 6e 20 74 68 61 74 20 74 68 65 20  column that the 
1a310 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 74 72  inequality contr
1a320 61 69 6e 73 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ains is not NULL
1a330 2e 0a 20 20 20 20 2a 2a 20 49 66 20 69 74 20 69  ..    ** If it i
1a340 73 2c 20 6a 75 6d 70 20 74 6f 20 74 68 65 20 6e  s, jump to the n
1a350 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ext iteration of
1a360 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a   the loop..    *
1a370 2f 0a 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74  /.    r1 = sqlit
1a380 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
1a390 72 73 65 29 3b 0a 20 20 20 20 74 65 73 74 63 61  rse);.    testca
1a3a0 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  se( pLevel->plan
1a3b0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
1a3c0 5f 42 54 4d 5f 4c 49 4d 49 54 20 29 3b 0a 20 20  _BTM_LIMIT );.  
1a3d0 20 20 74 65 73 74 63 61 73 65 28 20 70 4c 65 76    testcase( pLev
1a3e0 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1a3f0 20 26 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d   & WHERE_TOP_LIM
1a400 49 54 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  IT );.    if( pL
1a410 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
1a420 67 73 20 26 20 28 57 48 45 52 45 5f 42 54 4d 5f  gs & (WHERE_BTM_
1a430 4c 49 4d 49 54 7c 57 48 45 52 45 5f 54 4f 50 5f  LIMIT|WHERE_TOP_
1a440 4c 49 4d 49 54 29 20 29 7b 0a 20 20 20 20 20 20  LIMIT) ){.      
1a450 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a460 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  3(v, OP_Column, 
1a470 69 49 64 78 43 75 72 2c 20 6e 45 71 2c 20 72 31  iIdxCur, nEq, r1
1a480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a490 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
1a4a0 5f 49 73 4e 75 6c 6c 2c 20 72 31 2c 20 61 64 64  _IsNull, r1, add
1a4b0 72 43 6f 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  rCont);.    }.  
1a4c0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
1a4d0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20  TempReg(pParse, 
1a4e0 72 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 65  r1);..    /* See
1a4f0 6b 20 74 68 65 20 74 61 62 6c 65 20 63 75 72 73  k the table curs
1a500 6f 72 2c 20 69 66 20 72 65 71 75 69 72 65 64 20  or, if required 
1a510 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  */.    disableTe
1a520 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e 67  rm(pLevel, pRang
1a530 65 53 74 61 72 74 29 3b 0a 20 20 20 20 64 69 73  eStart);.    dis
1a540 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
1a550 20 70 52 61 6e 67 65 45 6e 64 29 3b 0a 20 20 20   pRangeEnd);.   
1a560 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
1a570 29 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 52  ){.      iRowidR
1a580 65 67 20 3d 20 69 52 65 6c 65 61 73 65 52 65 67  eg = iReleaseReg
1a590 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
1a5a0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
1a5b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1a5c0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64 78 52  ddOp2(v, OP_IdxR
1a5d0 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20 69  owid, iIdxCur, i
1a5e0 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 20  RowidReg);.     
1a5f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
1a600 65 53 74 6f 72 65 28 70 50 61 72 73 65 2c 20 69  eStore(pParse, i
1a610 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77 69 64 52  Cur, -1, iRowidR
1a620 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg);.      sqlit
1a630 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
1a640 4f 50 5f 53 65 65 6b 2c 20 69 43 75 72 2c 20 69  OP_Seek, iCur, i
1a650 52 6f 77 69 64 52 65 67 29 3b 20 20 2f 2a 20 44  RowidReg);  /* D
1a660 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f 0a  eferred seek */.
1a670 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
1a680 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
1a690 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
1a6a0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1a6b0 20 44 69 73 61 62 6c 65 20 0a 20 20 20 20 2a 2a   Disable .    **
1a6c0 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65   WHERE clause te
1a6d0 72 6d 73 20 6d 61 64 65 20 72 65 64 75 6e 64 61  rms made redunda
1a6e0 6e 74 20 62 79 20 74 68 65 20 69 6e 64 65 78 20  nt by the index 
1a6f0 72 61 6e 67 65 20 73 63 61 6e 2e 0a 20 20 20 20  range scan..    
1a700 2a 2f 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  */.    pLevel->o
1a710 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72  p = bRev ? OP_Pr
1a720 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20  ev : OP_Next;.  
1a730 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
1a740 49 64 78 43 75 72 3b 0a 20 20 7d 65 6c 73 65 0a  IdxCur;.  }else.
1a750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a760 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41  OMIT_OR_OPTIMIZA
1a770 54 49 4f 4e 0a 20 20 69 66 28 20 70 4c 65 76 65  TION.  if( pLeve
1a780 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
1a790 26 20 57 48 45 52 45 5f 4d 55 4c 54 49 5f 4f 52  & WHERE_MULTI_OR
1a7a0 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1a7b0 34 3a 20 20 54 77 6f 20 6f 72 20 6d 6f 72 65 20  4:  Two or more 
1a7c0 73 65 70 61 72 61 74 65 6c 79 20 69 6e 64 65 78  separately index
1a7d0 65 64 20 74 65 72 6d 73 20 63 6f 6e 6e 65 63 74  ed terms connect
1a7e0 65 64 20 62 79 20 4f 52 0a 20 20 20 20 2a 2a 0a  ed by OR.    **.
1a7f0 20 20 20 20 2a 2a 20 45 78 61 6d 70 6c 65 3a 0a      ** Example:.
1a800 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1a810 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
1a820 61 2c 62 2c 63 2c 64 29 3b 0a 20 20 20 20 2a 2a  a,b,c,d);.    **
1a830 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58 20     CREATE INDEX 
1a840 69 31 20 4f 4e 20 74 31 28 61 29 3b 0a 20 20 20  i1 ON t1(a);.   
1a850 20 2a 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44   **   CREATE IND
1a860 45 58 20 69 32 20 4f 4e 20 74 31 28 62 29 3b 0a  EX i2 ON t1(b);.
1a870 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54 45 20      **   CREATE 
1a880 49 4e 44 45 58 20 69 33 20 4f 4e 20 74 31 28 63  INDEX i3 ON t1(c
1a890 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1a8a0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1a8b0 20 74 31 20 57 48 45 52 45 20 61 3d 35 20 4f 52   t1 WHERE a=5 OR
1a8c0 20 62 3d 37 20 4f 52 20 28 63 3d 31 31 20 41 4e   b=7 OR (c=11 AN
1a8d0 44 20 64 3d 31 33 29 0a 20 20 20 20 2a 2a 0a 20  D d=13).    **. 
1a8e0 20 20 20 2a 2a 20 49 6e 20 74 68 65 20 65 78 61     ** In the exa
1a8f0 6d 70 6c 65 2c 20 74 68 65 72 65 20 61 72 65 20  mple, there are 
1a900 74 68 72 65 65 20 69 6e 64 65 78 65 64 20 74 65  three indexed te
1a910 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1a920 20 4f 52 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20   OR..    ** The 
1a930 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  top of the loop 
1a940 6c 6f 6f 6b 73 20 6c 69 6b 65 20 74 68 69 73 3a  looks like this:
1a950 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a960 20 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20          Null    
1a970 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
1a980 20 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72      # Zero the r
1a990 6f 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20  owset in reg 1. 
1a9a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1a9b0 6e 2c 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  n, for each inde
1a9c0 78 65 64 20 74 65 72 6d 2c 20 74 68 65 20 66 6f  xed term, the fo
1a9d0 6c 6c 6f 77 69 6e 67 2e 20 54 68 65 20 61 72 67  llowing. The arg
1a9e0 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 2a 2a  uments to.    **
1a9f0 20 52 6f 77 53 65 74 54 65 73 74 20 61 72 65 20   RowSetTest are 
1aa00 73 75 63 68 20 74 68 61 74 20 74 68 65 20 72 6f  such that the ro
1aa10 77 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65  wid of the curre
1aa20 6e 74 20 72 6f 77 20 69 73 20 69 6e 73 65 72 74  nt row is insert
1aa30 65 64 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74  ed.    ** into t
1aa40 68 65 20 52 6f 77 53 65 74 2e 20 49 66 20 69 74  he RowSet. If it
1aa50 20 69 73 20 61 6c 72 65 61 64 79 20 70 72 65 73   is already pres
1aa60 65 6e 74 2c 20 63 6f 6e 74 72 6f 6c 20 73 6b 69  ent, control ski
1aa70 70 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 47 6f  ps the.    ** Go
1aa80 73 75 62 20 6f 70 63 6f 64 65 20 61 6e 64 20 6a  sub opcode and j
1aa90 75 6d 70 73 20 73 74 72 61 69 67 68 74 20 74 6f  umps straight to
1aaa0 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
1aab0 74 65 64 20 62 79 20 57 68 65 72 65 45 6e 64 28  ted by WhereEnd(
1aac0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
1aad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
1aae0 68 65 72 65 42 65 67 69 6e 28 3c 74 65 72 6d 3e  hereBegin(<term>
1aaf0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ).    **        
1ab00 20 20 52 6f 77 53 65 74 54 65 73 74 20 20 20 20    RowSetTest    
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
1ab20 49 6e 73 65 72 74 20 72 6f 77 69 64 20 69 6e 74  Insert rowid int
1ab30 6f 20 72 6f 77 73 65 74 0a 20 20 20 20 2a 2a 20  o rowset.    ** 
1ab40 20 20 20 20 20 20 20 20 20 47 6f 73 75 62 20 20           Gosub  
1ab50 20 20 20 20 32 20 41 0a 20 20 20 20 2a 2a 20 20      2 A.    **  
1ab60 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 68 65        sqlite3Whe
1ab70 72 65 45 6e 64 28 29 0a 20 20 20 20 2a 2a 0a 20  reEnd().    **. 
1ab80 20 20 20 2a 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20     ** Following 
1ab90 74 68 65 20 61 62 6f 76 65 2c 20 63 6f 64 65 20  the above, code 
1aba0 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
1abb0 20 6c 6f 6f 70 2e 20 4c 61 62 65 6c 20 41 2c 20   loop. Label A, 
1abc0 74 68 65 20 74 61 72 67 65 74 0a 20 20 20 20 2a  the target.    *
1abd0 2a 20 6f 66 20 74 68 65 20 47 6f 73 75 62 20 61  * of the Gosub a
1abe0 62 6f 76 65 2c 20 6a 75 6d 70 73 20 74 6f 20 74  bove, jumps to t
1abf0 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 72  he instruction r
1ac00 69 67 68 74 20 61 66 74 65 72 20 74 68 65 20 47  ight after the G
1ac10 6f 74 6f 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oto..    **.    
1ac20 2a 2a 20 20 20 20 20 20 20 20 20 20 4e 75 6c 6c  **          Null
1ac30 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
1ac40 20 20 20 20 20 20 20 20 23 20 5a 65 72 6f 20 74          # Zero t
1ac50 68 65 20 72 6f 77 73 65 74 20 69 6e 20 72 65 67  he rowset in reg
1ac60 20 31 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   1.    **       
1ac70 20 20 20 47 6f 74 6f 20 20 20 20 20 20 20 42 20     Goto       B 
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1ac90 20 54 68 65 20 6c 6f 6f 70 20 69 73 20 66 69 6e   The loop is fin
1aca0 69 73 68 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  ished..    **.  
1acb0 20 20 2a 2a 20 20 20 20 20 20 20 41 3a 20 3c 6c    **       A: <l
1acc0 6f 6f 70 20 62 6f 64 79 3e 20 20 20 20 20 20 20  oop body>       
1acd0 20 20 20 20 20 20 20 20 20 20 23 20 52 65 74 75            # Retu
1ace0 72 6e 20 64 61 74 61 2c 20 77 68 61 74 65 76 65  rn data, whateve
1acf0 72 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  r..    **.    **
1ad00 20 20 20 20 20 20 20 20 20 20 52 65 74 75 72 6e            Return
1ad10 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
1ad20 20 20 20 20 20 20 23 20 4a 75 6d 70 20 62 61 63        # Jump bac
1ad30 6b 20 74 6f 20 74 68 65 20 47 6f 73 75 62 0a 20  k to the Gosub. 
1ad40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
1ad50 20 20 20 42 3a 20 3c 61 66 74 65 72 20 74 68 65     B: <after the
1ad60 20 6c 6f 6f 70 3e 0a 20 20 20 20 2a 2a 0a 20 20   loop>.    **.  
1ad70 20 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 43 6c    */.    WhereCl
1ad80 61 75 73 65 20 2a 70 4f 72 57 63 3b 20 20 20 20  ause *pOrWc;    
1ad90 2f 2a 20 54 68 65 20 4f 52 2d 63 6c 61 75 73 65  /* The OR-clause
1ada0 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
1adb0 20 73 75 62 74 65 72 6d 73 20 2a 2f 0a 20 20 20   subterms */.   
1adc0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 46 69 6e   WhereTerm *pFin
1add0 61 6c 3b 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  al;     /* Final
1ade0 20 73 75 62 74 65 72 6d 20 77 69 74 68 69 6e 20   subterm within 
1adf0 74 68 65 20 4f 52 2d 63 6c 61 75 73 65 2e 20 2a  the OR-clause. *
1ae00 2f 0a 20 20 20 20 53 72 63 4c 69 73 74 20 6f 6e  /.    SrcList on
1ae10 65 54 61 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  eTab;        /* 
1ae20 53 68 6f 72 74 65 6e 65 64 20 74 61 62 6c 65 20  Shortened table 
1ae30 6c 69 73 74 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  list */..    int
1ae40 20 72 65 67 52 65 74 75 72 6e 20 3d 20 2b 2b 70   regReturn = ++p
1ae50 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 20 20 20 20  Parse->nMem;    
1ae60 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1ae70 65 72 20 75 73 65 64 20 77 69 74 68 20 4f 50 5f  er used with OP_
1ae80 47 6f 73 75 62 20 2a 2f 0a 20 20 20 20 69 6e 74  Gosub */.    int
1ae90 20 72 65 67 52 6f 77 73 65 74 20 3d 20 30 3b 20   regRowset = 0; 
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74         /* Regist
1aec0 65 72 20 66 6f 72 20 52 6f 77 53 65 74 20 6f 62  er for RowSet ob
1aed0 6a 65 63 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ject */.    int 
1aee0 72 65 67 52 6f 77 69 64 20 3d 20 30 3b 20 20 20  regRowid = 0;   
1aef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af00 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65        /* Registe
1af10 72 20 68 6f 6c 64 69 6e 67 20 72 6f 77 69 64 20  r holding rowid 
1af20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 6f 6f 70  */.    int iLoop
1af30 42 6f 64 79 20 3d 20 73 71 6c 69 74 65 33 56 64  Body = sqlite3Vd
1af40 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 20  beMakeLabel(v); 
1af50 20 2f 2a 20 53 74 61 72 74 20 6f 66 20 6c 6f 6f   /* Start of loo
1af60 70 20 62 6f 64 79 20 2a 2f 0a 20 20 20 20 69 6e  p body */.    in
1af70 74 20 69 52 65 74 49 6e 69 74 3b 20 20 20 20 20  t iRetInit;     
1af80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af90 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
1afa0 73 73 20 6f 66 20 72 65 67 52 65 74 75 72 6e 20  ss of regReturn 
1afb0 69 6e 69 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  init */.    int 
1afc0 69 69 3b 0a 20 20 20 0a 20 20 20 20 70 54 65 72  ii;.   .    pTer
1afd0 6d 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  m = pLevel->plan
1afe0 2e 75 2e 70 54 65 72 6d 3b 0a 20 20 20 20 61 73  .u.pTerm;.    as
1aff0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
1b000 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
1b010 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d  erm->eOperator==
1b020 57 4f 5f 4f 52 20 29 3b 0a 20 20 20 20 61 73 73  WO_OR );.    ass
1b030 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 77 74 46  ert( (pTerm->wtF
1b040 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 49 4e  lags & TERM_ORIN
1b050 46 4f 29 21 3d 30 20 29 3b 0a 20 20 20 20 70 4f  FO)!=0 );.    pO
1b060 72 57 63 20 3d 20 26 70 54 65 72 6d 2d 3e 75 2e  rWc = &pTerm->u.
1b070 70 4f 72 49 6e 66 6f 2d 3e 77 63 3b 0a 20 20 20  pOrInfo->wc;.   
1b080 20 70 46 69 6e 61 6c 20 3d 20 26 70 4f 72 57 63   pFinal = &pOrWc
1b090 2d 3e 61 5b 70 4f 72 57 63 2d 3e 6e 54 65 72 6d  ->a[pOrWc->nTerm
1b0a0 2d 31 5d 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  -1];..    /* Set
1b0b0 20 75 70 20 61 20 53 72 63 4c 69 73 74 20 63 6f   up a SrcList co
1b0c0 6e 74 61 69 6e 69 6e 67 20 6a 75 73 74 20 74 68  ntaining just th
1b0d0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 73 63  e table being sc
1b0e0 61 6e 6e 65 64 20 62 79 20 74 68 69 73 20 6c 6f  anned by this lo
1b0f0 6f 70 2e 20 2a 2f 0a 20 20 20 20 6f 6e 65 54 61  op. */.    oneTa
1b100 62 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20  b.nSrc = 1;.    
1b110 6f 6e 65 54 61 62 2e 6e 41 6c 6c 6f 63 20 3d 20  oneTab.nAlloc = 
1b120 31 3b 0a 20 20 20 20 6f 6e 65 54 61 62 2e 61 5b  1;.    oneTab.a[
1b130 30 5d 20 3d 20 2a 70 54 61 62 49 74 65 6d 3b 0a  0] = *pTabItem;.
1b140 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
1b150 7a 65 20 74 68 65 20 72 6f 77 73 65 74 20 72 65  ze the rowset re
1b160 67 69 73 74 65 72 20 74 6f 20 63 6f 6e 74 61 69  gister to contai
1b170 6e 20 4e 55 4c 4c 2e 20 41 6e 20 53 51 4c 20 4e  n NULL. An SQL N
1b180 55 4c 4c 20 69 73 20 0a 20 20 20 20 2a 2a 20 65  ULL is .    ** e
1b190 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 61 6e 20  quivalent to an 
1b1a0 65 6d 70 74 79 20 72 6f 77 73 65 74 2e 0a 20 20  empty rowset..  
1b1b0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f    **.    ** Also
1b1c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 72 65 67 52   initialize regR
1b1d0 65 74 75 72 6e 20 74 6f 20 63 6f 6e 74 61 69 6e  eturn to contain
1b1e0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
1b1f0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
1b200 0a 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74  .    ** immediat
1b210 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
1b220 65 20 4f 50 5f 52 65 74 75 72 6e 20 61 74 20 74  e OP_Return at t
1b230 68 65 20 62 6f 74 74 6f 6d 20 6f 66 20 74 68 65  he bottom of the
1b240 20 6c 6f 6f 70 2e 20 54 68 69 73 0a 20 20 20 20   loop. This.    
1b250 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 20 69  ** is required i
1b260 6e 20 61 20 66 65 77 20 6f 62 73 63 75 72 65 20  n a few obscure 
1b270 4c 45 46 54 20 4a 4f 49 4e 20 63 61 73 65 73 20  LEFT JOIN cases 
1b280 77 68 65 72 65 20 63 6f 6e 74 72 6f 6c 20 6a 75  where control ju
1b290 6d 70 73 0a 20 20 20 20 2a 2a 20 6f 76 65 72 20  mps.    ** over 
1b2a0 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c  the top of the l
1b2b0 6f 6f 70 20 69 6e 74 6f 20 74 68 65 20 62 6f 64  oop into the bod
1b2c0 79 20 6f 66 20 69 74 2e 20 49 6e 20 74 68 69 73  y of it. In this
1b2d0 20 63 61 73 65 20 74 68 65 20 0a 20 20 20 20 2a   case the .    *
1b2e0 2a 20 63 6f 72 72 65 63 74 20 72 65 73 70 6f 6e  * correct respon
1b2f0 73 65 20 66 6f 72 20 74 68 65 20 65 6e 64 2d 6f  se for the end-o
1b300 66 2d 6c 6f 6f 70 20 63 6f 64 65 20 28 74 68 65  f-loop code (the
1b310 20 4f 50 5f 52 65 74 75 72 6e 29 20 69 73 20 74   OP_Return) is t
1b320 6f 20 0a 20 20 20 20 2a 2a 20 66 61 6c 6c 20 74  o .    ** fall t
1b330 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 6e 65  hrough to the ne
1b340 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20  xt instruction, 
1b350 6a 75 73 74 20 61 73 20 61 6e 20 4f 50 5f 4e 65  just as an OP_Ne
1b360 78 74 20 64 6f 65 73 20 69 66 0a 20 20 20 20 2a  xt does if.    *
1b370 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 75  * called on an u
1b380 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 63 75 72  ninitialized cur
1b390 73 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  sor..    */.    
1b3a0 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67 73 20  if( (wctrlFlags 
1b3b0 26 20 57 48 45 52 45 5f 44 55 50 4c 49 43 41 54  & WHERE_DUPLICAT
1b3c0 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a 20 20 20  ES_OK)==0 ){.   
1b3d0 20 20 20 72 65 67 52 6f 77 73 65 74 20 3d 20 2b     regRowset = +
1b3e0 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20  +pParse->nMem;. 
1b3f0 20 20 20 20 20 72 65 67 52 6f 77 69 64 20 3d 20       regRowid = 
1b400 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  ++pParse->nMem;.
1b410 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1b420 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75  eAddOp2(v, OP_Nu
1b430 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73 65 74  ll, 0, regRowset
1b440 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 52 65  );.    }.    iRe
1b450 74 49 6e 69 74 20 3d 20 73 71 6c 69 74 65 33 56  tInit = sqlite3V
1b460 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1b470 49 6e 74 65 67 65 72 2c 20 30 2c 20 72 65 67 52  Integer, 0, regR
1b480 65 74 75 72 6e 29 3b 0a 0a 20 20 20 20 66 6f 72  eturn);..    for
1b490 28 69 69 3d 30 3b 20 69 69 3c 70 4f 72 57 63 2d  (ii=0; ii<pOrWc-
1b4a0 3e 6e 54 65 72 6d 3b 20 69 69 2b 2b 29 7b 0a 20  >nTerm; ii++){. 
1b4b0 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
1b4c0 70 4f 72 54 65 72 6d 20 3d 20 26 70 4f 72 57 63  pOrTerm = &pOrWc
1b4d0 2d 3e 61 5b 69 69 5d 3b 0a 20 20 20 20 20 20 69  ->a[ii];.      i
1b4e0 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
1b4f0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 7c 7c 20  Cursor==iCur || 
1b500 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
1b510 6f 72 3d 3d 57 4f 5f 41 4e 44 20 29 7b 0a 20 20  or==WO_AND ){.  
1b520 20 20 20 20 20 20 57 68 65 72 65 49 6e 66 6f 20        WhereInfo 
1b530 2a 70 53 75 62 57 49 6e 66 6f 3b 20 20 20 20 20  *pSubWInfo;     
1b540 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 66 6f 72       /* Info for
1b550 20 73 69 6e 67 6c 65 20 4f 52 2d 74 65 72 6d 20   single OR-term 
1b560 73 63 61 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  scan */.        
1b570 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
1b580 74 61 62 6c 65 20 65 6e 74 72 69 65 73 20 74 68  table entries th
1b590 61 74 20 6d 61 74 63 68 20 74 65 72 6d 20 70 4f  at match term pO
1b5a0 72 54 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  rTerm. */.      
1b5b0 20 20 70 53 75 62 57 49 6e 66 6f 20 3d 20 73 71    pSubWInfo = sq
1b5c0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
1b5d0 70 50 61 72 73 65 2c 20 26 6f 6e 65 54 61 62 2c  pParse, &oneTab,
1b5e0 20 70 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2c   pOrTerm->pExpr,
1b5f0 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b600 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
1b610 45 5f 4f 4d 49 54 5f 4f 50 45 4e 20 7c 20 57 48  E_OMIT_OPEN | WH
1b620 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 20 7c  ERE_OMIT_CLOSE |
1b630 20 57 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42   WHERE_FORCE_TAB
1b640 4c 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  LE);.        if(
1b650 20 70 53 75 62 57 49 6e 66 6f 20 29 7b 0a 20 20   pSubWInfo ){.  
1b660 20 20 20 20 20 20 20 20 69 66 28 20 28 77 63 74          if( (wct
1b670 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  rlFlags & WHERE_
1b680 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b 29 3d 3d  DUPLICATES_OK)==
1b690 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
1b6a0 20 69 6e 74 20 69 53 65 74 20 3d 20 28 28 69 69   int iSet = ((ii
1b6b0 3d 3d 70 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31  ==pOrWc->nTerm-1
1b6c0 29 3f 2d 31 3a 69 69 29 3b 0a 20 20 20 20 20 20  )?-1:ii);.      
1b6d0 20 20 20 20 20 20 69 6e 74 20 72 3b 0a 20 20 20        int r;.   
1b6e0 20 20 20 20 20 20 20 20 20 72 20 3d 20 73 71 6c           r = sql
1b6f0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
1b700 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 54  olumn(pParse, pT
1b710 61 62 49 74 65 6d 2d 3e 70 54 61 62 2c 20 2d 31  abItem->pTab, -1
1b720 2c 20 69 43 75 72 2c 20 0a 20 20 20 20 20 20 20  , iCur, .       
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b750 20 20 72 65 67 52 6f 77 69 64 2c 20 30 29 3b 0a    regRowid, 0);.
1b760 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b770 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
1b780 20 4f 50 5f 52 6f 77 53 65 74 54 65 73 74 2c 20   OP_RowSetTest, 
1b790 72 65 67 52 6f 77 73 65 74 2c 0a 20 20 20 20 20  regRowset,.     
1b7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1b7c0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1b7d0 76 29 2b 32 2c 0a 20 20 20 20 20 20 20 20 20 20  v)+2,.          
1b7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7f0 20 20 20 20 72 2c 20 53 51 4c 49 54 45 5f 49 4e      r, SQLITE_IN
1b800 54 5f 54 4f 5f 50 54 52 28 69 53 65 74 29 2c 20  T_TO_PTR(iSet), 
1b810 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 20 20 20  P4_INT32);.     
1b820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1b830 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b840 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
1b850 72 65 67 52 65 74 75 72 6e 2c 20 69 4c 6f 6f 70  regReturn, iLoop
1b860 42 6f 64 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  Body);..        
1b870 20 20 2f 2a 20 46 69 6e 69 73 68 20 74 68 65 20    /* Finish the 
1b880 6c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62  loop through tab
1b890 6c 65 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  le entries that 
1b8a0 6d 61 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65  match term pOrTe
1b8b0 72 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  rm. */.         
1b8c0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1b8d0 28 70 53 75 62 57 49 6e 66 6f 29 3b 0a 20 20 20  (pSubWInfo);.   
1b8e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1b8f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1b900 56 64 62 65 43 68 61 6e 67 65 50 31 28 76 2c 20  VdbeChangeP1(v, 
1b910 69 52 65 74 49 6e 69 74 2c 20 73 71 6c 69 74 65  iRetInit, sqlite
1b920 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
1b930 28 76 29 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c  (v));.    /* sql
1b940 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1b950 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65  , OP_Null, 0, re
1b960 67 52 6f 77 73 65 74 29 3b 20 2a 2f 0a 20 20 20  gRowset); */.   
1b970 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1b980 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
1b990 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42 72  , pLevel->addrBr
1b9a0 6b 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  k);.    sqlite3V
1b9b0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
1b9c0 76 2c 20 69 4c 6f 6f 70 42 6f 64 79 29 3b 0a 0a  v, iLoopBody);..
1b9d0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
1b9e0 20 4f 50 5f 52 65 74 75 72 6e 3b 0a 20 20 20 20   OP_Return;.    
1b9f0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 72 65 67  pLevel->p1 = reg
1ba00 52 65 74 75 72 6e 3b 0a 20 20 20 20 64 69 73 61  Return;.    disa
1ba10 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
1ba20 70 54 65 72 6d 29 3b 0a 20 20 7d 65 6c 73 65 0a  pTerm);.  }else.
1ba30 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ba40 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
1ba50 41 54 49 4f 4e 20 2a 2f 0a 0a 20 20 7b 0a 20 20  ATION */..  {.  
1ba60 20 20 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68    /* Case 5:  Th
1ba70 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65  ere is no usable
1ba80 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74   index.  We must
1ba90 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20   do a complete. 
1baa0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
1bab0 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
1bac0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a  e table..    */.
1bad0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1bae0 20 75 38 20 61 53 74 65 70 5b 5d 20 3d 20 7b 20   u8 aStep[] = { 
1baf0 4f 50 5f 4e 65 78 74 2c 20 4f 50 5f 50 72 65 76  OP_Next, OP_Prev
1bb00 20 7d 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63   };.    static c
1bb10 6f 6e 73 74 20 75 38 20 61 53 74 61 72 74 5b 5d  onst u8 aStart[]
1bb20 20 3d 20 7b 20 4f 50 5f 52 65 77 69 6e 64 2c 20   = { OP_Rewind, 
1bb30 4f 50 5f 4c 61 73 74 20 7d 3b 0a 20 20 20 20 61  OP_Last };.    a
1bb40 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30 20 7c  ssert( bRev==0 |
1bb50 7c 20 62 52 65 76 3d 3d 31 20 29 3b 0a 20 20 20  | bRev==1 );.   
1bb60 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
1bb70 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 65  le==0 );.    pLe
1bb80 76 65 6c 2d 3e 6f 70 20 3d 20 61 53 74 65 70 5b  vel->op = aStep[
1bb90 62 52 65 76 5d 3b 0a 20 20 20 20 70 4c 65 76 65  bRev];.    pLeve
1bba0 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
1bbb0 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31    pLevel->p2 = 1
1bbc0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   + sqlite3VdbeAd
1bbd0 64 4f 70 32 28 76 2c 20 61 53 74 61 72 74 5b 62  dOp2(v, aStart[b
1bbe0 52 65 76 5d 2c 20 69 43 75 72 2c 20 61 64 64 72  Rev], iCur, addr
1bbf0 42 72 6b 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Brk);.    pLevel
1bc00 2d 3e 70 35 20 3d 20 53 51 4c 49 54 45 5f 53 54  ->p5 = SQLITE_ST
1bc10 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
1bc20 4e 5f 53 54 45 50 3b 0a 20 20 7d 0a 20 20 6e 6f  N_STEP;.  }.  no
1bc30 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
1bc40 73 6b 28 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74  sk(pWC->pMaskSet
1bc50 2c 20 69 43 75 72 29 3b 0a 0a 20 20 2f 2a 20 49  , iCur);..  /* I
1bc60 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65  nsert code to te
1bc70 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72  st every subexpr
1bc80 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20  ession that can 
1bc90 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20  be completely.  
1bca0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
1bcb0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
1bcc0 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 2a  t of tables..  *
1bcd0 2f 0a 20 20 6b 20 3d 20 30 3b 0a 20 20 66 6f 72  /.  k = 0;.  for
1bce0 28 70 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a  (pTerm=pWC->a, j
1bcf0 3d 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a 3e 30  =pWC->nTerm; j>0
1bd00 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j--, pTerm++){
1bd10 0a 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20  .    Expr *pE;. 
1bd20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65     testcase( pTe
1bd30 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45  rm->wtFlags & TE
1bd40 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20 20  RM_VIRTUAL );.  
1bd50 20 20 74 65 73 74 63 61 73 65 28 20 70 54 65 72    testcase( pTer
1bd60 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52  m->wtFlags & TER
1bd70 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 69  M_CODED );.    i
1bd80 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1bd90 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
1bda0 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
1bdb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1bdc0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
1bdd0 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
1bde0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1bdf0 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70     pE = pTerm->p
1be00 45 78 70 72 3b 0a 20 20 20 20 61 73 73 65 72 74  Expr;.    assert
1be10 28 20 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( pE!=0 );.    i
1be20 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
1be30 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
1be40 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
1be50 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
1be60 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
1be70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78   }.    sqlite3Ex
1be80 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
1be90 2c 20 70 45 2c 20 61 64 64 72 43 6f 6e 74 2c 20  , pE, addrCont, 
1bea0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1beb0 4c 29 3b 0a 20 20 20 20 6b 20 3d 20 31 3b 0a 20  L);.    k = 1;. 
1bec0 20 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67     pTerm->wtFlag
1bed0 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
1bee0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6f 72 20 61  .  }..  /* For a
1bef0 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
1bf00 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
1bf10 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
1bf20 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
1bf30 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
1bf40 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69 67 68   row of the righ
1bf50 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61 74 63  t table has matc
1bf60 68 65 64 20 74 68 65 20 6c 65 66 74 20 74 61 62  hed the left tab
1bf70 6c 65 2e 20 20 0a 20 20 2a 2f 0a 20 20 69 66 28  le.  .  */.  if(
1bf80 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1bf90 69 6e 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  in ){.    pLevel
1bfa0 2d 3e 61 64 64 72 46 69 72 73 74 20 3d 20 73 71  ->addrFirst = sq
1bfb0 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1bfc0 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71 6c  Addr(v);.    sql
1bfd0 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1bfe0 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
1bff0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
1c000 69 6e 29 3b 0a 20 20 20 20 56 64 62 65 43 6f 6d  in);.    VdbeCom
1c010 6d 65 6e 74 28 28 76 2c 20 22 72 65 63 6f 72 64  ment((v, "record
1c020 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22 29   LEFT JOIN hit")
1c030 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
1c040 70 72 43 61 63 68 65 43 6c 65 61 72 28 70 50 61  prCacheClear(pPa
1c050 72 73 65 29 3b 0a 20 20 20 20 66 6f 72 28 70 54  rse);.    for(pT
1c060 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 30 3b  erm=pWC->a, j=0;
1c070 20 6a 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 6a   j<pWC->nTerm; j
1c080 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
1c090 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 54      testcase( pT
1c0a0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 54  erm->wtFlags & T
1c0b0 45 52 4d 5f 56 49 52 54 55 41 4c 20 29 3b 0a 20  ERM_VIRTUAL );. 
1c0c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
1c0d0 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20  Term->wtFlags & 
1c0e0 54 45 52 4d 5f 43 4f 44 45 44 20 29 3b 0a 20 20  TERM_CODED );.  
1c0f0 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 77      if( pTerm->w
1c100 74 46 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56  tFlags & (TERM_V
1c110 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45  IRTUAL|TERM_CODE
1c120 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  D) ) continue;. 
1c130 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
1c140 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74  >prereqAll & not
1c150 52 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74  Ready)!=0 ) cont
1c160 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
1c170 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
1c180 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1c190 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
1c1a0 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70  rse, pTerm->pExp
1c1b0 72 2c 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c  r, addrCont, SQL
1c1c0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
1c1d0 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 77 74  .      pTerm->wt
1c1e0 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f  Flags |= TERM_CO
1c1f0 44 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  DED;.    }.  }. 
1c200 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1c210 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 69  empReg(pParse, i
1c220 52 65 6c 65 61 73 65 52 65 67 29 3b 0a 0a 20 20  ReleaseReg);..  
1c230 72 65 74 75 72 6e 20 6e 6f 74 52 65 61 64 79 3b  return notReady;
1c240 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
1c250 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
1c260 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
1c270 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
1c280 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
1c290 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
1c2a0 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
1c2b0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1c2c0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1c2d0 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
1c2e0 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
1c2f0 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
1c300 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
1c310 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
1c320 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
1c330 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
1c340 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
1c350 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
1c360 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
1c370 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
1c380 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
1c390 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
1c3a0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1c3b0 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
1c3c0 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
1c3d0 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
1c3e0 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
1c3f0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
1c400 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
1c410 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
1c420 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
1c430 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 57 68  (sqlite3 *db, Wh
1c440 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
1c450 7b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f 20 29  {.  if( pWInfo )
1c460 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1c470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 49 6e   for(i=0; i<pWIn
1c480 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29  fo->nLevel; i++)
1c490 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
1c4a0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 6e 66  index_info *pInf
1c4b0 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d  o = pWInfo->a[i]
1c4c0 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  .pIdxInfo;.     
1c4d0 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a 20 20   if( pInfo ){.  
1c4e0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
1c4f0 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72   pInfo->needToFr
1c500 65 65 49 64 78 53 74 72 3d 3d 30 20 7c 7c 20 64  eeIdxStr==0 || d
1c510 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
1c520 29 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ); */.        if
1c530 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
1c540 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20 20 20  reeIdxStr ){.   
1c550 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1c560 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74  ree(pInfo->idxSt
1c570 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1c580 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
1c590 72 65 65 28 64 62 2c 20 70 49 6e 66 6f 29 3b 0a  ree(db, pInfo);.
1c5a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1c5b0 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
1c5c0 61 72 28 70 57 49 6e 66 6f 2d 3e 70 57 43 29 3b  ar(pWInfo->pWC);
1c5d0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
1c5e0 65 65 28 64 62 2c 20 70 57 49 6e 66 6f 29 3b 0a  ee(db, pWInfo);.
1c5f0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65    }.}.../*.** Ge
1c600 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69 6e  nerate the begin
1c610 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ning of the loop
1c620 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45 20   used for WHERE 
1c630 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
1c640 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  g..** The return
1c650 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e   value is a poin
1c660 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65  ter to an opaque
1c670 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
1c680 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f  contains.** info
1c690 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74  rmation needed t
1c6a0 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20  o terminate the 
1c6b0 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68  loop.  Later, th
1c6c0 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  e calling routin
1c6d0 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f  e.** should invo
1c6e0 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  ke sqlite3WhereE
1c6f0 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72 65  nd() with the re
1c700 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
1c710 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
1c720 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c  n order to compl
1c730 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ete the WHERE cl
1c740 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
1c750 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1c760 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20  or occurs, this 
1c770 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1c780 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  NULL..**.** The 
1c790 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74 6f  basic idea is to
1c7a0 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f   do a nested loo
1c7b0 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20  p, one loop for 
1c7c0 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a  each table in.**
1c7d0 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
1c7e0 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28   of a select.  (
1c7f0 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41 54  INSERT and UPDAT
1c800 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  E statements are
1c810 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20   the.** same as 
1c820 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e  a SELECT with on
1c830 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c  ly a single tabl
1c840 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
1c850 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65  ause.)  For.** e
1c860 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53  xample, if the S
1c870 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a  QL is this:.**.*
1c880 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a  *       SELECT *
1c890 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33   FROM t1, t2, t3
1c8a0 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a   WHERE ...;.**.*
1c8b0 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20  * Then the code 
1c8c0 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e  generated is con
1c8d0 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74  ceptually like t
1c8e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
1c8f0 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
1c900 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20   row1 in t1 do  
1c910 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
1c920 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
1c930 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20     foreach row2 
1c940 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d  in t2 do      |-
1c950 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
1c960 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20  eBegin().**     
1c970 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
1c980 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a  3 in t3 do   /.*
1c990 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e  *            ...
1c9a0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64  .**          end
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c9c0 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67       \    Code g
1c9d0 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20  enerated.**     
1c9e0 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
1c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d                |-
1ca00 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  - by sqlite3Wher
1ca10 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65  eEnd().**      e
1ca20 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
1ca30 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a             /.**.
1ca40 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
1ca50 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f 74   loops might not
1ca60 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74 68   be nested in th
1ca70 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68  e order in which
1ca80 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72 20   they.** appear 
1ca90 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
1caa0 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65 6e  se if a differen
1cab0 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74 65  t order is bette
1cac0 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a  r able to make.*
1cad0 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73  * use of indices
1cae0 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68 61  .  Note also tha
1caf0 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f 70  t when the IN op
1cb00 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20 69  erator appears i
1cb10 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20 63  n.** the WHERE c
1cb20 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74 20  lause, it might 
1cb30 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74 69  result in additi
1cb40 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f 70  onal nested loop
1cb50 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e  s for.** scannin
1cb60 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76 61  g through all va
1cb70 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67 68  lues on the righ
1cb80 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
1cb90 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  he IN..**.** The
1cba0 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
1cbb0 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
1cbc0 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
1cbd0 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
1cbe0 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
1cbf0 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
1cc00 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
1cc10 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
1cc20 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
1cc30 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
1cc40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
1cc50 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
1cc60 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
1cc70 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
1cc80 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
1cc90 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
1cca0 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
1ccb0 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
1ccc0 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
1ccd0 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
1cce0 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
1ccf0 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
1cd00 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
1cd10 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
1cd20 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
1cd30 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
1cd40 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
1cd50 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
1cd60 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
1cd70 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
1cd80 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
1cd90 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
1cda0 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
1cdb0 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
1cdc0 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1cdd0 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
1cde0 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
1cdf0 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
1ce00 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
1ce10 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
1ce20 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
1ce30 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
1ce40 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
1ce50 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
1ce60 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
1ce70 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
1ce80 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
1ce90 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
1cea0 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
1ceb0 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
1cec0 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
1ced0 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
1cee0 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
1cef0 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
1cf00 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
1cf10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
1cf20 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
1cf30 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
1cf40 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
1cf50 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
1cf60 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
1cf70 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
1cf80 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
1cf90 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
1cfa0 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
1cfb0 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
1cfc0 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
1cfd0 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
1cfe0 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
1cff0 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
1d000 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
1d010 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
1d020 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
1d030 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
1d040 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
1d050 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
1d060 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
1d070 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
1d080 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
1d090 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
1d0a0 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
1d0b0 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
1d0c0 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
1d0d0 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
1d0e0 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
1d0f0 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
1d100 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
1d110 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
1d120 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
1d130 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
1d140 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
1d150 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
1d160 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
1d170 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
1d180 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
1d190 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
1d1a0 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
1d1b0 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
1d1c0 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
1d1d0 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
1d1e0 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
1d1f0 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
1d200 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
1d210 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
1d220 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
1d230 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
1d240 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
1d250 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
1d260 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
1d270 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
1d280 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
1d290 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
1d2a0 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
1d2b0 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
1d2c0 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
1d2d0 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
1d2e0 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
1d2f0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
1d300 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
1d310 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
1d320 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
1d330 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
1d340 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
1d350 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
1d360 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
1d370 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
1d380 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
1d390 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
1d3a0 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
1d3b0 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
1d3c0 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
1d3d0 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
1d3e0 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
1d3f0 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
1d400 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
1d410 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
1d420 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
1d430 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
1d440 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
1d450 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
1d460 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
1d470 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
1d480 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
1d490 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
1d4a0 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
1d4b0 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
1d4c0 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
1d4d0 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
1d4e0 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
1d4f0 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
1d500 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
1d510 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
1d520 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
1d530 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
1d540 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
1d550 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
1d560 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
1d570 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
1d580 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
1d590 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
1d5a0 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
1d5b0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
1d5c0 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
1d5d0 2a 2a 70 70 4f 72 64 65 72 42 79 2c 20 2f 2a 20  **ppOrderBy, /* 
1d5e0 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
1d5f0 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  se, or NULL */. 
1d600 20 75 31 36 20 77 63 74 72 6c 46 6c 61 67 73 20   u16 wctrlFlags 
1d610 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
1d620 20 74 68 65 20 57 48 45 52 45 5f 2a 20 66 6c 61   the WHERE_* fla
1d630 67 73 20 64 65 66 69 6e 65 64 20 69 6e 20 73 71  gs defined in sq
1d640 6c 69 74 65 49 6e 74 2e 68 20 2a 2f 0a 29 7b 0a  liteInt.h */.){.
1d650 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
1d660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d670 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
1d680 20 20 69 6e 74 20 6e 42 79 74 65 57 49 6e 66 6f    int nByteWInfo
1d690 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
1d6a0 4e 75 6d 2e 20 62 79 74 65 73 20 61 6c 6c 6f 63  Num. bytes alloc
1d6b0 61 74 65 64 20 66 6f 72 20 57 68 65 72 65 49 6e  ated for WhereIn
1d6c0 66 6f 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 57  fo struct */.  W
1d6d0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
1d6e0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c  ;         /* Wil
1d6f0 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74  l become the ret
1d700 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69  urn value of thi
1d710 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  s function */.  
1d720 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1d730 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68  ->pVdbe;   /* Th
1d740 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61  e virtual databa
1d750 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 42  se engine */.  B
1d760 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b  itmask notReady;
1d770 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
1d780 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
1d790 74 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64  t yet positioned
1d7a0 20 2a 2f 0a 20 20 57 68 65 72 65 4d 61 73 6b 53   */.  WhereMaskS
1d7b0 65 74 20 2a 70 4d 61 73 6b 53 65 74 3b 20 20 20  et *pMaskSet;   
1d7c0 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
1d7d0 6f 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20  on mask set */. 
1d7e0 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57   WhereClause *pW
1d7f0 43 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C;              
1d800 20 2f 2a 20 44 65 63 6f 6d 70 6f 73 69 74 69 6f   /* Decompositio
1d810 6e 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  n of the WHERE c
1d820 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
1d830 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1d840 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20  pTabItem;  /* A 
1d850 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f  single entry fro
1d860 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20  m pTabList */.  
1d870 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
1d880 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  el;             
1d890 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65  /* A single leve
1d8a0 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20  l in the pWInfo 
1d8b0 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46  list */.  int iF
1d8c0 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  rom;            
1d8d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
1d8e0 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63  st unused FROM c
1d8f0 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f  lause element */
1d900 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b  .  int andFlags;
1d910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d920 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74   AND-ed combinat
1d930 69 6f 6e 20 6f 66 20 61 6c 6c 20 70 57 43 2d 3e  ion of all pWC->
1d940 61 5b 5d 2e 77 74 46 6c 61 67 73 20 2a 2f 0a 20  a[].wtFlags */. 
1d950 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
1d960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1d970 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1d980 6f 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20  on */..  /* The 
1d990 6e 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73  number of tables
1d9a0 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
1d9b0 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
1d9c0 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
1d9d0 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
1d9e0 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69  itmask .  */.  i
1d9f0 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
1da00 63 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c  c>BMS ){.    sql
1da10 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
1da20 72 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64  rse, "at most %d
1da30 20 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69   tables in a joi
1da40 6e 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65  n", BMS);.    re
1da50 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1da60 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69  * Allocate and i
1da70 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68  nitialize the Wh
1da80 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ereInfo structur
1da90 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f  e that will beco
1daa0 6d 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75  me the.  ** retu
1dab0 72 6e 20 76 61 6c 75 65 2e 20 41 20 73 69 6e 67  rn value. A sing
1dac0 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  le allocation is
1dad0 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   used to store t
1dae0 68 65 20 57 68 65 72 65 49 6e 66 6f 0a 20 20 2a  he WhereInfo.  *
1daf0 2a 20 73 74 72 75 63 74 2c 20 74 68 65 20 63 6f  * struct, the co
1db00 6e 74 65 6e 74 73 20 6f 66 20 57 68 65 72 65 49  ntents of WhereI
1db10 6e 66 6f 2e 61 5b 5d 2c 20 74 68 65 20 57 68 65  nfo.a[], the Whe
1db20 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1db30 72 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  re.  ** and the 
1db40 57 68 65 72 65 4d 61 73 6b 53 65 74 20 73 74 72  WhereMaskSet str
1db50 75 63 74 75 72 65 2e 20 53 69 6e 63 65 20 57 68  ucture. Since Wh
1db60 65 72 65 43 6c 61 75 73 65 20 63 6f 6e 74 61 69  ereClause contai
1db70 6e 73 20 61 6e 20 38 2d 62 79 74 65 0a 20 20 2a  ns an 8-byte.  *
1db80 2a 20 66 69 65 6c 64 20 28 74 79 70 65 20 42 69  * field (type Bi
1db90 74 6d 61 73 6b 29 20 69 74 20 6d 75 73 74 20 62  tmask) it must b
1dba0 65 20 61 6c 69 67 6e 65 64 20 6f 6e 20 61 6e 20  e aligned on an 
1dbb0 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 20  8-byte boundary 
1dbc0 6f 6e 0a 20 20 2a 2a 20 73 6f 6d 65 20 61 72 63  on.  ** some arc
1dbd0 68 69 74 65 63 74 75 72 65 73 2e 20 48 65 6e 63  hitectures. Henc
1dbe0 65 20 74 68 65 20 52 4f 55 4e 44 38 28 29 20 62  e the ROUND8() b
1dbf0 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 64 62 20  elow..  */.  db 
1dc00 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
1dc10 6e 42 79 74 65 57 49 6e 66 6f 20 3d 20 52 4f 55  nByteWInfo = ROU
1dc20 4e 44 38 28 73 69 7a 65 6f 66 28 57 68 65 72 65  ND8(sizeof(Where
1dc30 49 6e 66 6f 29 2b 28 70 54 61 62 4c 69 73 74 2d  Info)+(pTabList-
1dc40 3e 6e 53 72 63 2d 31 29 2a 73 69 7a 65 6f 66 28  >nSrc-1)*sizeof(
1dc50 57 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  WhereLevel));.  
1dc60 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  pWInfo = sqlite3
1dc70 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
1dc80 20 0a 20 20 20 20 20 20 6e 42 79 74 65 57 49 6e   .      nByteWIn
1dc90 66 6f 20 2b 20 0a 20 20 20 20 20 20 73 69 7a 65  fo + .      size
1dca0 6f 66 28 57 68 65 72 65 43 6c 61 75 73 65 29 20  of(WhereClause) 
1dcb0 2b 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57  +.      sizeof(W
1dcc0 68 65 72 65 4d 61 73 6b 53 65 74 29 0a 20 20 29  hereMaskSet).  )
1dcd0 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
1dce0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
1dcf0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
1dd00 72 72 6f 72 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  rror;.  }.  pWIn
1dd10 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61  fo->nLevel = pTa
1dd20 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70  bList->nSrc;.  p
1dd30 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
1dd40 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
1dd50 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
1dd60 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
1dd70 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
1dd80 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
1dd90 29 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 57 43  );.  pWInfo->pWC
1dda0 20 3d 20 70 57 43 20 3d 20 28 57 68 65 72 65 43   = pWC = (WhereC
1ddb0 6c 61 75 73 65 20 2a 29 26 28 28 75 38 20 2a 29  lause *)&((u8 *)
1ddc0 70 57 49 6e 66 6f 29 5b 6e 42 79 74 65 57 49 6e  pWInfo)[nByteWIn
1ddd0 66 6f 5d 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 77  fo];.  pWInfo->w
1dde0 63 74 72 6c 46 6c 61 67 73 20 3d 20 77 63 74 72  ctrlFlags = wctr
1ddf0 6c 46 6c 61 67 73 3b 0a 20 20 70 4d 61 73 6b 53  lFlags;.  pMaskS
1de00 65 74 20 3d 20 28 57 68 65 72 65 4d 61 73 6b 53  et = (WhereMaskS
1de10 65 74 2a 29 26 70 57 43 5b 31 5d 3b 0a 0a 20 20  et*)&pWC[1];..  
1de20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57 48 45  /* Split the WHE
1de30 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73  RE clause into s
1de40 65 70 61 72 61 74 65 20 73 75 62 65 78 70 72 65  eparate subexpre
1de50 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63  ssions where eac
1de60 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73  h.  ** subexpres
1de70 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65  sion is separate
1de80 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72  d by an AND oper
1de90 61 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69  ator..  */.  ini
1dea0 74 4d 61 73 6b 53 65 74 28 70 4d 61 73 6b 53 65  tMaskSet(pMaskSe
1deb0 74 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73  t);.  whereClaus
1dec0 65 49 6e 69 74 28 70 57 43 2c 20 70 50 61 72 73  eInit(pWC, pPars
1ded0 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20 20  e, pMaskSet);.  
1dee0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 43  sqlite3ExprCodeC
1def0 6f 6e 73 74 61 6e 74 73 28 70 50 61 72 73 65 2c  onstants(pParse,
1df00 20 70 57 68 65 72 65 29 3b 0a 20 20 77 68 65 72   pWhere);.  wher
1df10 65 53 70 6c 69 74 28 70 57 43 2c 20 70 57 68 65  eSplit(pWC, pWhe
1df20 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
1df30 20 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63   .  /* Special c
1df40 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
1df50 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
1df60 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
1df70 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
1df80 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
1df90 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
1dfa0 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
1dfb0 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
1dfc0 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61  ( pWhere && (pTa
1dfd0 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c  bList->nSrc==0 |
1dfe0 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
1dff0 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1e000 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
1e010 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
1e020 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
1e030 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
1e040 2c 20 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  , SQLITE_JUMPIFN
1e050 55 4c 4c 29 3b 0a 20 20 20 20 70 57 68 65 72 65  ULL);.    pWhere
1e060 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1e070 41 73 73 69 67 6e 20 61 20 62 69 74 20 66 72 6f  Assign a bit fro
1e080 6d 20 74 68 65 20 62 69 74 6d 61 73 6b 20 74 6f  m the bitmask to
1e090 20 65 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74   every term in t
1e0a0 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
1e0b0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 61    **.  ** When a
1e0c0 73 73 69 67 6e 69 6e 67 20 62 69 74 6d 61 73 6b  ssigning bitmask
1e0d0 20 76 61 6c 75 65 73 20 74 6f 20 46 52 4f 4d 20   values to FROM 
1e0e0 63 6c 61 75 73 65 20 63 75 72 73 6f 72 73 2c 20  clause cursors, 
1e0f0 69 74 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20  it must be.  ** 
1e100 74 68 65 20 63 61 73 65 20 74 68 61 74 20 69 66  the case that if
1e110 20 58 20 69 73 20 74 68 65 20 62 69 74 6d 61 73   X is the bitmas
1e120 6b 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 46  k for the N-th F
1e130 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 20  ROM clause term 
1e140 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 62 69  then.  ** the bi
1e150 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 46 52  tmask for all FR
1e160 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20  OM clause terms 
1e170 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
1e180 68 65 20 4e 2d 74 68 20 74 65 72 6d 0a 20 20 2a  he N-th term.  *
1e190 2a 20 69 73 20 28 58 2d 31 29 2e 20 20 20 41 6e  * is (X-1).   An
1e1a0 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
1e1b0 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 20 6f   the ON clause o
1e1c0 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20 63 61  f a LEFT JOIN ca
1e1d0 6e 20 75 73 65 0a 20 20 2a 2a 20 69 74 73 20 45  n use.  ** its E
1e1e0 78 70 72 2e 69 52 69 67 68 74 4a 6f 69 6e 54 61  xpr.iRightJoinTa
1e1f0 62 6c 65 20 76 61 6c 75 65 20 74 6f 20 66 69 6e  ble value to fin
1e200 64 20 74 68 65 20 62 69 74 6d 61 73 6b 20 6f 66  d the bitmask of
1e210 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
1e220 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69  .  ** of the joi
1e230 6e 2e 20 20 53 75 62 74 72 61 63 74 69 6e 67 20  n.  Subtracting 
1e240 6f 6e 65 20 66 72 6f 6d 20 74 68 65 20 72 69 67  one from the rig
1e250 68 74 20 74 61 62 6c 65 20 62 69 74 6d 61 73 6b  ht table bitmask
1e260 20 67 69 76 65 73 20 61 0a 20 20 2a 2a 20 62 69   gives a.  ** bi
1e270 74 6d 61 73 6b 20 66 6f 72 20 61 6c 6c 20 74 61  tmask for all ta
1e280 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
1e290 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 4b   of the join.  K
1e2a0 6e 6f 77 69 6e 67 20 74 68 65 20 62 69 74 6d 61  nowing the bitma
1e2b0 73 6b 0a 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  sk.  ** for all 
1e2c0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65  tables to the le
1e2d0 66 74 20 6f 66 20 61 20 6c 65 66 74 20 6a 6f 69  ft of a left joi
1e2e0 6e 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  n is important. 
1e2f0 20 54 69 63 6b 65 74 20 23 33 30 31 35 2e 0a 20   Ticket #3015.. 
1e300 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 66 69 67 75   **.  ** Configu
1e310 72 65 20 74 68 65 20 57 68 65 72 65 43 6c 61 75  re the WhereClau
1e320 73 65 2e 76 6d 61 73 6b 20 76 61 72 69 61 62 6c  se.vmask variabl
1e330 65 20 73 6f 20 74 68 61 74 20 62 69 74 73 20 74  e so that bits t
1e340 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64 0a 20  hat correspond. 
1e350 20 2a 2a 20 74 6f 20 76 69 72 74 75 61 6c 20 74   ** to virtual t
1e360 61 62 6c 65 20 63 75 72 73 6f 72 73 20 61 72 65  able cursors are
1e370 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 75 73   set. This is us
1e380 65 64 20 74 6f 20 73 65 6c 65 63 74 69 76 65 6c  ed to selectivel
1e390 79 20 64 69 73 61 62 6c 65 20 0a 20 20 2a 2a 20  y disable .  ** 
1e3a0 74 68 65 20 4f 52 2d 74 6f 2d 49 4e 20 74 72 61  the OR-to-IN tra
1e3b0 6e 73 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 65  nsformation in e
1e3c0 78 70 72 41 6e 61 6c 79 7a 65 4f 72 54 65 72 6d  xprAnalyzeOrTerm
1e3d0 28 29 2e 20 49 74 20 69 73 20 6e 6f 74 20 68 65  (). It is not he
1e3e0 6c 70 66 75 6c 20 0a 20 20 2a 2a 20 77 69 74 68  lpful .  ** with
1e3f0 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e   virtual tables.
1e400 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1e410 70 57 43 2d 3e 76 6d 61 73 6b 3d 3d 30 20 26 26  pWC->vmask==0 &&
1e420 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3d 3d 30 20   pMaskSet->n==0 
1e430 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1e440 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
1e450 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65  i++){.    create
1e460 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
1e470 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  TabList->a[i].iC
1e480 75 72 73 6f 72 29 3b 0a 23 69 66 6e 64 65 66 20  ursor);.#ifndef 
1e490 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
1e4a0 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28  UALTABLE.    if(
1e4b0 20 41 4c 57 41 59 53 28 70 54 61 62 4c 69 73 74   ALWAYS(pTabList
1e4c0 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 26 26 20  ->a[i].pTab) && 
1e4d0 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 4c 69  IsVirtual(pTabLi
1e4e0 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 29 20 29  st->a[i].pTab) )
1e4f0 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 76 6d 61  {.      pWC->vma
1e500 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  sk |= ((Bitmask)
1e510 31 20 3c 3c 20 69 29 3b 0a 20 20 20 20 7d 0a 23  1 << i);.    }.#
1e520 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 6e 64 65  endif.  }.#ifnde
1e530 66 20 4e 44 45 42 55 47 0a 20 20 7b 0a 20 20 20  f NDEBUG.  {.   
1e540 20 42 69 74 6d 61 73 6b 20 74 6f 54 68 65 4c 65   Bitmask toTheLe
1e550 66 74 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ft = 0;.    for(
1e560 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  i=0; i<pTabList-
1e570 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
1e580 20 20 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 67     Bitmask m = g
1e590 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
1e5a0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
1e5b0 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
1e5c0 61 73 73 65 72 74 28 20 28 6d 2d 31 29 3d 3d 74  assert( (m-1)==t
1e5d0 6f 54 68 65 4c 65 66 74 20 29 3b 0a 20 20 20 20  oTheLeft );.    
1e5e0 20 20 74 6f 54 68 65 4c 65 66 74 20 7c 3d 20 6d    toTheLeft |= m
1e5f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1e600 69 66 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65  if..  /* Analyze
1e610 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
1e620 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74  xpressions.  Not
1e630 65 20 74 68 61 74 20 65 78 70 72 41 6e 61 6c 79  e that exprAnaly
1e640 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  ze() might.  ** 
1e650 61 64 64 20 6e 65 77 20 76 69 72 74 75 61 6c 20  add new virtual 
1e660 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65  terms onto the e
1e670 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
1e680 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f 20 6e  clause.  We do n
1e690 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20  ot.  ** want to 
1e6a0 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20 76 69  analyze these vi
1e6b0 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20  rtual terms, so 
1e6c0 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20  start analyzing 
1e6d0 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20  at the end.  ** 
1e6e0 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61 72 64  and work forward
1e6f0 20 73 6f 20 74 68 61 74 20 74 68 65 20 61 64 64   so that the add
1e700 65 64 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ed virtual terms
1e710 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f 63 65   are never proce
1e720 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 65 78 70  ssed..  */.  exp
1e730 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
1e740 4c 69 73 74 2c 20 70 57 43 29 3b 0a 20 20 69 66  List, pWC);.  if
1e750 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
1e760 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77  ed ){.    goto w
1e770 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b 0a  hereBeginError;.
1e780 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20    }..  /* Chose 
1e790 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74  the best index t
1e7a0 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74  o use for each t
1e7b0 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
1e7c0 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20   clause..  **.  
1e7d0 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c  ** This loop fil
1e7e0 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ls in the follow
1e7f0 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a  ing fields:.  **
1e800 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
1e810 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68  a[].pIdx      Th
1e820 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66  e index to use f
1e830 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66  or this level of
1e840 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20   the loop..  ** 
1e850 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 77 73    pWInfo->a[].ws
1e860 46 6c 61 67 73 20 20 20 57 48 45 52 45 5f 78 78  Flags   WHERE_xx
1e870 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74  x flags associat
1e880 65 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a  ed with pIdx.  *
1e890 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
1e8a0 6e 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75  nEq       The nu
1e8b0 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49  mber of == and I
1e8c0 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  N constraints.  
1e8d0 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
1e8e0 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 69 63 68  .iFrom     Which
1e8f0 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f   term of the FRO
1e900 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e  M clause is bein
1e910 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70  g coded.  **   p
1e920 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43  WInfo->a[].iTabC
1e930 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75  ur   The VDBE cu
1e940 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74  rsor for the dat
1e950 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a  abase table.  **
1e960 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
1e970 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44 42  IdxCur   The VDB
1e980 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
1e990 20 69 6e 64 65 78 0a 20 20 2a 2a 20 20 20 70 57   index.  **   pW
1e9a0 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 54 65 72 6d 20  Info->a[].pTerm 
1e9b0 20 20 20 20 57 68 65 6e 20 77 73 46 6c 61 67 73      When wsFlags
1e9c0 3d 3d 57 4f 5f 4f 52 2c 20 74 68 65 20 4f 52 2d  ==WO_OR, the OR-
1e9d0 63 6c 61 75 73 65 20 74 65 72 6d 0a 20 20 2a 2a  clause term.  **
1e9e0 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20  .  ** This loop 
1e9f0 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74  also figures out
1ea00 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64   the nesting ord
1ea10 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20  er of tables in 
1ea20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c  the FROM.  ** cl
1ea30 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74  ause..  */.  not
1ea40 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73  Ready = ~(Bitmas
1ea50 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  k)0;.  pTabItem 
1ea60 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
1ea70 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
1ea80 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20  ->a;.  andFlags 
1ea90 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52 41  = ~0;.  WHERETRA
1eaa0 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a  CE(("*** Optimiz
1eab0 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29  er Start ***\n")
1eac0 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d  );.  for(i=iFrom
1ead0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
1eae0 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
1eaf0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
1eb00 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 57 68 65 72  vel++){.    Wher
1eb10 65 43 6f 73 74 20 62 65 73 74 50 6c 61 6e 3b 20  eCost bestPlan; 
1eb20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 73 74 20          /* Most 
1eb30 65 66 66 69 63 69 65 6e 74 20 70 6c 61 6e 20 73  efficient plan s
1eb40 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  een so far */.  
1eb50 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20    Index *pIdx;  
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eb70 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20   Index for FROM 
1eb80 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74 65  table at pTabIte
1eb90 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  m */.    int j; 
1eba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebb0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
1ebc0 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
1ebd0 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  bles */.    int 
1ebe0 62 65 73 74 4a 20 3d 20 2d 31 3b 20 20 20 20 20  bestJ = -1;     
1ebf0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76          /* The v
1ec00 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20  alue of j */.   
1ec10 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20   Bitmask m;     
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec30 42 69 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f  Bitmask value fo
1ec40 72 20 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a  r j or bestJ */.
1ec50 20 20 20 20 69 6e 74 20 69 73 4f 70 74 69 6d 61      int isOptima
1ec60 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
1ec70 2f 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20  /* Iterator for 
1ec80 6f 70 74 69 6d 61 6c 2f 6e 6f 6e 2d 6f 70 74 69  optimal/non-opti
1ec90 6d 61 6c 20 73 65 61 72 63 68 20 2a 2f 0a 0a 20  mal search */.. 
1eca0 20 20 20 6d 65 6d 73 65 74 28 26 62 65 73 74 50     memset(&bestP
1ecb0 6c 61 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62  lan, 0, sizeof(b
1ecc0 65 73 74 50 6c 61 6e 29 29 3b 0a 20 20 20 20 62  estPlan));.    b
1ecd0 65 73 74 50 6c 61 6e 2e 72 43 6f 73 74 20 3d 20  estPlan.rCost = 
1ece0 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a  SQLITE_BIG_DBL;.
1ecf0 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72  .    /* Loop thr
1ed00 6f 75 67 68 20 74 68 65 20 72 65 6d 61 69 6e 69  ough the remaini
1ed10 6e 67 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ng entries in th
1ed20 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 6f  e FROM clause to
1ed30 20 66 69 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a   find the.    **
1ed40 20 6e 65 78 74 20 6e 65 73 74 65 64 20 6c 6f 6f   next nested loo
1ed50 70 2e 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75  p. The FROM clau
1ed60 73 65 20 65 6e 74 72 69 65 73 20 6d 61 79 20 62  se entries may b
1ed70 65 20 69 74 65 72 61 74 65 64 20 74 68 72 6f 75  e iterated throu
1ed80 67 68 0a 20 20 20 20 2a 2a 20 65 69 74 68 65 72  gh.    ** either
1ed90 20 6f 6e 63 65 20 6f 72 20 74 77 69 63 65 2e 20   once or twice. 
1eda0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1edb0 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74 69  he first iterati
1edc0 6f 6e 2c 20 77 68 69 63 68 20 69 73 20 61 6c 77  on, which is alw
1edd0 61 79 73 20 70 65 72 66 6f 72 6d 65 64 2c 20 73  ays performed, s
1ede0 65 61 72 63 68 65 73 20 66 6f 72 20 74 68 65 0a  earches for the.
1edf0 20 20 20 20 2a 2a 20 46 52 4f 4d 20 63 6c 61 75      ** FROM clau
1ee00 73 65 20 65 6e 74 72 79 20 74 68 61 74 20 70 65  se entry that pe
1ee10 72 6d 69 74 73 20 74 68 65 20 6c 6f 77 65 73 74  rmits the lowest
1ee20 2d 63 6f 73 74 2c 20 22 6f 70 74 69 6d 61 6c 22  -cost, "optimal"
1ee30 20 73 63 61 6e 2e 20 49 6e 0a 20 20 20 20 2a 2a   scan. In.    **
1ee40 20 74 68 69 73 20 63 6f 6e 74 65 78 74 20 61 6e   this context an
1ee50 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e 20 69 73   optimal scan is
1ee60 20 6f 6e 65 20 74 68 61 74 20 75 73 65 73 20 74   one that uses t
1ee70 68 65 20 73 61 6d 65 20 73 74 72 61 74 65 67 79  he same strategy
1ee80 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
1ee90 67 69 76 65 6e 20 46 52 4f 4d 20 63 6c 61 75 73  given FROM claus
1eea0 65 20 65 6e 74 72 79 20 61 73 20 77 6f 75 6c 64  e entry as would
1eeb0 20 62 65 20 73 65 6c 65 63 74 65 64 20 69 66 20   be selected if 
1eec0 74 68 65 20 65 6e 74 72 79 0a 20 20 20 20 2a 2a  the entry.    **
1eed0 20 77 65 72 65 20 75 73 65 64 20 61 73 20 74 68   were used as th
1eee0 65 20 69 6e 6e 65 72 6d 6f 73 74 20 6e 65 73 74  e innermost nest
1eef0 65 64 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 0a  ed loop..    **.
1ef00 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f 6e      ** The secon
1ef10 64 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 6f  d iteration is o
1ef20 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69 66  nly performed if
1ef30 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61 6e   no optimal scan
1ef40 20 73 74 72 61 74 65 67 69 65 73 0a 20 20 20 20   strategies.    
1ef50 2a 2a 20 77 65 72 65 20 66 6f 75 6e 64 20 62 79  ** were found by
1ef60 20 74 68 65 20 66 69 72 73 74 2e 20 54 68 69 73   the first. This
1ef70 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 75 73   iteration is us
1ef80 65 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72  ed to search for
1ef90 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77 65   the.    ** lowe
1efa0 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76 65  st cost scan ove
1efb0 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rall..    **.   
1efc0 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65 72   ** Previous ver
1efd0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 20  sions of SQLite 
1efe0 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20 74  performed only t
1eff0 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61 74  he second iterat
1f000 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68 65  ion -.    ** the
1f010 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74 20   next outermost 
1f020 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73 20  loop was always 
1f030 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c 6f  that with the lo
1f040 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20 20  west overall.   
1f050 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76 65   ** cost. Howeve
1f060 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74 68  r, this meant th
1f070 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64 20  at SQLite could 
1f080 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e 67  select the wrong
1f090 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f 72   plan.    ** for
1f0a0 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61 73   scripts such as
1f0b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
1f0c0 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a 2a      **   .    **
1f0d0 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
1f0e0 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20 2a  t1(a, b); .    *
1f0f0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
1f100 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20 2a   t2(c, d);.    *
1f110 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  *   SELECT * FRO
1f120 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20 74  M t2, t1 WHERE t
1f130 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b 0a  2.rowid = t1.a;.
1f140 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
1f150 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79 20  e best strategy 
1f160 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  is to iterate th
1f170 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20 66  rough table t1 f
1f180 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69 74  irst. However it
1f190 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70  .    ** is not p
1f1a0 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65 72  ossible to deter
1f1b0 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20 61  mine this with a
1f1c0 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 61   simple greedy a
1f1d0 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a 2a  lgorithm..    **
1f1e0 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   However, since 
1f1f0 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c 69  the cost of a li
1f200 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75 67  near scan throug
1f210 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74 68  h table t2 is th
1f220 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20 61  e same .    ** a
1f230 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  s the cost of a 
1f240 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f  linear scan thro
1f250 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61 20  ugh table t1, a 
1f260 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a 20  simple greedy . 
1f270 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d 20     ** algorithm 
1f280 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75 73  may choose to us
1f290 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75 74  e t2 for the out
1f2a0 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20 69  er loop, which i
1f2b0 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a 20  s a much.    ** 
1f2c0 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61 63  costlier approac
1f2d0 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  h..    */.    fo
1f2e0 72 28 69 73 4f 70 74 69 6d 61 6c 3d 31 3b 20 69  r(isOptimal=1; i
1f2f0 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20 62  sOptimal>=0 && b
1f300 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d 61  estJ<0; isOptima
1f310 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74 6d  l--){.      Bitm
1f320 61 73 6b 20 6d 61 73 6b 20 3d 20 28 69 73 4f 70  ask mask = (isOp
1f330 74 69 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f 74 52  timal ? 0 : notR
1f340 65 61 64 79 29 3b 0a 20 20 20 20 20 20 61 73 73  eady);.      ass
1f350 65 72 74 28 20 28 70 54 61 62 4c 69 73 74 2d 3e  ert( (pTabList->
1f360 6e 53 72 63 2d 69 46 72 6f 6d 29 3e 31 20 7c 7c  nSrc-iFrom)>1 ||
1f370 20 69 73 4f 70 74 69 6d 61 6c 20 29 3b 0a 20 20   isOptimal );.  
1f380 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c      for(j=iFrom,
1f390 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c   pTabItem=&pTabL
1f3a0 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61  ist->a[j]; j<pTa
1f3b0 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b  bList->nSrc; j++
1f3c0 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20  , pTabItem++){. 
1f3d0 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f 74         int doNot
1f3e0 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20 54  Reorder;    /* T
1f3f0 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
1f400 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
1f410 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  reordered */.   
1f420 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20 73       WhereCost s
1f430 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f 73  Cost;     /* Cos
1f440 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  t information fr
1f450 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c 5d  om best[Virtual]
1f460 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20 20  Index() */.     
1f470 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72     ExprList *pOr
1f480 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45 52  derBy;  /* ORDER
1f490 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 69   BY clause for i
1f4a0 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a 65  ndex to optimize
1f4b0 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20 64   */.  .        d
1f4c0 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28  oNotReorder =  (
1f4d0 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pTabItem->jointy
1f4e0 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54  pe & (JT_LEFT|JT
1f4f0 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20 20  _CROSS))!=0;.   
1f500 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72 6f       if( j!=iFro
1f510 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65  m && doNotReorde
1f520 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
1f530 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 70     m = getMask(p
1f540 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  MaskSet, pTabIte
1f550 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
1f560 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f       if( (m & no
1f570 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20  tReady)==0 ){.  
1f580 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 69          if( j==i
1f590 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a  From ) iFrom++;.
1f5a0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1f5b0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1f5c0 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20 3d        pOrderBy =
1f5d0 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64   ((i==0 && ppOrd
1f5e0 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72 42  erBy )?*ppOrderB
1f5f0 79 3a 30 29 3b 0a 20 20 0a 20 20 20 20 20 20 20  y:0);.  .       
1f600 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
1f610 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  m->pTab );.#ifnd
1f620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
1f630 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
1f640 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61      if( IsVirtua
1f650 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  l(pTabItem->pTab
1f660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
1f670 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
1f680 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66 6f  o **pp = &pWInfo
1f690 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b  ->a[j].pIdxInfo;
1f6a0 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 56  .          bestV
1f6b0 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72  irtualIndex(pPar
1f6c0 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65  se, pWC, pTabIte
1f6d0 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42  m, mask, pOrderB
1f6e0 79 2c 20 26 73 43 6f 73 74 2c 20 70 70 29 3b 0a  y, &sCost, pp);.
1f6f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23          }else .#
1f700 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b 0a  endif.        {.
1f710 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42 74            bestBt
1f720 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c  reeIndex(pParse,
1f730 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c 20   pWC, pTabItem, 
1f740 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42 79 2c 20  mask, pOrderBy, 
1f750 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20 20  &sCost);.       
1f760 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
1f770 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c 20  t( isOptimal || 
1f780 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74 52  (sCost.used&notR
1f790 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  eady)==0 );..   
1f7a0 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74 2e       if( (sCost.
1f7b0 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d 3d  used&notReady)==
1f7c0 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 6a  0.         && (j
1f7d0 3d 3d 69 46 72 6f 6d 20 7c 7c 20 73 43 6f 73 74  ==iFrom || sCost
1f7e0 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e 2e  .rCost<bestPlan.
1f7f0 72 43 6f 73 74 29 20 0a 20 20 20 20 20 20 20 20  rCost) .        
1f800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73  ){.          bes
1f810 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a 20  tPlan = sCost;. 
1f820 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d           bestJ =
1f830 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   j;.        }.  
1f840 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52        if( doNotR
1f850 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a  eorder ) break;.
1f860 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1f870 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a 3e    assert( bestJ>
1f880 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1f890 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65 74  ( notReady & get
1f8a0 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
1f8b0 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a  TabList->a[bestJ
1f8c0 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20 20  ].iCursor) );.  
1f8d0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2a    WHERETRACE(("*
1f8e0 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65 6c  ** Optimizer sel
1f8f0 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66 6f  ects table %d fo
1f900 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
1f910 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
1f920 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
1f930 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
1f940 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c 61  tPlan.plan.wsFla
1f950 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52  gs & WHERE_ORDER
1f960 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  BY)!=0 ){.      
1f970 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
1f980 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61      }.    andFla
1f990 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e 70  gs &= bestPlan.p
1f9a0 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20 20  lan.wsFlags;.   
1f9b0 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d 20   pLevel->plan = 
1f9c0 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a 20  bestPlan.plan;. 
1f9d0 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e 2e     if( bestPlan.
1f9e0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
1f9f0 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b 0a  HERE_INDEXED ){.
1fa00 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
1fa10 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
1fa20 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
1fa30 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
1fa40 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
1fa50 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
1fa60 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 4d  y &= ~getMask(pM
1fa70 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
1fa80 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
1fa90 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
1faa0 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65 73  >iFrom = (u8)bes
1fab0 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  tJ;..    /* Chec
1fac0 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74 61  k that if the ta
1fad0 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20 74  ble scanned by t
1fae0 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74 69  his loop iterati
1faf0 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a 2a  on had an.    **
1fb00 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
1fb10 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20 69  se attached to i
1fb20 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d 65  t, that the name
1fb30 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e 67  d index is being
1fb40 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f 72  .    ** used for
1fb50 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e 6f   the scan. If no
1fb60 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63 6f  t, then query co
1fb70 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66 61  mpilation has fa
1fb80 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65 74  iled..    ** Ret
1fb90 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
1fba0 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d 20    */.    pIdx = 
1fbb0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
1fbc0 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20 69  J].pIndex;.    i
1fbd0 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20 20  f( pIdx ){.     
1fbe0 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e 70   if( (bestPlan.p
1fbf0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1fc00 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30 20  ERE_INDEXED)==0 
1fc10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1fc20 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
1fc30 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20 69  e, "cannot use i
1fc40 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78 2d  ndex: %s", pIdx-
1fc50 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
1fc60 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
1fc70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c  Error;.      }el
1fc80 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
1fc90 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  f an INDEXED BY 
1fca0 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c 20  clause is used, 
1fcb0 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29 20  the bestIndex() 
1fcc0 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  function is.    
1fcd0 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65      ** guarantee
1fce0 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69 6e  d to find the in
1fcf0 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69 6e  dex specified in
1fd00 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59 20   the INDEXED BY 
1fd10 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20 2a  clause.        *
1fd20 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e 20  * if it find an 
1fd30 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a 2f  index at all. */
1fd40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1fd50 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 75   bestPlan.plan.u
1fd60 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a 20  .pIdx==pIdx );. 
1fd70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1fd80 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
1fd90 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
1fda0 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
1fdb0 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e  .  if( pParse->n
1fdc0 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
1fdd0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
1fde0 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45 72  oto whereBeginEr
1fdf0 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ror;.  }..  /* I
1fe00 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65 72  f the total quer
1fe10 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20 61  y only selects a
1fe20 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68 65   single row, the
1fe30 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20  n the ORDER BY. 
1fe40 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69 72   ** clause is ir
1fe50 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a 20  relevant..  */. 
1fe60 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20 26   if( (andFlags &
1fe70 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21 3d   WHERE_UNIQUE)!=
1fe80 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20 29  0 && ppOrderBy )
1fe90 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79  {.    *ppOrderBy
1fea0 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
1feb0 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73  If the caller is
1fec0 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45   an UPDATE or DE
1fed0 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20 74  LETE statement t
1fee0 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69 6e  hat is requestin
1fef0 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  g.  ** to use a 
1ff00 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
1ff10 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69 66  hm, determine if
1ff20 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70 72   this is appropr
1ff30 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20 6f  iate..  ** The o
1ff40 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74 68  ne-pass algorith
1ff50 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66 20  m only works if 
1ff60 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ff70 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
1ff80 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
1ff90 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e 67  to update a sing
1ffa0 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20 61  le row..  */.  a
1ffb0 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c 61  ssert( (wctrlFla
1ffc0 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50 41  gs & WHERE_ONEPA
1ffd0 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20 7c  SS_DESIRED)==0 |
1ffe0 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c  | pWInfo->nLevel
1fff0 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77 63  ==1 );.  if( (wc
20000 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52 45  trlFlags & WHERE
20010 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45 44  _ONEPASS_DESIRED
20020 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61 67  )!=0 && (andFlag
20030 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
20040 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49 6e  )!=0 ){.    pWIn
20050 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d 20  fo->okOnePass = 
20060 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e 61  1;.    pWInfo->a
20070 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  [0].plan.wsFlags
20080 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f 4f   &= ~WHERE_IDX_O
20090 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  NLY;.  }..  /* O
200a0 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20 69  pen all tables i
200b0 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20 61  n the pTabList a
200c0 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20 73  nd any indices s
200d0 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a 2a  elected for.  **
200e0 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73 65   searching those
200f0 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
20100 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
20110 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
20120 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
20130 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
20140 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f 72  er Goto */.  for
20150 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
20160 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
20170 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
20180 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61  Level++){.    Ta
20190 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 2f  ble *pTab;     /
201a0 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  * Table to open 
201b0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
201c0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
201d0 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
201e0 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
201f0 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  dex */..#ifndef 
20200 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
20210 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72  AIN.    if( pPar
20220 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29  se->explain==2 )
20230 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d  {.      char *zM
20240 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  sg;.      struct
20250 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
20260 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74  Item = &pTabList
20270 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  ->a[pLevel->iFro
20280 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d  m];.      zMsg =
20290 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
202a0 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c 20  db, "TABLE %s", 
202b0 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  pItem->zName);. 
202c0 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
202d0 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
202e0 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
202f0 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73  MAppendf(db, zMs
20300 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20 7a  g, "%s AS %s", z
20310 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  Msg, pItem->zAli
20320 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  as);.      }.   
20330 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e     if( (pLevel->
20340 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
20350 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30  HERE_INDEXED)!=0
20360 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
20370 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
20380 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
20390 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c   WITH INDEX %s",
203a0 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73 67  .           zMsg
203b0 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75  , pLevel->plan.u
203c0 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  .pIdx->zName);. 
203d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
203e0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
203f0 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c 54  ags & WHERE_MULT
20400 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20  I_OR ){.        
20410 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 41  zMsg = sqlite3MA
20420 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c  ppendf(db, zMsg,
20430 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d 49   "%s VIA MULTI-I
20440 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d 73  NDEX UNION", zMs
20450 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  g);.      }else 
20460 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
20470 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
20480 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
20490 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
204a0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
204b0 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66 28  sqlite3MAppendf(
204c0 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55 53  db, zMsg, "%s US
204d0 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
204e0 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
204f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
20500 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
20510 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
20520 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77   (pLevel->plan.w
20530 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 56  sFlags & WHERE_V
20540 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30 20  IRTUALTABLE)!=0 
20550 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
20560 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
20570 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65 6c  VtabIdx = pLevel
20580 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49 64  ->plan.u.pVtabId
20590 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20  x;.        zMsg 
205a0 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64  = sqlite3MAppend
205b0 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20  f(db, zMsg, "%s 
205c0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
205d0 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73 67  DEX %d:%s", zMsg
205e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
205f0 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d 3e        pVtabIdx->
20600 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64 78  idxNum, pVtabIdx
20610 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20 20  ->idxStr);.     
20620 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
20630 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
20640 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
20650 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20  _ORDERBY ){.    
20660 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
20670 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a  e3MAppendf(db, z
20680 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20 42  Msg, "%s ORDER B
20690 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20  Y", zMsg);.     
206a0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
206b0 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50  VdbeAddOp4(v, OP
206c0 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65  _Explain, i, pLe
206d0 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a  vel->iFrom, 0, z
206e0 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29  Msg, P4_DYNAMIC)
206f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
20700 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
20710 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
20720 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
20730 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
20740 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
20750 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
20760 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
20770 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 64  3SchemaToIndex(d
20780 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  b, pTab->pSchema
20790 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61 62  );.    if( (pTab
207a0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
207b0 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c 7c  Ephemeral)!=0 ||
207c0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
207d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
207e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
207f0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
20800 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61  if( (pLevel->pla
20810 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
20820 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21  E_VIRTUALTABLE)!
20830 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  =0 ){.      cons
20840 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d 20  t char *pVTab = 
20850 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
20860 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28 64  lite3GetVTable(d
20870 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
20880 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
20890 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
208a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
208b0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65  ddOp4(v, OP_VOpe
208c0 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20 70  n, iCur, 0, 0, p
208d0 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b 0a  VTab, P4_VTAB);.
208e0 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
208f0 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c  .    if( (pLevel
20900 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
20910 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
20920 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
20930 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48  (wctrlFlags & WH
20940 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d 3d  ERE_OMIT_OPEN)==
20950 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  0 ){.      int o
20960 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e  p = pWInfo->okOn
20970 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e 57  ePass ? OP_OpenW
20980 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52 65  rite : OP_OpenRe
20990 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ad;.      sqlite
209a0 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73  3OpenTable(pPars
209b0 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75  e, pTabItem->iCu
209c0 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c  rsor, iDb, pTab,
209d0 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20   op);.      if( 
209e0 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61  !pWInfo->okOnePa
209f0 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f 6c  ss && pTab->nCol
20a00 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20 20  <BMS ){.        
20a10 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61 62  Bitmask b = pTab
20a20 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20  Item->colUsed;. 
20a30 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
20a40 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b 20  ;.        for(; 
20a50 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29 7b  b; b=b>>1, n++){
20a60 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
20a70 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76 2c  3VdbeChangeP4(v,
20a80 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
20a90 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 53 51  entAddr(v)-1, SQ
20aa0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
20ab0 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  n), P4_INT32);. 
20ac0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e         assert( n
20ad0 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a  <=pTab->nCol );.
20ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20af0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
20b00 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65  TableLock(pParse
20b10 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75  , iDb, pTab->tnu
20b20 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  m, 0, pTab->zNam
20b30 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  e);.    }.    pL
20b40 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20  evel->iTabCur = 
20b50 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
20b60 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  r;.    if( (pLev
20b70 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
20b80 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44   & WHERE_INDEXED
20b90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49 6e  )!=0 ){.      In
20ba0 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76 65  dex *pIx = pLeve
20bb0 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b 0a  l->plan.u.pIdx;.
20bc0 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70        KeyInfo *p
20bd0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64  Key = sqlite3Ind
20be0 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65  exKeyinfo(pParse
20bf0 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69 6e  , pIx);.      in
20c00 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
20c10 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20  el->iIdxCur;.   
20c20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e     assert( pIx->
20c30 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70  pSchema==pTab->p
20c40 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20  Schema );.      
20c50 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72 3e  assert( iIdxCur>
20c60 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
20c70 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c  te3VdbeAddOp4(v,
20c80 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49   OP_OpenRead, iI
20c90 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d  dxCur, pIx->tnum
20ca0 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20 20  , iDb,.         
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
20cc0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f 4b  char*)pKey, P4_K
20cd0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
20ce0 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65  .      VdbeComme
20cf0 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49 78  nt((v, "%s", pIx
20d00 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 7d  ->zName));.    }
20d10 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65  .    sqlite3Code
20d20 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61  VerifySchema(pPa
20d30 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20  rse, iDb);.  }. 
20d40 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20   pWInfo->iTop = 
20d50 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
20d60 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a  ntAddr(v);..  /*
20d70 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f   Generate the co
20d80 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61  de to do the sea
20d90 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61  rch.  Each itera
20da0 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a  tion of the for.
20db0 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20    ** loop below 
20dc0 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66  generates code f
20dd0 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74  or a single nest
20de0 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56  ed loop of the V
20df0 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a  M.  ** program..
20e00 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20    */.  notReady 
20e10 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20  = ~(Bitmask)0;. 
20e20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
20e30 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
20e40 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 3d  {.    notReady =
20e50 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
20e60 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63 74  t(pWInfo, i, wct
20e70 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61 64  rlFlags, notRead
20e80 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e  y);.    pWInfo->
20e90 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49 6e  iContinue = pWIn
20ea0 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f 6e  fo->a[i].addrCon
20eb0 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  t;.  }..#ifdef S
20ec0 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46  QLITE_TEST  /* F
20ed0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  or testing and d
20ee0 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
20ef0 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64  y */.  /* Record
20f00 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c   in the query pl
20f10 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  an information a
20f20 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e 74  bout the current
20f30 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20   table.  ** and 
20f40 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20 74  the index used t
20f50 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66 20  o access it (if 
20f60 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74 61  any).  If the ta
20f70 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ble itself.  ** 
20f80 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73  is not used, its
20f90 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b   name is just '{
20fa0 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78  }'.  If no index
20fb0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68   is used.  ** th
20fc0 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65  e index is liste
20fd0 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74  d as "{}".  If t
20fe0 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69  he primary key i
20ff0 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20  s used the.  ** 
21000 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a  index name is '*
21010 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  '..  */.  for(i=
21020 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
21030 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
21040 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20  har *z;.    int 
21050 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  n;.    pLevel = 
21060 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
21070 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
21080 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
21090 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a  l->iFrom];.    z
210a0 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c   = pTabItem->zAl
210b0 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  ias;.    if( z==
210c0 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d  0 ) z = pTabItem
210d0 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  ->pTab->zName;. 
210e0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
210f0 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
21100 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
21110 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
21120 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a 20  ry_plan)-10 ){. 
21130 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
21140 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
21150 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29  WHERE_IDX_ONLY )
21160 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
21170 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  (&sqlite3_query_
21180 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b  plan[nQPlan], "{
21190 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20  }", 2);.        
211a0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
211b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211c0 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65    memcpy(&sqlite
211d0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
211e0 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  lan], z, n);.   
211f0 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e       nQPlan += n
21200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
21210 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
21220 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
21230 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65   ';.    }.    te
21240 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e  stcase( pLevel->
21250 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
21260 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 3b  HERE_ROWID_EQ );
21270 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
21280 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
21290 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49  ags & WHERE_ROWI
212a0 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20 69  D_RANGE );.    i
212b0 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  f( pLevel->plan.
212c0 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52 45  wsFlags & (WHERE
212d0 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
212e0 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
212f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
21300 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
21310 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c 20  [nQPlan], "* ", 
21320 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  2);.      nQPlan
21330 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65   += 2;.    }else
21340 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
21350 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
21360 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29  RE_INDEXED)!=0 )
21370 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  {.      n = sqli
21380 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65 76  te3Strlen30(pLev
21390 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d  el->plan.u.pIdx-
213a0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
213b0 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73 69  f( n+nQPlan < si
213c0 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75 65  zeof(sqlite3_que
213d0 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20 20  ry_plan)-2 ){.  
213e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71        memcpy(&sq
213f0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
21400 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65 6c  [nQPlan], pLevel
21410 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a  ->plan.u.pIdx->z
21420 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20  Name, n);.      
21430 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
21440 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71         sqlite3_q
21450 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
21460 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20  ++] = ' ';.     
21470 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
21480 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
21490 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
214a0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33  QPlan], "{} ", 3
214b0 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20  );.      nQPlan 
214c0 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += 3;.    }.  }.
214d0 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e 3e    while( nQPlan>
214e0 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75 65  0 && sqlite3_que
214f0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31  ry_plan[nQPlan-1
21500 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73 71  ]==' ' ){.    sq
21510 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
21520 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a  [--nQPlan] = 0;.
21530 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71 75    }.  sqlite3_qu
21540 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
21550 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d   = 0;.  nQPlan =
21560 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51   0;.#endif /* SQ
21570 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65 73  LITE_TEST // Tes
21580 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
21590 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a  ng use only */..
215a0 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
215b0 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64 64  continuation add
215c0 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65 72  ress in the Wher
215d0 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 2e  eInfo structure.
215e0 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65 61    Then.  ** clea
215f0 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 2e  n up and return.
21600 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  .  */.  return p
21610 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
21620 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
21630 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
21640 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68 65  eginError:.  whe
21650 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20 70  reInfoFree(db, p
21660 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
21670 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
21680 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
21690 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
216a0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
216b0 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
216c0 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
216d0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
216e0 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
216f0 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
21700 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
21710 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  {.  Parse *pPars
21720 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  e = pWInfo->pPar
21730 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  se;.  Vdbe *v = 
21740 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
21750 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c   int i;.  WhereL
21760 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20  evel *pLevel;.  
21770 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
21780 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62  t = pWInfo->pTab
21790 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33 20  List;.  sqlite3 
217a0 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
217b0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
217c0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
217d0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 73  n code..  */.  s
217e0 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 43  qlite3ExprCacheC
217f0 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20 20  lear(pParse);.  
21800 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e  for(i=pTabList->
21810 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nSrc-1; i>=0; i-
21820 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d  -){.    pLevel =
21830 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
21840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21850 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
21860 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74 29  Level->addrCont)
21870 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
21880 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
21890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
218a0 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76  beAddOp2(v, pLev
218b0 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
218c0 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
218d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
218e0 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70 4c  beChangeP5(v, pL
218f0 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20 7d  evel->p5);.    }
21900 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
21910 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
21920 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26 26  WHERE_IN_ABLE &&
21930 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49   pLevel->u.in.nI
21940 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  n>0 ){.      str
21950 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b  uct InLoop *pIn;
21960 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
21970 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
21980 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
21990 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29 3b  Level->addrNxt);
219a0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65  .      for(j=pLe
219b0 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20 70  vel->u.in.nIn, p
219c0 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  In=&pLevel->u.in
219d0 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20 6a  .aInLoop[j-1]; j
219e0 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29 7b  >0; j--, pIn--){
219f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
21a00 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
21a10 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b 31  pIn->addrInTop+1
21a20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
21a30 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
21a40 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69 43  OP_Next, pIn->iC
21a50 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  ur, pIn->addrInT
21a60 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  op);.        sql
21a70 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
21a80 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54  (v, pIn->addrInT
21a90 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  op-1);.      }. 
21aa0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
21ab0 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e 75  ee(db, pLevel->u
21ac0 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20  .in.aInLoop);.  
21ad0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
21ae0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
21af0 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 42  v, pLevel->addrB
21b00 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  rk);.    if( pLe
21b10 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29  vel->iLeftJoin )
21b20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
21b30 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
21b40 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
21b50 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70 4c  (v, OP_IfPos, pL
21b60 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
21b70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
21b80 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
21b90 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73  NullRow, pTabLis
21ba0 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
21bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  ;.      if( pLev
21bc0 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20 29  el->iIdxCur>=0 )
21bd0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21be0 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
21bf0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
21c00 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20 20  l->iIdxCur);.   
21c10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
21c20 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52 65  Level->op==OP_Re
21c30 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  turn ){.        
21c40 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21c50 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 70  2(v, OP_Gosub, p
21c60 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65  Level->p1, pLeve
21c70 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a 20  l->addrFirst);. 
21c80 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
21c90 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
21ca0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
21cb0 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  , 0, pLevel->add
21cc0 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 7d  rFirst);.      }
21cd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
21ce0 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
21cf0 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  dr);.    }.  }..
21d00 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
21d10 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
21d20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
21d30 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
21d40 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
21d50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
21d60 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
21d70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
21d80 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
21d90 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
21da0 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
21db0 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 57  ened by sqlite3W
21dc0 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a  hereBegin..  */.
21dd0 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
21de0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
21df0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
21e00 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
21e10 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
21e20 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d  t_item *pTabItem
21e30 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
21e40 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
21e50 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
21e60 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
21e70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  ;.    assert( pT
21e80 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ab!=0 );.    if(
21e90 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
21ea0 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c 29   & TF_Ephemeral)
21eb0 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65  !=0 || pTab->pSe
21ec0 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  lect ) continue;
21ed0 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66 6f  .    if( (pWInfo
21ee0 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57  ->wctrlFlags & W
21ef0 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45 29  HERE_OMIT_CLOSE)
21f00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
21f10 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
21f20 61 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e  ass && (pLevel->
21f30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
21f40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d  HERE_IDX_ONLY)==
21f50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
21f60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
21f70 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
21f80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a  Item->iCursor);.
21f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21fa0 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
21fb0 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
21fc0 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a 20  INDEXED)!=0 ){. 
21fd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
21fe0 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 43  beAddOp1(v, OP_C
21ff0 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
22000 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d 0a  dxCur);.      }.
22010 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
22020 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73 20   this scan uses 
22030 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20 63  an index, make c
22040 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f 6e  ode substitution
22050 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a 20  s to read data. 
22060 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 69     ** from the i
22070 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65 6e  ndex in preferen
22080 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65 2e  ce to the table.
22090 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69 73   Sometimes, this
220a0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74 68   means.    ** th
220b0 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65 76  e table need nev
220c0 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d 2e  er be read from.
220d0 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66 6f   This is a perfo
220e0 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20 20  rmance boost,.  
220f0 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62 65    ** as the vdbe
22100 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e 74   level waits unt
22110 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  il the table is 
22120 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74 75  read before actu
22130 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65 6b  ally.    ** seek
22140 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63 75  ing the table cu
22150 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63 6f  rsor to the reco
22160 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rd corresponding
22170 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a   to the current.
22180 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 20      ** position 
22190 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  in the index..  
221a0 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c    ** .    ** Cal
221b0 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20 67  ls to the code g
221c0 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74 77  enerator in betw
221d0 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72 65  een sqlite3Where
221e0 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a  Begin and.    **
221f0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
22200 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61 74   will have creat
22210 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65 66  ed code that ref
22220 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62 6c  erences the tabl
22230 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c  e.    ** directl
22240 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73 63  y.  This loop sc
22250 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f 64  ans all that cod
22260 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70  e looking for op
22270 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  codes.    ** tha
22280 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  t reference the 
22290 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72  table and conver
222a0 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63  ts them into opc
222b0 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a 2a  odes that.    **
222c0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 69   reference the i
222d0 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
222e0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
222f0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
22300 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 26  RE_INDEXED)!=0 &
22310 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  & !db->mallocFai
22320 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  led){.      int 
22330 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20  k, j, last;.    
22340 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20    VdbeOp *pOp;. 
22350 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78       Index *pIdx
22360 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
22370 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 69 6e  u.pIdx;.      in
22380 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 3d  t useIndexOnly =
22390 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73   pLevel->plan.ws
223a0 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  Flags & WHERE_ID
223b0 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20 61  X_ONLY;..      a
223c0 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
223d0 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71  ;.      pOp = sq
223e0 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76  lite3VdbeGetOp(v
223f0 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b  , pWInfo->iTop);
22400 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71  .      last = sq
22410 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
22420 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66  Addr(v);.      f
22430 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f  or(k=pWInfo->iTo
22440 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20  p; k<last; k++, 
22450 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  pOp++){.        
22460 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65  if( pOp->p1!=pLe
22470 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63  vel->iTabCur ) c
22480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
22490 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
224a0 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  ==OP_Column ){. 
224b0 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
224c0 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
224d0 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
224e0 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32       if( pOp->p2
224f0 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
22500 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [j] ){.         
22510 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a       pOp->p2 = j
22520 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
22530 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c  pOp->p1 = pLevel
22540 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  ->iIdxCur;.     
22550 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22560 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22580 20 20 20 20 61 73 73 65 72 74 28 21 75 73 65 49      assert(!useI
22590 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70 49  ndexOnly || j<pI
225a0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20 20  dx->nColumn);.  
225b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
225c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
225d0 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
225e0 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
225f0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
22600 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
22610 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
22620 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
22630 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
22640 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26 20  ==OP_NullRow && 
22650 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b 0a  useIndexOnly ){.
22660 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
22670 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
22680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22690 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
226a0 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
226b0 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e 66  .  */.  whereInf
226c0 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66 6f  oFree(db, pWInfo
226d0 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     );.  return;.}.