/ Hex Artifact Content
Login

Artifact b9ad2d2db4a7d1cda7bed8a7299eb73fde63b5b1:


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 41 72 67 75 6d 65 6e 74 20 70 49  *.** Argument pI
11280 64 78 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  dx is a pointer 
11290 74 6f 20 61 6e 20 69 6e 64 65 78 20 73 74 72 75  to an index stru
112a0 63 74 75 72 65 20 74 68 61 74 20 68 61 73 20 61  cture that has a
112b0 6e 20 61 72 72 61 79 20 6f 66 0a 2a 2a 20 53 51  n array of.** SQ
112c0 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c  LITE_INDEX_SAMPL
112d0 45 53 20 65 76 65 6e 6c 79 20 73 70 61 63 65 64  ES evenly spaced
112e0 20 73 61 6d 70 6c 65 73 20 6f 66 20 74 68 65 20   samples of the 
112f0 66 69 72 73 74 20 69 6e 64 65 78 65 64 20 63 6f  first indexed co
11300 6c 75 6d 6e 0a 2a 2a 20 73 74 6f 72 65 64 20 69  lumn.** stored i
11310 6e 20 49 6e 64 65 78 2e 61 53 61 6d 70 6c 65 2e  n Index.aSample.
11320 20 54 68 65 20 64 6f 6d 61 69 6e 20 6f 66 20 76   The domain of v
11330 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
11340 73 61 69 64 20 63 6f 6c 75 6d 6e 0a 2a 2a 20 6d  said column.** m
11350 61 79 20 62 65 20 74 68 6f 75 67 68 74 20 6f 66  ay be thought of
11360 20 61 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   as divided into
11370 20 28 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53   (SQLITE_INDEX_S
11380 41 4d 50 4c 45 53 2b 31 29 20 72 65 67 69 6f 6e  AMPLES+1) region
11390 73 2e 0a 2a 2a 20 52 65 67 69 6f 6e 20 30 20 63  s..** Region 0 c
113a0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 76 61 6c 75  ontains all valu
113b0 65 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  es smaller than 
113c0 74 68 65 20 66 69 72 73 74 20 73 61 6d 70 6c 65  the first sample
113d0 20 76 61 6c 75 65 2e 20 52 65 67 69 6f 6e 0a 2a   value. Region.*
113e0 2a 20 31 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c  * 1 contains val
113f0 75 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ues larger than 
11400 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
11410 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 69 72  value of the fir
11420 73 74 20 73 61 6d 70 6c 65 2c 0a 2a 2a 20 62 75  st sample,.** bu
11430 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  t smaller than t
11440 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
11450 73 65 63 6f 6e 64 2e 20 41 6e 64 20 73 6f 20 6f  second. And so o
11460 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  n..**.** If succ
11470 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e  essful, this fun
11480 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73  ction determines
11490 20 77 68 69 63 68 20 6f 66 20 74 68 65 20 72 65   which of the re
114a0 67 69 6f 6e 73 20 76 61 6c 75 65 20 0a 2a 2a 20  gions value .** 
114b0 70 56 61 6c 20 6c 69 65 73 20 69 6e 2c 20 73 65  pVal lies in, se
114c0 74 73 20 2a 70 69 52 65 67 69 6f 6e 20 74 6f 20  ts *piRegion to 
114d0 74 68 65 20 72 65 67 69 6f 6e 20 69 6e 64 65 78  the region index
114e0 20 28 61 20 76 61 6c 75 65 20 62 65 74 77 65 65   (a value betwee
114f0 6e 20 30 0a 2a 2a 20 61 6e 64 20 53 51 4c 49 54  n 0.** and SQLIT
11500 45 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 2b  E_INDEX_SAMPLES+
11510 31 2c 20 69 6e 63 6c 75 73 69 76 65 29 20 61 6e  1, inclusive) an
11520 64 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  d returns SQLITE
11530 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 61  _OK..** Or, if a
11540 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 20 77 68 69  n OOM occurs whi
11550 6c 65 20 63 6f 6e 76 65 72 74 69 6e 67 20 74 65  le converting te
11560 78 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  xt values betwee
11570 6e 20 65 6e 63 6f 64 69 6e 67 73 2c 0a 2a 2a 20  n encodings,.** 
11580 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
11590 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 69  returned and *pi
115a0 52 65 67 69 6f 6e 20 69 73 20 75 6e 64 65 66 69  Region is undefi
115b0 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ned..*/.#ifdef S
115c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41  QLITE_ENABLE_STA
115d0 54 32 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68  T2.static int wh
115e0 65 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 0a  ereRangeRegion(.
115f0 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11610 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
11620 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
11630 2a 70 49 64 78 2c 20 20 20 20 20 20 20 20 20 20  *pIdx,          
11640 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
11650 6f 20 63 6f 6e 73 69 64 65 72 20 64 6f 6d 61 69  o consider domai
11660 6e 20 6f 66 20 2a 2f 0a 20 20 73 71 6c 69 74 65  n of */.  sqlite
11670 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 2c 20 20  3_value *pVal,  
11680 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
11690 6f 20 63 6f 6e 73 69 64 65 72 20 2a 2f 0a 20 20  o consider */.  
116a0 69 6e 74 20 2a 70 69 52 65 67 69 6f 6e 20 20 20  int *piRegion   
116b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
116c0 55 54 3a 20 52 65 67 69 6f 6e 20 6f 66 20 64 6f  UT: Region of do
116d0 6d 61 69 6e 20 69 6e 20 77 68 69 63 68 20 76 61  main in which va
116e0 6c 75 65 20 6c 69 65 73 20 2a 2f 0a 29 7b 0a 20  lue lies */.){. 
116f0 20 69 66 28 20 41 4c 57 41 59 53 28 70 56 61 6c   if( ALWAYS(pVal
11700 29 20 29 7b 0a 20 20 20 20 49 6e 64 65 78 53 61  ) ){.    IndexSa
11710 6d 70 6c 65 20 2a 61 53 61 6d 70 6c 65 20 3d 20  mple *aSample = 
11720 70 49 64 78 2d 3e 61 53 61 6d 70 6c 65 3b 0a 20  pIdx->aSample;. 
11730 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
11740 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 73 71    int eType = sq
11750 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
11760 28 70 56 61 6c 29 3b 0a 0a 20 20 20 20 69 66 28  (pVal);..    if(
11770 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 49   eType==SQLITE_I
11780 4e 54 45 47 45 52 20 7c 7c 20 65 54 79 70 65 3d  NTEGER || eType=
11790 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b  =SQLITE_FLOAT ){
117a0 0a 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20  .      double r 
117b0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
117c0 64 6f 75 62 6c 65 28 70 56 61 6c 29 3b 0a 20 20  double(pVal);.  
117d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 53      for(i=0; i<S
117e0 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d 50  QLITE_INDEX_SAMP
117f0 4c 45 53 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  LES; i++){.     
11800 20 20 20 69 66 28 20 61 53 61 6d 70 6c 65 5b 69     if( aSample[i
11810 5d 2e 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ].eType==SQLITE_
11820 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
11830 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 53 61  .        if( aSa
11840 6d 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3e 3d 53  mple[i].eType>=S
11850 51 4c 49 54 45 5f 54 45 58 54 20 7c 7c 20 61 53  QLITE_TEXT || aS
11860 61 6d 70 6c 65 5b 69 5d 2e 75 2e 72 3e 72 20 29  ample[i].u.r>r )
11870 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
11880 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20      }else{ .    
11890 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
118a0 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 20 20  pParse->db;.    
118b0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
118c0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  ;.      const u8
118d0 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e   *z;.      int n
118e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 56 61 6c  ;..      /* pVal
118f0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 73 71 6c 69   comes from sqli
11900 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78 70 72  te3ValueFromExpr
11910 28 29 20 73 6f 20 74 68 65 20 74 79 70 65 20 63  () so the type c
11920 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
11930 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
11940 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 54 45 58  Type==SQLITE_TEX
11950 54 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  T || eType==SQLI
11960 54 45 5f 42 4c 4f 42 20 29 3b 0a 0a 20 20 20 20  TE_BLOB );..    
11970 20 20 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c    if( eType==SQL
11980 49 54 45 5f 42 4c 4f 42 20 29 7b 0a 20 20 20 20  ITE_BLOB ){.    
11990 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75      z = (const u
119a0 38 20 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  8 *)sqlite3_valu
119b0 65 5f 62 6c 6f 62 28 70 56 61 6c 29 3b 0a 20 20  e_blob(pVal);.  
119c0 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62        pColl = db
119d0 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
119e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 6f       assert( pCo
119f0 6c 6c 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  ll->enc==SQLITE_
11a00 55 54 46 38 20 29 3b 0a 20 20 20 20 20 20 7d 65  UTF8 );.      }e
11a10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 6f  lse{.        pCo
11a20 6c 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43  ll = sqlite3GetC
11a30 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
11a40 45 5f 55 54 46 38 2c 20 30 2c 20 2a 70 49 64 78  E_UTF8, 0, *pIdx
11a50 2d 3e 61 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  ->azColl);.     
11a60 20 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20     if( pColl==0 
11a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11a80 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
11a90 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 63 6f  rse, "no such co
11aa0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11ab0 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
11ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ad0 20 2a 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c 29 3b   *pIdx->azColl);
11ae0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
11af0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
11b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11b10 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 75 38 20    z = (const u8 
11b20 2a 29 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  *)sqlite3ValueTe
11b30 78 74 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e  xt(pVal, pColl->
11b40 65 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  enc);.        if
11b50 28 20 21 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  ( !z ){.        
11b60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11b70 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d  NOMEM;.        }
11b80 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11b90 20 7a 20 26 26 20 70 43 6f 6c 6c 20 26 26 20 70   z && pColl && p
11ba0 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 20 20  Coll->xCmp );.  
11bb0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20      }.      n = 
11bc0 73 71 6c 69 74 65 33 56 61 6c 75 65 42 79 74 65  sqlite3ValueByte
11bd0 73 28 70 56 61 6c 2c 20 70 43 6f 6c 6c 2d 3e 65  s(pVal, pColl->e
11be0 6e 63 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  nc);..      for(
11bf0 69 3d 30 3b 20 69 3c 53 51 4c 49 54 45 5f 49 4e  i=0; i<SQLITE_IN
11c00 44 45 58 5f 53 41 4d 50 4c 45 53 3b 20 69 2b 2b  DEX_SAMPLES; i++
11c10 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
11c20 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 53  ;.        int eS
11c30 61 6d 70 6c 65 74 79 70 65 20 3d 20 61 53 61 6d  ampletype = aSam
11c40 70 6c 65 5b 69 5d 2e 65 54 79 70 65 3b 0a 20 20  ple[i].eType;.  
11c50 20 20 20 20 20 20 69 66 28 20 65 53 61 6d 70 6c        if( eSampl
11c60 65 74 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55  etype==SQLITE_NU
11c70 4c 4c 20 7c 7c 20 65 53 61 6d 70 6c 65 74 79 70  LL || eSampletyp
11c80 65 3c 65 54 79 70 65 20 29 20 63 6f 6e 74 69 6e  e<eType ) contin
11c90 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
11ca0 28 65 53 61 6d 70 6c 65 74 79 70 65 21 3d 65 54  (eSampletype!=eT
11cb0 79 70 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ype) ) break;.  
11cc0 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 2d        if( pColl-
11cd0 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  >enc==SQLITE_UTF
11ce0 38 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  8 ){.          r
11cf0 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
11d00 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 61 53 61  Coll->pUser, aSa
11d10 6d 70 6c 65 5b 69 5d 2e 6e 42 79 74 65 2c 20 61  mple[i].nByte, a
11d20 53 61 6d 70 6c 65 5b 69 5d 2e 75 2e 7a 2c 20 6e  Sample[i].u.z, n
11d30 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , z);.        }e
11d40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
11d50 6e 74 20 6e 53 61 6d 70 6c 65 3b 0a 20 20 20 20  nt nSample;.    
11d60 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53 61 6d        char *zSam
11d70 70 6c 65 20 3d 20 73 71 6c 69 74 65 33 55 74 66  ple = sqlite3Utf
11d80 38 74 6f 31 36 28 0a 20 20 20 20 20 20 20 20 20  8to16(.         
11d90 20 20 20 20 20 64 62 2c 20 70 43 6f 6c 6c 2d 3e       db, pColl->
11da0 65 6e 63 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  enc, aSample[i].
11db0 75 2e 7a 2c 20 61 53 61 6d 70 6c 65 5b 69 5d 2e  u.z, aSample[i].
11dc0 6e 42 79 74 65 2c 20 26 6e 53 61 6d 70 6c 65 0a  nByte, &nSample.
11dd0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
11de0 20 20 20 20 20 20 20 69 66 28 20 21 7a 53 61 6d         if( !zSam
11df0 70 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ple ){.         
11e00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
11e10 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
11e20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
11e30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
11e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11e50 20 20 20 20 20 20 72 20 3d 20 70 43 6f 6c 6c 2d        r = pColl-
11e60 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
11e70 65 72 2c 20 6e 53 61 6d 70 6c 65 2c 20 7a 53 61  er, nSample, zSa
11e80 6d 70 6c 65 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20  mple, n, z);.   
11e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
11ea0 46 72 65 65 28 64 62 2c 20 7a 53 61 6d 70 6c 65  Free(db, zSample
11eb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
11ec0 20 20 20 20 20 69 66 28 20 72 3e 30 20 29 20 62       if( r>0 ) b
11ed0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
11ee0 20 20 7d 0a 0a 20 20 20 20 2a 70 69 52 65 67 69    }..    *piRegi
11ef0 6f 6e 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  on = i;.  }.  re
11f00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11f10 7d 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 23 69  }.#endif   /* #i
11f20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11f30 4c 45 5f 53 54 41 54 32 20 2a 2f 0a 0a 2f 2a 0a  LE_STAT2 */../*.
11f40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11f50 20 69 73 20 75 73 65 64 20 74 6f 20 65 73 74 69   is used to esti
11f60 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mate the number 
11f70 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 69 6c  of rows that wil
11f80 6c 20 62 65 20 76 69 73 69 74 65 64 0a 2a 2a 20  l be visited.** 
11f90 62 79 20 73 63 61 6e 6e 69 6e 67 20 61 6e 20 69  by scanning an i
11fa0 6e 64 65 78 20 66 6f 72 20 61 20 72 61 6e 67 65  ndex for a range
11fb0 20 6f 66 20 76 61 6c 75 65 73 2e 20 54 68 65 20   of values. The 
11fc0 72 61 6e 67 65 20 6d 61 79 20 68 61 76 65 20 61  range may have a
11fd0 6e 20 75 70 70 65 72 0a 2a 2a 20 62 6f 75 6e 64  n upper.** bound
11fe0 2c 20 61 20 6c 6f 77 65 72 20 62 6f 75 6e 64 2c  , a lower bound,
11ff0 20 6f 72 20 62 6f 74 68 2e 20 54 68 65 20 57 48   or both. The WH
12000 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73  ERE clause terms
12010 20 74 68 61 74 20 73 65 74 20 74 68 65 20 75 70   that set the up
12020 70 65 72 0a 2a 2a 20 61 6e 64 20 6c 6f 77 65 72  per.** and lower
12030 20 62 6f 75 6e 64 73 20 61 72 65 20 72 65 70 72   bounds are repr
12040 65 73 65 6e 74 65 64 20 62 79 20 70 4c 6f 77 65  esented by pLowe
12050 72 20 61 6e 64 20 70 55 70 70 65 72 20 72 65 73  r and pUpper res
12060 70 65 63 74 69 76 65 6c 79 2e 20 46 6f 72 0a 2a  pectively. For.*
12070 2a 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75 6d  * example, assum
12080 69 6e 67 20 74 68 61 74 20 69 6e 64 65 78 20 70  ing that index p
12090 20 69 73 20 6f 6e 20 74 31 28 61 29 3a 0a 2a 2a   is on t1(a):.**
120a0 0a 2a 2a 20 20 20 2e 2e 2e 20 46 52 4f 4d 20 74  .**   ... FROM t
120b0 31 20 57 48 45 52 45 20 61 20 3e 20 3f 20 41 4e  1 WHERE a > ? AN
120c0 44 20 61 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a 20 20  D a < ? ....**  
120d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120e0 20 20 7c 5f 5f 5f 5f 5f 7c 20 20 20 7c 5f 5f 5f    |_____|   |___
120f0 5f 5f 7c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  __|.**          
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 20               |  
12110 20 20 20 20 20 20 20 7c 0a 2a 2a 20 20 20 20 20         |.**     
12120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12130 70 4c 6f 77 65 72 20 20 20 20 70 55 70 70 65 72  pLower    pUpper
12140 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
12150 20 6f 66 20 74 68 65 20 75 70 70 65 72 20 6f 72   of the upper or
12160 20 6c 6f 77 65 72 20 62 6f 75 6e 64 20 69 73 20   lower bound is 
12170 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 74 68 65  not present, the
12180 6e 20 4e 55 4c 4c 20 69 73 20 70 61 73 73 65 64  n NULL is passed
12190 20 69 6e 0a 2a 2a 20 70 6c 61 63 65 20 6f 66 20   in.** place of 
121a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
121b0 67 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a  g WhereTerm..**.
121c0 2a 2a 20 54 68 65 20 6e 45 71 20 70 61 72 61 6d  ** The nEq param
121d0 65 74 65 72 20 69 73 20 70 61 73 73 65 64 20 74  eter is passed t
121e0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
121f0 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 73 75 62  index column sub
12200 6a 65 63 74 20 74 6f 20 74 68 65 0a 2a 2a 20 72  ject to the.** r
12210 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74 2e  ange constraint.
12220 20 4f 72 2c 20 65 71 75 69 76 61 6c 65 6e 74 6c   Or, equivalentl
12230 79 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  y, the number of
12240 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
12250 61 69 6e 74 73 0a 2a 2a 20 6f 70 74 69 6d 69 7a  aints.** optimiz
12260 65 64 20 62 79 20 74 68 65 20 70 72 6f 70 6f 73  ed by the propos
12270 65 64 20 69 6e 64 65 78 20 73 63 61 6e 2e 20 46  ed index scan. F
12280 6f 72 20 65 78 61 6d 70 6c 65 2c 20 61 73 73 75  or example, assu
12290 6d 69 6e 67 20 69 6e 64 65 78 20 70 20 69 73 0a  ming index p is.
122a0 2a 2a 20 6f 6e 20 74 31 28 61 2c 20 62 29 2c 20  ** on t1(a, b), 
122b0 61 6e 64 20 74 68 65 20 53 51 4c 20 71 75 65 72  and the SQL quer
122c0 79 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e  y is:.**.**   ..
122d0 2e 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  . FROM t1 WHERE 
122e0 61 20 3d 20 3f 20 41 4e 44 20 62 20 3e 20 3f 20  a = ? AND b > ? 
122f0 41 4e 44 20 62 20 3c 20 3f 20 2e 2e 2e 0a 2a 2a  AND b < ? ....**
12300 0a 2a 2a 20 74 68 65 6e 20 6e 45 71 20 73 68 6f  .** then nEq sho
12310 75 6c 64 20 62 65 20 70 61 73 73 65 64 20 74 68  uld be passed th
12320 65 20 76 61 6c 75 65 20 31 20 28 61 73 20 74 68  e value 1 (as th
12330 65 20 72 61 6e 67 65 20 72 65 73 74 72 69 63 74  e range restrict
12340 65 64 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 62 2c  ed column,.** b,
12350 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64 20 6c   is the second l
12360 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20  eft-most column 
12370 6f 66 20 74 68 65 20 69 6e 64 65 78 29 2e 20 4f  of the index). O
12380 72 2c 20 69 66 20 74 68 65 20 71 75 65 72 79 20  r, if the query 
12390 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2e 2e 2e 20  is:.**.**   ... 
123a0 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 20  FROM t1 WHERE a 
123b0 3e 20 3f 20 41 4e 44 20 61 20 3c 20 3f 20 2e 2e  > ? AND a < ? ..
123c0 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20 6e 45 71  ..**.** then nEq
123d0 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65   should be passe
123e0 64 20 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  d 0..**.** The r
123f0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
12400 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
12410 65 65 6e 20 31 20 61 6e 64 20 31 30 30 2c 20 69  een 1 and 100, i
12420 6e 63 6c 75 73 69 76 65 2e 20 41 20 72 65 74 75  nclusive. A retu
12430 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 31  rn.** value of 1
12440 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
12450 74 68 65 20 70 72 6f 70 6f 73 65 64 20 72 61 6e  the proposed ran
12460 67 65 20 73 63 61 6e 20 69 73 20 65 78 70 65 63  ge scan is expec
12470 74 65 64 20 74 6f 20 76 69 73 69 74 0a 2a 2a 20  ted to visit.** 
12480 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 20 31 2f  approximately 1/
12490 31 30 30 74 68 20 28 31 25 29 20 6f 66 20 74 68  100th (1%) of th
124a0 65 20 72 6f 77 73 20 73 65 6c 65 63 74 65 64 20  e rows selected 
124b0 62 79 20 74 68 65 20 6e 45 71 20 65 71 75 61 6c  by the nEq equal
124c0 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
124d0 74 73 20 28 69 66 20 61 6e 79 29 2e 20 41 20 72  ts (if any). A r
124e0 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 31  eturn value of 1
124f0 30 30 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  00 indicates tha
12500 74 20 69 74 20 69 73 20 65 78 70 65 63 74 65 64  t it is expected
12510 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 72 61 6e  .** that the ran
12520 67 65 20 73 63 61 6e 20 77 69 6c 6c 20 76 69 73  ge scan will vis
12530 69 74 20 65 76 65 72 79 20 72 6f 77 20 28 31 30  it every row (10
12540 30 25 29 20 73 65 6c 65 63 74 65 64 20 62 79 20  0%) selected by 
12550 74 68 65 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20  the equality.** 
12560 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 2a 2a 0a  constraints..**.
12570 2a 2a 20 49 6e 20 74 68 65 20 61 62 73 65 6e 63  ** In the absenc
12580 65 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  e of sqlite_stat
12590 32 20 41 4e 41 4c 59 5a 45 20 64 61 74 61 2c 20  2 ANALYZE data, 
125a0 65 61 63 68 20 72 61 6e 67 65 20 69 6e 65 71 75  each range inequ
125b0 61 6c 69 74 79 0a 2a 2a 20 72 65 64 75 63 65 73  ality.** reduces
125c0 20 74 68 65 20 73 65 61 72 63 68 20 73 70 61 63   the search spac
125d0 65 20 62 79 20 32 2f 33 72 64 73 2e 20 20 48 65  e by 2/3rds.  He
125e0 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e  nce a single con
125f0 73 74 72 61 69 6e 74 20 28 78 3e 3f 29 0a 2a 2a  straint (x>?).**
12600 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 72 65   results in a re
12610 74 75 72 6e 20 6f 66 20 33 33 20 61 6e 64 20 61  turn of 33 and a
12620 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e   range constrain
12630 74 20 28 78 3e 3f 20 41 4e 44 20 78 3c 3f 29 20  t (x>? AND x<?) 
12640 72 65 73 75 6c 74 73 0a 2a 2a 20 69 6e 20 61 20  results.** in a 
12650 72 65 74 75 72 6e 20 6f 66 20 31 31 2e 0a 2a 2f  return of 11..*/
12660 0a 73 74 61 74 69 63 20 69 6e 74 20 77 68 65 72  .static int wher
12670 65 52 61 6e 67 65 53 63 61 6e 45 73 74 28 0a 20  eRangeScanEst(. 
12680 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
12690 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
126a0 20 26 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69   & code generati
126b0 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
126c0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
126d0 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
126e0 78 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  x containing the
126f0 20 72 61 6e 67 65 2d 63 6f 6d 70 61 72 65 64 20   range-compared 
12700 63 6f 6c 75 6d 6e 3b 20 22 78 22 20 2a 2f 0a 20  column; "x" */. 
12710 20 69 6e 74 20 6e 45 71 2c 20 20 20 20 20 20 20   int nEq,       
12720 20 20 20 20 20 20 2f 2a 20 69 6e 64 65 78 20 69        /* index i
12730 6e 74 6f 20 70 2d 3e 61 43 6f 6c 5b 5d 20 6f 66  nto p->aCol[] of
12740 20 74 68 65 20 72 61 6e 67 65 2d 63 6f 6d 70 61   the range-compa
12750 72 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  red column */.  
12760 57 68 65 72 65 54 65 72 6d 20 2a 70 4c 6f 77 65  WhereTerm *pLowe
12770 72 2c 20 20 20 2f 2a 20 4c 6f 77 65 72 20 62 6f  r,   /* Lower bo
12780 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67 65  und on the range
12790 2e 20 65 78 3a 20 22 78 3e 31 32 33 22 20 4d 69  . ex: "x>123" Mi
127a0 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20  ght be NULL */. 
127b0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 55 70 70   WhereTerm *pUpp
127c0 65 72 2c 20 20 20 2f 2a 20 55 70 70 65 72 20 62  er,   /* Upper b
127d0 6f 75 6e 64 20 6f 6e 20 74 68 65 20 72 61 6e 67  ound on the rang
127e0 65 2e 20 65 78 3a 20 22 78 3c 34 35 35 22 20 4d  e. ex: "x<455" M
127f0 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
12800 20 20 69 6e 74 20 2a 70 69 45 73 74 20 20 20 20    int *piEst    
12810 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
12820 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 29  eturn value */.)
12830 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
12840 49 54 45 5f 4f 4b 3b 0a 0a 23 69 66 64 65 66 20  ITE_OK;..#ifdef 
12850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
12860 41 54 32 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  AT2.  sqlite3 *d
12870 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
12880 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
12890 2a 70 4c 6f 77 65 72 56 61 6c 20 3d 20 30 3b 0a  *pLowerVal = 0;.
128a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
128b0 2a 70 55 70 70 65 72 56 61 6c 20 3d 20 30 3b 0a  *pUpperVal = 0;.
128c0 0a 20 20 69 66 28 20 6e 45 71 3d 3d 30 20 26 26  .  if( nEq==0 &&
128d0 20 70 2d 3e 61 53 61 6d 70 6c 65 20 29 7b 0a 20   p->aSample ){. 
128e0 20 20 20 69 6e 74 20 69 45 73 74 3b 0a 20 20 20     int iEst;.   
128f0 20 69 6e 74 20 69 55 70 70 65 72 3b 0a 20 20 20   int iUpper;.   
12900 20 69 6e 74 20 69 4c 6f 77 65 72 3b 0a 20 20 20   int iLower;.   
12910 20 75 38 20 61 66 66 20 3d 20 70 2d 3e 70 54 61   u8 aff = p->pTa
12920 62 6c 65 2d 3e 61 43 6f 6c 5b 30 5d 2e 61 66 66  ble->aCol[0].aff
12930 69 6e 69 74 79 3b 0a 0a 20 20 20 20 69 66 28 20  inity;..    if( 
12940 70 4c 6f 77 65 72 20 29 7b 0a 20 20 20 20 20 20  pLower ){.      
12950 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4c  Expr *pExpr = pL
12960 6f 77 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69  ower->pExpr->pRi
12970 67 68 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ght;.      rc = 
12980 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d  sqlite3ValueFrom
12990 45 78 70 72 28 64 62 2c 20 70 45 78 70 72 2c 20  Expr(db, pExpr, 
129a0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66  SQLITE_UTF8, aff
129b0 2c 20 26 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20  , &pLowerVal);. 
129c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
129d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 55  =SQLITE_OK && pU
129e0 70 70 65 72 20 29 7b 0a 20 20 20 20 20 20 45 78  pper ){.      Ex
129f0 70 72 20 2a 70 45 78 70 72 20 3d 20 70 55 70 70  pr *pExpr = pUpp
12a00 65 72 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68  er->pExpr->pRigh
12a10 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
12a20 6c 69 74 65 33 56 61 6c 75 65 46 72 6f 6d 45 78  lite3ValueFromEx
12a30 70 72 28 64 62 2c 20 70 45 78 70 72 2c 20 53 51  pr(db, pExpr, SQ
12a40 4c 49 54 45 5f 55 54 46 38 2c 20 61 66 66 2c 20  LITE_UTF8, aff, 
12a50 26 70 55 70 70 65 72 56 61 6c 29 3b 0a 20 20 20  &pUpperVal);.   
12a60 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
12a70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 4c  SQLITE_OK || (pL
12a80 6f 77 65 72 56 61 6c 3d 3d 30 20 26 26 20 70 55  owerVal==0 && pU
12a90 70 70 65 72 56 61 6c 3d 3d 30 29 20 29 7b 0a 20  pperVal==0) ){. 
12aa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
12ab0 65 46 72 65 65 28 70 4c 6f 77 65 72 56 61 6c 29  eFree(pLowerVal)
12ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
12ad0 61 6c 75 65 46 72 65 65 28 70 55 70 70 65 72 56  alueFree(pUpperV
12ae0 61 6c 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  al);.      goto 
12af0 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c 6c 62 61  range_est_fallba
12b00 63 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ck;.    }else if
12b10 28 20 70 4c 6f 77 65 72 56 61 6c 3d 3d 30 20 29  ( pLowerVal==0 )
12b20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
12b30 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
12b40 61 72 73 65 2c 20 70 2c 20 70 55 70 70 65 72 56  arse, p, pUpperV
12b50 61 6c 2c 20 26 69 55 70 70 65 72 29 3b 0a 20 20  al, &iUpper);.  
12b60 20 20 20 20 69 4c 6f 77 65 72 20 3d 20 70 4c 6f      iLower = pLo
12b70 77 65 72 20 3f 20 69 55 70 70 65 72 2f 32 20 3a  wer ? iUpper/2 :
12b80 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
12b90 28 20 70 55 70 70 65 72 56 61 6c 3d 3d 30 20 29  ( pUpperVal==0 )
12ba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 68 65  {.      rc = whe
12bb0 72 65 52 61 6e 67 65 52 65 67 69 6f 6e 28 70 50  reRangeRegion(pP
12bc0 61 72 73 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56  arse, p, pLowerV
12bd0 61 6c 2c 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20  al, &iLower);.  
12be0 20 20 20 20 69 55 70 70 65 72 20 3d 20 70 55 70      iUpper = pUp
12bf0 70 65 72 20 3f 20 28 69 4c 6f 77 65 72 20 2b 20  per ? (iLower + 
12c00 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 53 41 4d  SQLITE_INDEX_SAM
12c10 50 4c 45 53 20 2b 20 31 29 2f 32 20 0a 20 20 20  PLES + 1)/2 .   
12c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c30 20 20 20 3a 20 53 51 4c 49 54 45 5f 49 4e 44 45     : SQLITE_INDE
12c40 58 5f 53 41 4d 50 4c 45 53 3b 0a 20 20 20 20 7d  X_SAMPLES;.    }
12c50 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
12c60 20 77 68 65 72 65 52 61 6e 67 65 52 65 67 69 6f   whereRangeRegio
12c70 6e 28 70 50 61 72 73 65 2c 20 70 2c 20 70 55 70  n(pParse, p, pUp
12c80 70 65 72 56 61 6c 2c 20 26 69 55 70 70 65 72 29  perVal, &iUpper)
12c90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
12ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12cb0 20 20 20 20 20 72 63 20 3d 20 77 68 65 72 65 52       rc = whereR
12cc0 61 6e 67 65 52 65 67 69 6f 6e 28 70 50 61 72 73  angeRegion(pPars
12cd0 65 2c 20 70 2c 20 70 4c 6f 77 65 72 56 61 6c 2c  e, p, pLowerVal,
12ce0 20 26 69 4c 6f 77 65 72 29 3b 0a 20 20 20 20 20   &iLower);.     
12cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12d00 69 4c 6f 77 65 72 20 3d 20 30 3b 0a 20 20 20 20  iLower = 0;.    
12d10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
12d20 45 73 74 20 3d 20 69 55 70 70 65 72 20 2d 20 69  Est = iUpper - i
12d30 4c 6f 77 65 72 3b 0a 20 20 20 20 69 66 28 20 69  Lower;.    if( i
12d40 45 73 74 3e 53 51 4c 49 54 45 5f 49 4e 44 45 58  Est>SQLITE_INDEX
12d50 5f 53 41 4d 50 4c 45 53 20 29 7b 0a 20 20 20 20  _SAMPLES ){.    
12d60 20 20 69 45 73 74 20 3d 20 53 51 4c 49 54 45 5f    iEst = SQLITE_
12d70 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a 20  INDEX_SAMPLES;. 
12d80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 45 73     }else if( iEs
12d90 74 3c 31 20 29 7b 0a 20 20 20 20 20 20 69 45 73  t<1 ){.      iEs
12da0 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  t = 1;.    }..  
12db0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
12dc0 65 65 28 70 4c 6f 77 65 72 56 61 6c 29 3b 0a 20  ee(pLowerVal);. 
12dd0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
12de0 72 65 65 28 70 55 70 70 65 72 56 61 6c 29 3b 0a  ree(pUpperVal);.
12df0 20 20 20 20 2a 70 69 45 73 74 20 3d 20 28 69 45      *piEst = (iE
12e00 73 74 20 2a 20 31 30 30 29 2f 53 51 4c 49 54 45  st * 100)/SQLITE
12e10 5f 49 4e 44 45 58 5f 53 41 4d 50 4c 45 53 3b 0a  _INDEX_SAMPLES;.
12e20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12e30 20 7d 0a 72 61 6e 67 65 5f 65 73 74 5f 66 61 6c   }.range_est_fal
12e40 6c 62 61 63 6b 3a 0a 23 65 6e 64 69 66 0a 20 20  lback:.#endif.  
12e50 61 73 73 65 72 74 28 20 70 4c 6f 77 65 72 20 7c  assert( pLower |
12e60 7c 20 70 55 70 70 65 72 20 29 3b 0a 20 20 69 66  | pUpper );.  if
12e70 28 20 70 4c 6f 77 65 72 20 26 26 20 70 55 70 70  ( pLower && pUpp
12e80 65 72 20 29 7b 0a 20 20 20 20 2a 70 69 45 73 74  er ){.    *piEst
12e90 20 3d 20 31 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = 11;.  }else{.
12ea0 20 20 20 20 2a 70 69 45 73 74 20 3d 20 33 33 3b      *piEst = 33;
12eb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12ec0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  ;.}.../*.** Find
12ed0 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e 20   the query plan 
12ee0 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20  for accessing a 
12ef0 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65  particular table
12f00 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
12f10 62 65 73 74 20 71 75 65 72 79 20 70 6c 61 6e 20  best query plan 
12f20 61 6e 64 20 69 74 73 20 63 6f 73 74 20 69 6e 74  and its cost int
12f30 6f 20 74 68 65 20 57 68 65 72 65 43 6f 73 74 20  o the WhereCost 
12f40 6f 62 6a 65 63 74 20 73 75 70 70 6c 69 65 64 20  object supplied 
12f50 61 73 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70  as the.** last p
12f60 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
12f70 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  The lowest cost 
12f80 70 6c 61 6e 20 77 69 6e 73 2e 20 20 54 68 65 20  plan wins.  The 
12f90 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74 69 6d  cost is an estim
12fa0 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f 75 6e  ate of the amoun
12fb0 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e 64 20  t of.** CPU and 
12fc0 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20 74 6f  disk I/O need to
12fd0 20 70 72 6f 63 65 73 73 20 74 68 65 20 72 65 71   process the req
12fe0 75 65 73 74 20 75 73 69 6e 67 20 74 68 65 20 73  uest using the s
12ff0 65 6c 65 63 74 65 64 20 70 6c 61 6e 2e 0a 2a 2a  elected plan..**
13000 20 46 61 63 74 6f 72 73 20 74 68 61 74 20 69 6e   Factors that in
13010 66 6c 75 65 6e 63 65 20 63 6f 73 74 20 69 6e 63  fluence cost inc
13020 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  lude:.**.**    *
13030 20 20 54 68 65 20 65 73 74 69 6d 61 74 65 64 20    The estimated 
13040 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 74  number of rows t
13050 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 72  hat will be retr
13060 69 65 76 65 64 2e 20 20 28 54 68 65 0a 2a 2a 20  ieved.  (The.** 
13070 20 20 20 20 20 20 66 65 77 65 72 20 74 68 65 20        fewer the 
13080 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a 2a 20 20  better.).**.**  
13090 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20    *  Whether or 
130a0 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d 75 73 74  not sorting must
130b0 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20 20 20   occur..**.**   
130c0 20 2a 20 20 57 68 65 74 68 65 72 20 6f 72 20 6e   *  Whether or n
130d0 6f 74 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  ot there must be
130e0 20 73 65 70 61 72 61 74 65 20 6c 6f 6f 6b 75 70   separate lookup
130f0 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  s in the.**     
13100 20 20 69 6e 64 65 78 20 61 6e 64 20 69 6e 20 74    index and in t
13110 68 65 20 6d 61 69 6e 20 74 61 62 6c 65 2e 0a 2a  he main table..*
13120 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 77 61  *.** If there wa
13130 73 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20  s an INDEXED BY 
13140 63 6c 61 75 73 65 20 28 70 53 72 63 2d 3e 70 49  clause (pSrc->pI
13150 6e 64 65 78 29 20 61 74 74 61 63 68 65 64 20 74  ndex) attached t
13160 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 0a 2a  o the table in.*
13170 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * the SQL statem
13180 65 6e 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ent, then this f
13190 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 63 6f 6e  unction only con
131a0 73 69 64 65 72 73 20 70 6c 61 6e 73 20 75 73 69  siders plans usi
131b0 6e 67 20 74 68 65 20 0a 2a 2a 20 6e 61 6d 65 64  ng the .** named
131c0 20 69 6e 64 65 78 2e 20 49 66 20 6e 6f 20 73 75   index. If no su
131d0 63 68 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e 64  ch plan is found
131e0 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
131f0 6e 65 64 20 63 6f 73 74 20 69 73 0a 2a 2a 20 53  ned cost is.** S
13200 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2e 20 49  QLITE_BIG_DBL. I
13210 66 20 61 20 70 6c 61 6e 20 69 73 20 66 6f 75 6e  f a plan is foun
13220 64 20 74 68 61 74 20 75 73 65 73 20 74 68 65 20  d that uses the 
13230 6e 61 6d 65 64 20 69 6e 64 65 78 2c 20 0a 2a 2a  named index, .**
13240 20 74 68 65 6e 20 74 68 65 20 63 6f 73 74 20 69   then the cost i
13250 73 20 63 61 6c 63 75 6c 61 74 65 64 20 69 6e 20  s calculated in 
13260 74 68 65 20 75 73 75 61 6c 20 77 61 79 2e 0a 2a  the usual way..*
13270 2a 0a 2a 2a 20 49 66 20 61 20 4e 4f 54 20 49 4e  *.** If a NOT IN
13280 44 45 58 45 44 20 63 6c 61 75 73 65 20 28 70 53  DEXED clause (pS
13290 72 63 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 21 3d  rc->notIndexed!=
132a0 30 29 20 77 61 73 20 61 74 74 61 63 68 65 64 20  0) was attached 
132b0 74 6f 20 74 68 65 20 74 61 62 6c 65 20 0a 2a 2a  to the table .**
132c0 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
132d0 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 6e  tatement, then n
132e0 6f 20 69 6e 64 65 78 65 73 20 61 72 65 20 63 6f  o indexes are co
132f0 6e 73 69 64 65 72 65 64 2e 20 48 6f 77 65 76 65  nsidered. Howeve
13300 72 2c 20 74 68 65 20 0a 2a 2a 20 73 65 6c 65 63  r, the .** selec
13310 74 65 64 20 70 6c 61 6e 20 6d 61 79 20 73 74 69  ted plan may sti
13320 6c 6c 20 74 61 6b 65 20 61 64 76 61 6e 74 61 67  ll take advantag
13330 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 73 20  e of the tables 
13340 62 75 69 6c 74 2d 69 6e 20 72 6f 77 69 64 0a 2a  built-in rowid.*
13350 2a 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  * index..*/.stat
13360 69 63 20 76 6f 69 64 20 62 65 73 74 42 74 72 65  ic void bestBtre
13370 65 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  eIndex(.  Parse 
13380 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
13390 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
133a0 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
133b0 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
133c0 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
133d0 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
133e0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
133f0 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
13400 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
13410 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
13420 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
13430 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
13440 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
13450 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
13460 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
13470 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
13480 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
13490 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
134a0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
134b0 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
134c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
134d0 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
134e0 61 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  an */.){.  int i
134f0 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
13500 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
13510 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
13520 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
13530 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
13540 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
13550 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
13560 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
13570 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
13580 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13590 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 50 72 6f   /* Copy of pPro
135a0 62 65 2c 20 6f 72 20 7a 65 72 6f 20 66 6f 72 20  be, or zero for 
135b0 49 50 4b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69  IPK index */.  i
135c0 6e 74 20 65 71 54 65 72 6d 4d 61 73 6b 3b 20 20  nt eqTermMask;  
135d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
135e0 72 72 65 6e 74 20 6d 61 73 6b 20 6f 66 20 76 61  rrent mask of va
135f0 6c 69 64 20 65 71 75 61 6c 69 74 79 20 6f 70 65  lid equality ope
13600 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  rators */.  int 
13610 69 64 78 45 71 54 65 72 6d 4d 61 73 6b 3b 20 20  idxEqTermMask;  
13620 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13630 20 6d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20 65   mask of valid e
13640 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f 72  quality operator
13650 73 20 2a 2f 0a 20 20 49 6e 64 65 78 20 73 50 6b  s */.  Index sPk
13660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13670 20 20 20 2f 2a 20 41 20 66 61 6b 65 20 69 6e 64     /* A fake ind
13680 65 78 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  ex object for th
13690 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20 2a 2f  e primary key */
136a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
136b0 61 69 52 6f 77 45 73 74 50 6b 5b 32 5d 3b 20 2f  aiRowEstPk[2]; /
136c0 2a 20 54 68 65 20 61 69 52 6f 77 45 73 74 5b 5d  * The aiRowEst[]
136d0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
136e0 50 6b 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  Pk index */.  in
136f0 74 20 61 69 43 6f 6c 75 6d 6e 50 6b 20 3d 20 2d  t aiColumnPk = -
13700 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  1;        /* The
13710 20 61 43 6f 6c 75 6d 6e 5b 5d 20 76 61 6c 75 65   aColumn[] value
13720 20 66 6f 72 20 74 68 65 20 73 50 6b 20 69 6e 64   for the sPk ind
13730 65 78 20 2a 2f 0a 20 20 69 6e 74 20 77 73 46 6c  ex */.  int wsFl
13740 61 67 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  agMask;         
13750 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 65 64 20 66      /* Allowed f
13760 6c 61 67 73 20 69 6e 20 70 43 6f 73 74 2d 3e 70  lags in pCost->p
13770 6c 61 6e 2e 77 73 46 6c 61 67 20 2a 2f 0a 0a 20  lan.wsFlag */.. 
13780 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
13790 68 65 20 63 6f 73 74 20 74 6f 20 61 20 77 6f 72  he cost to a wor
137a0 73 74 2d 63 61 73 65 20 76 61 6c 75 65 20 2a 2f  st-case value */
137b0 0a 20 20 6d 65 6d 73 65 74 28 70 43 6f 73 74 2c  .  memset(pCost,
137c0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 43 6f 73   0, sizeof(*pCos
137d0 74 29 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 72 43  t));.  pCost->rC
137e0 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
137f0 5f 44 42 4c 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  _DBL;..  /* If t
13800 68 65 20 70 53 72 63 20 74 61 62 6c 65 20 69 73  he pSrc table is
13810 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
13820 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 20   of a LEFT JOIN 
13830 74 68 65 6e 20 77 65 20 6d 61 79 20 6e 6f 74 0a  then we may not.
13840 20 20 2a 2a 20 75 73 65 20 61 6e 20 69 6e 64 65    ** use an inde
13850 78 20 74 6f 20 73 61 74 69 73 66 79 20 49 53 20  x to satisfy IS 
13860 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73  NULL constraints
13870 20 6f 6e 20 74 68 61 74 20 74 61 62 6c 65 2e 20   on that table. 
13880 20 54 68 69 73 20 69 73 0a 20 20 2a 2a 20 62 65   This is.  ** be
13890 63 61 75 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 69  cause columns mi
138a0 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
138b0 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 74 61 62   NULL if the tab
138c0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  le does not matc
138d0 68 20 2d 0a 20 20 2a 2a 20 61 20 63 69 72 63 75  h -.  ** a circu
138e0 6d 73 74 61 6e 63 65 20 77 68 69 63 68 20 74 68  mstance which th
138f0 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 68  e index cannot h
13900 65 6c 70 20 75 73 20 64 69 73 63 6f 76 65 72 2e  elp us discover.
13910 20 20 54 69 63 6b 65 74 20 23 32 31 37 37 2e 0a    Ticket #2177..
13920 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 72 63 2d    */.  if( pSrc-
13930 3e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c  >jointype & JT_L
13940 45 46 54 20 29 7b 0a 20 20 20 20 69 64 78 45 71  EFT ){.    idxEq
13950 54 65 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51  TermMask = WO_EQ
13960 7c 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b  |WO_IN;.  }else{
13970 0a 20 20 20 20 69 64 78 45 71 54 65 72 6d 4d 61  .    idxEqTermMa
13980 73 6b 20 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  sk = WO_EQ|WO_IN
13990 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a 20 20 7d 0a  |WO_ISNULL;.  }.
139a0 0a 20 20 69 66 28 20 70 53 72 63 2d 3e 70 49 6e  .  if( pSrc->pIn
139b0 64 65 78 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e  dex ){.    /* An
139c0 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61 75   INDEXED BY clau
139d0 73 65 20 73 70 65 63 69 66 69 65 73 20 61 20 70  se specifies a p
139e0 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 20  articular index 
139f0 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 70 49  to use */.    pI
13a00 64 78 20 3d 20 70 50 72 6f 62 65 20 3d 20 70 53  dx = pProbe = pS
13a10 72 63 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  rc->pIndex;.    
13a20 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
13a30 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
13a40 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
13a50 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
13a60 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
13a70 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
13a80 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20 49 4e  * There is no IN
13a90 44 45 58 45 44 20 42 59 20 63 6c 61 75 73 65 2e  DEXED BY clause.
13aa0 20 20 43 72 65 61 74 65 20 61 20 66 61 6b 65 20    Create a fake 
13ab0 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 74 6f 0a  Index object to.
13ac0 20 20 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74      ** represent
13ad0 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79   the primary key
13ae0 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
13af0 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20  First;          
13b00 20 20 20 20 20 20 2f 2a 20 41 6e 79 20 6f 74 68        /* Any oth
13b10 65 72 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  er index on the 
13b20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 6d 65 6d  table */.    mem
13b30 73 65 74 28 26 73 50 6b 2c 20 30 2c 20 73 69 7a  set(&sPk, 0, siz
13b40 65 6f 66 28 49 6e 64 65 78 29 29 3b 0a 20 20 20  eof(Index));.   
13b50 20 73 50 6b 2e 6e 43 6f 6c 75 6d 6e 20 3d 20 31   sPk.nColumn = 1
13b60 3b 0a 20 20 20 20 73 50 6b 2e 61 69 43 6f 6c 75  ;.    sPk.aiColu
13b70 6d 6e 20 3d 20 26 61 69 43 6f 6c 75 6d 6e 50 6b  mn = &aiColumnPk
13b80 3b 0a 20 20 20 20 73 50 6b 2e 61 69 52 6f 77 45  ;.    sPk.aiRowE
13b90 73 74 20 3d 20 61 69 52 6f 77 45 73 74 50 6b 3b  st = aiRowEstPk;
13ba0 0a 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b  .    aiRowEstPk[
13bb0 31 5d 20 3d 20 31 3b 0a 20 20 20 20 73 50 6b 2e  1] = 1;.    sPk.
13bc0 6f 6e 45 72 72 6f 72 20 3d 20 4f 45 5f 52 65 70  onError = OE_Rep
13bd0 6c 61 63 65 3b 0a 20 20 20 20 73 50 6b 2e 70 54  lace;.    sPk.pT
13be0 61 62 6c 65 20 3d 20 70 53 72 63 2d 3e 70 54 61  able = pSrc->pTa
13bf0 62 3b 0a 20 20 20 20 70 46 69 72 73 74 20 3d 20  b;.    pFirst = 
13c00 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
13c10 65 78 3b 0a 20 20 20 20 69 66 28 20 70 53 72 63  ex;.    if( pSrc
13c20 2d 3e 6e 6f 74 49 6e 64 65 78 65 64 3d 3d 30 20  ->notIndexed==0 
13c30 29 7b 0a 20 20 20 20 20 20 73 50 6b 2e 70 4e 65  ){.      sPk.pNe
13c40 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
13c50 20 7d 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 69   }.    /* The ai
13c60 52 6f 77 45 73 74 50 6b 5b 30 5d 20 69 73 20 61  RowEstPk[0] is a
13c70 6e 20 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68  n estimate of th
13c80 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
13c90 66 20 72 6f 77 73 20 69 6e 20 74 68 65 0a 20 20  f rows in the.  
13ca0 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 47 65 74    ** table.  Get
13cb0 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   this informatio
13cc0 6e 20 66 72 6f 6d 20 74 68 65 20 41 4e 41 4c 59  n from the ANALY
13cd0 5a 45 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ZE information i
13ce0 66 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 61  f it is.    ** a
13cf0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 6e 6f  vailable.  If no
13d00 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 61 73 73  t available, ass
13d10 75 6d 65 20 74 68 65 20 74 61 62 6c 65 20 31 20  ume the table 1 
13d20 6d 69 6c 6c 69 6f 6e 20 72 6f 77 73 20 69 6e 20  million rows in 
13d30 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
13d40 20 69 66 28 20 70 46 69 72 73 74 20 29 7b 0a 20   if( pFirst ){. 
13d50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69       assert( pFi
13d60 72 73 74 2d 3e 61 69 52 6f 77 45 73 74 21 3d 30  rst->aiRowEst!=0
13d70 20 29 3b 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64   ); /* Allocated
13d80 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 70   together with p
13d90 46 69 72 73 74 20 2a 2f 0a 20 20 20 20 20 20 61  First */.      a
13da0 69 52 6f 77 45 73 74 50 6b 5b 30 5d 20 3d 20 70  iRowEstPk[0] = p
13db0 46 69 72 73 74 2d 3e 61 69 52 6f 77 45 73 74 5b  First->aiRowEst[
13dc0 30 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0];.    }else{. 
13dd0 20 20 20 20 20 61 69 52 6f 77 45 73 74 50 6b 5b       aiRowEstPk[
13de0 30 5d 20 3d 20 31 30 30 30 30 30 30 3b 0a 20 20  0] = 1000000;.  
13df0 20 20 7d 0a 20 20 20 20 70 50 72 6f 62 65 20 3d    }.    pProbe =
13e00 20 26 73 50 6b 3b 0a 20 20 20 20 77 73 46 6c 61   &sPk;.    wsFla
13e10 67 4d 61 73 6b 20 3d 20 7e 28 0a 20 20 20 20 20  gMask = ~(.     
13e20 20 20 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f     WHERE_COLUMN_
13e30 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
13e40 45 51 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  EQ|WHERE_COLUMN_
13e50 4e 55 4c 4c 7c 57 48 45 52 45 5f 43 4f 4c 55 4d  NULL|WHERE_COLUM
13e60 4e 5f 52 41 4e 47 45 0a 20 20 20 20 29 3b 0a 20  N_RANGE.    );. 
13e70 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20 3d 20     eqTermMask = 
13e80 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20 20 20  WO_EQ|WO_IN;.   
13e90 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a   pIdx = 0;.  }..
13ea0 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61    /* Loop over a
13eb0 6c 6c 20 69 6e 64 69 63 65 73 20 6c 6f 6f 6b 69  ll indices looki
13ec0 6e 67 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ng for the best 
13ed0 6f 6e 65 20 74 6f 20 75 73 65 0a 20 20 2a 2f 0a  one to use.  */.
13ee0 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b 20    for(; pProbe; 
13ef0 70 49 64 78 3d 70 50 72 6f 62 65 3d 70 50 72 6f  pIdx=pProbe=pPro
13f00 62 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  be->pNext){.    
13f10 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 69  const unsigned i
13f20 6e 74 20 2a 20 63 6f 6e 73 74 20 61 69 52 6f 77  nt * const aiRow
13f30 45 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  Est = pProbe->ai
13f40 52 6f 77 45 73 74 3b 0a 20 20 20 20 64 6f 75 62  RowEst;.    doub
13f50 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20  le cost;        
13f60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
13f70 6f 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20  of using pProbe 
13f80 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6e 52  */.    double nR
13f90 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ow;             
13fa0 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20     /* Estimated 
13fb0 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69  number of rows i
13fc0 6e 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a  n result set */.
13fd0 20 20 20 20 69 6e 74 20 72 65 76 3b 20 20 20 20      int rev;    
13fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ff0 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e 20  /* True to scan 
14000 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
14010 20 2a 2f 0a 20 20 20 20 69 6e 74 20 77 73 46 6c   */.    int wsFl
14020 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 42 69 74  ags = 0;.    Bit
14030 6d 61 73 6b 20 75 73 65 64 20 3d 20 30 3b 0a 0a  mask used = 0;..
14040 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
14050 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 20 61  wing variables a
14060 72 65 20 70 6f 70 75 6c 61 74 65 64 20 62 61 73  re populated bas
14070 65 64 20 6f 6e 20 74 68 65 20 70 72 6f 70 65 72  ed on the proper
14080 74 69 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20 73  ties of.    ** s
14090 63 61 6e 20 62 65 69 6e 67 20 65 76 61 6c 75 61  can being evalua
140a0 74 65 64 2e 20 54 68 65 79 20 61 72 65 20 74 68  ted. They are th
140b0 65 6e 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  en used to deter
140c0 6d 69 6e 65 20 74 68 65 20 65 78 70 65 63 74 65  mine the expecte
140d0 64 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 61 6e  d.    ** cost an
140e0 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  d number of rows
140f0 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 2a   returned..    *
14100 2a 0a 20 20 20 20 2a 2a 20 20 6e 45 71 3a 20 0a  *.    **  nEq: .
14110 20 20 20 20 2a 2a 20 20 20 20 4e 75 6d 62 65 72      **    Number
14120 20 6f 66 20 65 71 75 61 6c 69 74 79 20 74 65 72   of equality ter
14130 6d 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 69  ms that can be i
14140 6d 70 6c 65 6d 65 6e 74 65 64 20 75 73 69 6e 67  mplemented using
14150 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20   the index..    
14160 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 49 6e 4d 75  **.    **  nInMu
14170 6c 3a 20 20 0a 20 20 20 20 2a 2a 20 20 20 20 54  l:  .    **    T
14180 68 65 20 22 69 6e 2d 6d 75 6c 74 69 70 6c 69 65  he "in-multiplie
14190 72 22 2e 20 54 68 69 73 20 69 73 20 61 6e 20 65  r". This is an e
141a0 73 74 69 6d 61 74 65 20 6f 66 20 68 6f 77 20 6d  stimate of how m
141b0 61 6e 79 20 73 65 65 6b 20 6f 70 65 72 61 74 69  any seek operati
141c0 6f 6e 73 20 0a 20 20 20 20 2a 2a 20 20 20 20 53  ons .    **    S
141d0 51 4c 69 74 65 20 6d 75 73 74 20 70 65 72 66 6f  QLite must perfo
141e0 72 6d 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 20  rm on the index 
141f0 69 6e 20 71 75 65 73 74 69 6f 6e 2e 20 46 6f 72  in question. For
14200 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
14210 20 0a 20 20 20 20 2a 2a 20 20 20 20 57 48 45 52   .    **    WHER
14220 45 20 63 6c 61 75 73 65 20 69 73 3a 0a 20 20 20  E clause is:.   
14230 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   **.    **      
14240 57 48 45 52 45 20 61 20 49 4e 20 28 31 2c 20 32  WHERE a IN (1, 2
14250 2c 20 33 29 20 41 4e 44 20 62 20 49 4e 20 28 34  , 3) AND b IN (4
14260 2c 20 35 2c 20 36 29 0a 20 20 20 20 2a 2a 0a 20  , 5, 6).    **. 
14270 20 20 20 2a 2a 20 20 20 20 53 51 4c 69 74 65 20     **    SQLite 
14280 6d 75 73 74 20 70 65 72 66 6f 72 6d 20 39 20 6c  must perform 9 l
14290 6f 6f 6b 75 70 73 20 6f 6e 20 61 6e 20 69 6e 64  ookups on an ind
142a0 65 78 20 6f 6e 20 28 61 2c 20 62 29 2c 20 73 6f  ex on (a, b), so
142b0 20 6e 49 6e 4d 75 6c 20 69 73 20 0a 20 20 20 20   nInMul is .    
142c0 2a 2a 20 20 20 20 73 65 74 20 74 6f 20 39 2e 20  **    set to 9. 
142d0 47 69 76 65 6e 20 74 68 65 20 73 61 6d 65 20 73  Given the same s
142e0 63 68 65 6d 61 20 61 6e 64 20 65 69 74 68 65 72  chema and either
142f0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
14300 67 20 57 48 45 52 45 20 0a 20 20 20 20 2a 2a 20  g WHERE .    ** 
14310 20 20 20 63 6c 61 75 73 65 73 3a 0a 20 20 20 20     clauses:.    
14320 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 57  **.    **      W
14330 48 45 52 45 20 61 20 3d 20 20 31 0a 20 20 20 20  HERE a =  1.    
14340 2a 2a 20 20 20 20 20 20 57 48 45 52 45 20 61 20  **      WHERE a 
14350 3e 3d 20 32 0a 20 20 20 20 2a 2a 0a 20 20 20 20  >= 2.    **.    
14360 2a 2a 20 20 20 20 6e 49 6e 4d 75 6c 20 69 73 20  **    nInMul is 
14370 73 65 74 20 74 6f 20 31 2e 0a 20 20 20 20 2a 2a  set to 1..    **
14380 0a 20 20 20 20 2a 2a 20 20 20 20 49 66 20 74 68  .    **    If th
14390 65 72 65 20 65 78 69 73 74 73 20 61 20 57 48 45  ere exists a WHE
143a0 52 45 20 74 65 72 6d 20 6f 66 20 74 68 65 20 66  RE term of the f
143b0 6f 72 6d 20 22 78 20 49 4e 20 28 53 45 4c 45 43  orm "x IN (SELEC
143c0 54 20 2e 2e 2e 29 22 2c 20 74 68 65 6e 20 0a 20  T ...)", then . 
143d0 20 20 20 2a 2a 20 20 20 20 74 68 65 20 73 75 62     **    the sub
143e0 2d 73 65 6c 65 63 74 20 69 73 20 61 73 73 75 6d  -select is assum
143f0 65 64 20 74 6f 20 72 65 74 75 72 6e 20 32 35 20  ed to return 25 
14400 72 6f 77 73 20 66 6f 72 20 74 68 65 20 70 75 72  rows for the pur
14410 70 6f 73 65 73 20 6f 66 20 0a 20 20 20 20 2a 2a  poses of .    **
14420 20 20 20 20 64 65 74 65 72 6d 69 6e 69 6e 67 20      determining 
14430 6e 49 6e 4d 75 6c 2e 0a 20 20 20 20 2a 2a 0a 20  nInMul..    **. 
14440 20 20 20 2a 2a 20 20 62 49 6e 45 73 74 3a 20 20     **  bInEst:  
14450 0a 20 20 20 20 2a 2a 20 20 20 20 53 65 74 20 74  .    **    Set t
14460 6f 20 74 72 75 65 20 69 66 20 74 68 65 72 65 20  o true if there 
14470 77 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  was at least one
14480 20 22 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e   "x IN (SELECT .
14490 2e 2e 29 22 20 74 65 72 6d 20 75 73 65 64 20 0a  ..)" term used .
144a0 20 20 20 20 2a 2a 20 20 20 20 69 6e 20 64 65 74      **    in det
144b0 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ermining the val
144c0 75 65 20 6f 66 20 6e 49 6e 4d 75 6c 2e 0a 20 20  ue of nInMul..  
144d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 6e 42 6f    **.    **  nBo
144e0 75 6e 64 3a 0a 20 20 20 20 2a 2a 20 20 20 20 41  und:.    **    A
144f0 6e 20 65 73 74 69 6d 61 74 65 20 6f 6e 20 74 68  n estimate on th
14500 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20  e amount of the 
14510 74 61 62 6c 65 20 74 68 61 74 20 6d 75 73 74 20  table that must 
14520 62 65 20 73 65 61 72 63 68 65 64 2e 20 20 41 0a  be searched.  A.
14530 20 20 20 20 2a 2a 20 20 20 20 76 61 6c 75 65 20      **    value 
14540 6f 66 20 31 30 30 20 6d 65 61 6e 73 20 74 68 65  of 100 means the
14550 20 65 6e 74 69 72 65 20 74 61 62 6c 65 20 69 73   entire table is
14560 20 73 65 61 72 63 68 65 64 2e 20 20 52 61 6e 67   searched.  Rang
14570 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
14580 20 20 2a 2a 20 20 20 20 6d 69 67 68 74 20 72 65    **    might re
14590 64 75 63 65 20 74 68 69 73 20 74 6f 20 61 20 76  duce this to a v
145a0 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 31  alue less than 1
145b0 30 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  00 to indicate t
145c0 68 61 74 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  hat only.    ** 
145d0 20 20 20 61 20 66 72 61 63 74 69 6f 6e 20 6f 66     a fraction of
145e0 20 74 68 65 20 74 61 62 6c 65 20 6e 65 65 64 73   the table needs
145f0 20 73 65 61 72 63 68 69 6e 67 2e 20 20 49 6e 20   searching.  In 
14600 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 0a 20  the absence of. 
14610 20 20 20 2a 2a 20 20 20 20 73 71 6c 69 74 65 5f     **    sqlite_
14620 73 74 61 74 32 20 41 4e 41 4c 59 5a 45 20 64 61  stat2 ANALYZE da
14630 74 61 2c 20 61 20 73 69 6e 67 6c 65 20 69 6e 65  ta, a single ine
14640 71 75 61 6c 69 74 79 20 72 65 64 75 63 65 73 20  quality reduces 
14650 74 68 65 20 73 65 61 72 63 68 0a 20 20 20 20 2a  the search.    *
14660 2a 20 20 20 20 73 70 61 63 65 20 74 6f 20 31 2f  *    space to 1/
14670 33 72 64 20 69 74 73 20 6f 72 69 67 69 6e 61 6c  3rd its original
14680 20 73 69 7a 65 2e 20 20 53 6f 20 61 6e 20 78 3e   size.  So an x>
14690 3f 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 65 64  ? constraint red
146a0 75 63 65 73 0a 20 20 20 20 2a 2a 20 20 20 20 6e  uces.    **    n
146b0 42 6f 75 6e 64 20 74 6f 20 33 33 2e 20 20 54 77  Bound to 33.  Tw
146c0 6f 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28 78  o constraints (x
146d0 3e 3f 20 41 4e 44 20 78 3c 3f 29 20 72 65 64 75  >? AND x<?) redu
146e0 63 65 20 6e 42 6f 75 6e 64 20 74 6f 20 31 31 2e  ce nBound to 11.
146f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
14700 62 53 6f 72 74 3a 20 20 20 0a 20 20 20 20 2a 2a  bSort:   .    **
14710 20 20 20 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75      Boolean. Tru
14720 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e  e if there is an
14730 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
14740 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
14750 72 65 20 61 6e 20 0a 20 20 20 20 2a 2a 20 20 20  re an .    **   
14760 20 65 78 74 65 72 6e 61 6c 20 73 6f 72 74 20 28   external sort (
14770 69 2e 65 2e 20 73 63 61 6e 6e 69 6e 67 20 74 68  i.e. scanning th
14780 65 20 69 6e 64 65 78 20 62 65 69 6e 67 20 65 76  e index being ev
14790 61 6c 75 61 74 65 64 20 77 69 6c 6c 20 6e 6f 74  aluated will not
147a0 20 0a 20 20 20 20 2a 2a 20 20 20 20 63 6f 72 72   .    **    corr
147b0 65 63 74 6c 79 20 6f 72 64 65 72 20 72 65 63 6f  ectly order reco
147c0 72 64 73 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  rds)..    **.   
147d0 20 2a 2a 20 20 62 4c 6f 6f 6b 75 70 3a 20 0a 20   **  bLookup: . 
147e0 20 20 20 2a 2a 20 20 20 20 42 6f 6f 6c 65 61 6e     **    Boolean
147f0 2e 20 54 72 75 65 20 69 66 20 66 6f 72 20 65 61  . True if for ea
14800 63 68 20 69 6e 64 65 78 20 65 6e 74 72 79 20 76  ch index entry v
14810 69 73 69 74 65 64 20 61 20 6c 6f 6f 6b 75 70 20  isited a lookup 
14820 6f 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 20  on the .    **  
14830 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
14840 74 61 62 6c 65 20 62 2d 74 72 65 65 20 69 73 20  table b-tree is 
14850 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 69  required. This i
14860 73 20 61 6c 77 61 79 73 20 66 61 6c 73 65 20 0a  s always false .
14870 20 20 20 20 2a 2a 20 20 20 20 66 6f 72 20 74 68      **    for th
14880 65 20 72 6f 77 69 64 20 69 6e 64 65 78 2e 20 46  e rowid index. F
14890 6f 72 20 6f 74 68 65 72 20 69 6e 64 65 78 65 73  or other indexes
148a0 2c 20 69 74 20 69 73 20 74 72 75 65 20 75 6e 6c  , it is true unl
148b0 65 73 73 20 61 6c 6c 20 74 68 65 20 0a 20 20 20  ess all the .   
148c0 20 2a 2a 20 20 20 20 63 6f 6c 75 6d 6e 73 20 6f   **    columns o
148d0 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65 64  f the table used
148e0 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
148f0 74 61 74 65 6d 65 6e 74 20 61 72 65 20 70 72 65  tatement are pre
14900 73 65 6e 74 20 69 6e 20 0a 20 20 20 20 2a 2a 20  sent in .    ** 
14910 20 20 20 74 68 65 20 69 6e 64 65 78 20 28 73 75     the index (su
14920 63 68 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ch an index is s
14930 6f 6d 65 74 69 6d 65 73 20 64 65 73 63 72 69 62  ometimes describ
14940 65 64 20 61 73 20 61 20 63 6f 76 65 72 69 6e 67  ed as a covering
14950 20 69 6e 64 65 78 29 2e 0a 20 20 20 20 2a 2a 20   index)..    ** 
14960 20 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20     For example, 
14970 67 69 76 65 6e 20 74 68 65 20 69 6e 64 65 78 20  given the index 
14980 6f 6e 20 28 61 2c 20 62 29 2c 20 74 68 65 20 73  on (a, b), the s
14990 65 63 6f 6e 64 20 6f 66 20 74 68 65 20 66 6f 6c  econd of the fol
149a0 6c 6f 77 69 6e 67 20 0a 20 20 20 20 2a 2a 20 20  lowing .    **  
149b0 20 20 74 77 6f 20 71 75 65 72 69 65 73 20 72 65    two queries re
149c0 71 75 69 72 65 73 20 74 61 62 6c 65 20 62 2d 74  quires table b-t
149d0 72 65 65 20 6c 6f 6f 6b 75 70 73 2c 20 62 75 74  ree lookups, but
149e0 20 74 68 65 20 66 69 72 73 74 20 64 6f 65 73 20   the first does 
149f0 6e 6f 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  not..    **.    
14a00 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 53  **             S
14a10 45 4c 45 43 54 20 61 2c 20 62 20 20 20 20 46 52  ELECT a, b    FR
14a20 4f 4d 20 74 62 6c 20 57 48 45 52 45 20 61 20 3d  OM tbl WHERE a =
14a30 20 31 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   1;.    **      
14a40 20 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2c         SELECT a,
14a50 20 62 2c 20 63 20 46 52 4f 4d 20 74 62 6c 20 57   b, c FROM tbl W
14a60 48 45 52 45 20 61 20 3d 20 31 3b 0a 20 20 20 20  HERE a = 1;.    
14a70 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 0a  */.    int nEq;.
14a80 20 20 20 20 69 6e 74 20 62 49 6e 45 73 74 20 3d      int bInEst =
14a90 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 4d   0;.    int nInM
14aa0 75 6c 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  ul = 1;.    int 
14ab0 6e 42 6f 75 6e 64 20 3d 20 31 30 30 3b 0a 20 20  nBound = 100;.  
14ac0 20 20 69 6e 74 20 62 53 6f 72 74 20 3d 20 30 3b    int bSort = 0;
14ad0 0a 20 20 20 20 69 6e 74 20 62 4c 6f 6f 6b 75 70  .    int bLookup
14ae0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 44 65   = 0;..    /* De
14af0 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
14b00 65 73 20 6f 66 20 6e 45 71 20 61 6e 64 20 6e 49  es of nEq and nI
14b10 6e 4d 75 6c 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nMul */.    for(
14b20 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 50 72 6f 62  nEq=0; nEq<pProb
14b30 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b  e->nColumn; nEq+
14b40 2b 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54  +){.      WhereT
14b50 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
14b60 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
14b70 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  e term of the WH
14b80 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
14b90 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
14ba0 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
14bb0 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
14bc0 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
14bd0 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
14be0 2c 20 65 71 54 65 72 6d 4d 61 73 6b 2c 20 70 49  , eqTermMask, pI
14bf0 64 78 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  dx);.      if( p
14c00 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
14c10 0a 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c  .      wsFlags |
14c20 3d 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  = (WHERE_COLUMN_
14c30 45 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  EQ|WHERE_ROWID_E
14c40 51 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  Q);.      if( pT
14c50 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
14c60 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20 20   WO_IN ){.      
14c70 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
14c80 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
14c90 20 20 20 20 20 20 77 73 46 6c 61 67 73 20 7c 3d        wsFlags |=
14ca0 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e   WHERE_COLUMN_IN
14cb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  ;.        if( Ex
14cc0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14cd0 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  xpr, EP_xIsSelec
14ce0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
14cf0 6e 49 6e 4d 75 6c 20 2a 3d 20 32 35 3b 0a 20 20  nInMul *= 25;.  
14d00 20 20 20 20 20 20 20 20 62 49 6e 45 73 74 20 3d          bInEst =
14d10 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
14d20 65 20 69 66 28 20 70 45 78 70 72 2d 3e 78 2e 70  e if( pExpr->x.p
14d30 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
14d40 20 20 6e 49 6e 4d 75 6c 20 2a 3d 20 70 45 78 70    nInMul *= pExp
14d50 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  r->x.pList->nExp
14d60 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  r + 1;.        }
14d70 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
14d80 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
14d90 72 20 26 20 57 4f 5f 49 53 4e 55 4c 4c 20 29 7b  r & WO_ISNULL ){
14da0 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
14db0 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
14dc0 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20  _NULL;.      }. 
14dd0 20 20 20 20 20 75 73 65 64 20 7c 3d 20 70 54 65       used |= pTe
14de0 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 3b  rm->prereqRight;
14df0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
14e00 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
14e10 75 65 20 6f 66 20 6e 42 6f 75 6e 64 2e 20 2a 2f  ue of nBound. */
14e20 0a 20 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72  .    if( nEq<pPr
14e30 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
14e40 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50        int j = pP
14e50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  robe->aiColumn[n
14e60 45 71 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 66  Eq];.      if( f
14e70 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
14e80 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
14e90 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
14ea0 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 20 29  T|WO_GE, pIdx) )
14eb0 7b 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54  {.        WhereT
14ec0 65 72 6d 20 2a 70 54 6f 70 20 3d 20 66 69 6e 64  erm *pTop = find
14ed0 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
14ee0 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f  j, notReady, WO_
14ef0 4c 54 7c 57 4f 5f 4c 45 2c 20 70 49 64 78 29 3b  LT|WO_LE, pIdx);
14f00 0a 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65  .        WhereTe
14f10 72 6d 20 2a 70 42 74 6d 20 3d 20 66 69 6e 64 54  rm *pBtm = findT
14f20 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
14f30 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47  , notReady, WO_G
14f40 54 7c 57 4f 5f 47 45 2c 20 70 49 64 78 29 3b 0a  T|WO_GE, pIdx);.
14f50 20 20 20 20 20 20 20 20 77 68 65 72 65 52 61 6e          whereRan
14f60 67 65 53 63 61 6e 45 73 74 28 70 50 61 72 73 65  geScanEst(pParse
14f70 2c 20 70 50 72 6f 62 65 2c 20 6e 45 71 2c 20 70  , pProbe, nEq, p
14f80 42 74 6d 2c 20 70 54 6f 70 2c 20 26 6e 42 6f 75  Btm, pTop, &nBou
14f90 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
14fa0 20 70 54 6f 70 20 29 7b 0a 20 20 20 20 20 20 20   pTop ){.       
14fb0 20 20 20 77 73 46 6c 61 67 73 20 7c 3d 20 57 48     wsFlags |= WH
14fc0 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20  ERE_TOP_LIMIT;. 
14fd0 20 20 20 20 20 20 20 20 20 75 73 65 64 20 7c 3d           used |=
14fe0 20 70 54 6f 70 2d 3e 70 72 65 72 65 71 52 69 67   pTop->prereqRig
14ff0 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ht;.        }.  
15000 20 20 20 20 20 20 69 66 28 20 70 42 74 6d 20 29        if( pBtm )
15010 7b 0a 20 20 20 20 20 20 20 20 20 20 77 73 46 6c  {.          wsFl
15020 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d  ags |= WHERE_BTM
15030 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 20 20  _LIMIT;.        
15040 20 20 75 73 65 64 20 7c 3d 20 70 42 74 6d 2d 3e    used |= pBtm->
15050 70 72 65 72 65 71 52 69 67 68 74 3b 0a 20 20 20  prereqRight;.   
15060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 77       }.        w
15070 73 46 6c 61 67 73 20 7c 3d 20 28 57 48 45 52 45  sFlags |= (WHERE
15080 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c 57 48  _COLUMN_RANGE|WH
15090 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
150a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
150b0 6c 73 65 20 69 66 28 20 70 50 72 6f 62 65 2d 3e  lse if( pProbe->
150c0 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65  onError!=OE_None
150d0 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
150e0 73 65 28 20 77 73 46 6c 61 67 73 20 26 20 57 48  se( wsFlags & WH
150f0 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 3b  ERE_COLUMN_IN );
15100 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
15110 20 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45   wsFlags & WHERE
15120 5f 43 4f 4c 55 4d 4e 5f 4e 55 4c 4c 20 29 3b 0a  _COLUMN_NULL );.
15130 20 20 20 20 20 20 69 66 28 20 28 77 73 46 6c 61        if( (wsFla
15140 67 73 20 26 20 28 57 48 45 52 45 5f 43 4f 4c 55  gs & (WHERE_COLU
15150 4d 4e 5f 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55  MN_IN|WHERE_COLU
15160 4d 4e 5f 4e 55 4c 4c 29 29 3d 3d 30 20 29 7b 0a  MN_NULL))==0 ){.
15170 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
15180 7c 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b  |= WHERE_UNIQUE;
15190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
151a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
151b0 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
151c0 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 69 6e  lause and the in
151d0 64 65 78 20 62 65 69 6e 67 20 63 6f 6e 73 69 64  dex being consid
151e0 65 72 65 64 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ered will.    **
151f0 20 6e 61 74 75 72 61 6c 6c 79 20 73 63 61 6e 20   naturally scan 
15200 72 6f 77 73 20 69 6e 20 74 68 65 20 72 65 71 75  rows in the requ
15210 69 72 65 64 20 6f 72 64 65 72 2c 20 73 65 74 20  ired order, set 
15220 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
15230 66 6c 61 67 73 0a 20 20 20 20 2a 2a 20 69 6e 20  flags.    ** in 
15240 77 73 46 6c 61 67 73 2e 20 4f 74 68 65 72 77 69  wsFlags. Otherwi
15250 73 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  se, if there is 
15260 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
15270 73 65 20 62 75 74 20 74 68 65 20 69 6e 64 65 78  se but the index
15280 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 73 63 61  .    ** will sca
15290 6e 20 72 6f 77 73 20 69 6e 20 61 20 64 69 66 66  n rows in a diff
152a0 65 72 65 6e 74 20 6f 72 64 65 72 2c 20 73 65 74  erent order, set
152b0 20 74 68 65 20 62 53 6f 72 74 20 76 61 72 69 61   the bSort varia
152c0 62 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ble.  */.    if(
152d0 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20   pOrderBy ){.   
152e0 20 20 20 69 66 28 20 28 77 73 46 6c 61 67 73 20     if( (wsFlags 
152f0 26 20 28 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  & (WHERE_COLUMN_
15300 49 4e 7c 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  IN|WHERE_COLUMN_
15310 4e 55 4c 4c 29 29 3d 3d 30 0a 20 20 20 20 20 20  NULL))==0.      
15320 20 20 26 26 20 69 73 53 6f 72 74 69 6e 67 49 6e    && isSortingIn
15330 64 65 78 28 70 50 61 72 73 65 2c 70 57 43 2d 3e  dex(pParse,pWC->
15340 70 4d 61 73 6b 53 65 74 2c 70 50 72 6f 62 65 2c  pMaskSet,pProbe,
15350 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c 6e 45  iCur,pOrderBy,nE
15360 71 2c 26 72 65 76 29 0a 20 20 20 20 20 20 29 7b  q,&rev).      ){
15370 0a 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73  .        wsFlags
15380 20 7c 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f   |= WHERE_ROWID_
15390 52 41 4e 47 45 7c 57 48 45 52 45 5f 43 4f 4c 55  RANGE|WHERE_COLU
153a0 4d 4e 5f 52 41 4e 47 45 7c 57 48 45 52 45 5f 4f  MN_RANGE|WHERE_O
153b0 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
153c0 77 73 46 6c 61 67 73 20 7c 3d 20 28 72 65 76 20  wsFlags |= (rev 
153d0 3f 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20  ? WHERE_REVERSE 
153e0 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  : 0);.      }els
153f0 65 7b 0a 20 20 20 20 20 20 20 20 62 53 6f 72 74  e{.        bSort
15400 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
15410 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63    }..    /* If c
15420 75 72 72 65 6e 74 6c 79 20 63 61 6c 63 75 6c 61  urrently calcula
15430 74 69 6e 67 20 74 68 65 20 63 6f 73 74 20 6f 66  ting the cost of
15440 20 75 73 69 6e 67 20 61 6e 20 69 6e 64 65 78 20   using an index 
15450 28 6e 6f 74 20 74 68 65 20 49 50 4b 0a 20 20 20  (not the IPK.   
15460 20 2a 2a 20 69 6e 64 65 78 29 2c 20 64 65 74 65   ** index), dete
15470 72 6d 69 6e 65 20 69 66 20 61 6c 6c 20 72 65 71  rmine if all req
15480 75 69 72 65 64 20 63 6f 6c 75 6d 6e 20 64 61 74  uired column dat
15490 61 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e 65  a may be obtaine
154a0 64 20 77 69 74 68 6f 75 74 20 0a 20 20 20 20 2a  d without .    *
154b0 2a 20 73 65 65 6b 69 6e 67 20 74 6f 20 65 6e 74  * seeking to ent
154c0 72 69 65 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  ries in the main
154d0 20 74 61 62 6c 65 20 28 69 2e 65 2e 20 69 66 20   table (i.e. if 
154e0 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 20 63  the index is a c
154f0 6f 76 65 72 69 6e 67 0a 20 20 20 20 2a 2a 20 69  overing.    ** i
15500 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 71 75  ndex for this qu
15510 65 72 79 29 2e 20 49 66 20 69 74 20 69 73 2c 20  ery). If it is, 
15520 73 65 74 20 74 68 65 20 57 48 45 52 45 5f 49 44  set the WHERE_ID
15530 58 5f 4f 4e 4c 59 20 66 6c 61 67 20 69 6e 0a 20  X_ONLY flag in. 
15540 20 20 20 2a 2a 20 77 73 46 6c 61 67 73 2e 20 4f     ** wsFlags. O
15550 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 74 68  therwise, set th
15560 65 20 62 4c 6f 6f 6b 75 70 20 76 61 72 69 61 62  e bLookup variab
15570 6c 65 20 74 6f 20 74 72 75 65 2e 20 20 2a 2f 0a  le to true.  */.
15580 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26 20      if( pIdx && 
15590 77 73 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20  wsFlags ){.     
155a0 20 42 69 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72   Bitmask m = pSr
155b0 63 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20  c->colUsed;.    
155c0 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
155d0 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e  or(j=0; j<pIdx->
155e0 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  nColumn; j++){. 
155f0 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70         int x = p
15600 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
15610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78 3c  ;.        if( x<
15620 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
15630 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74 6d     m &= ~(((Bitm
15640 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20 20  ask)1)<<x);.    
15650 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15660 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b 0a      if( m==0 ){.
15670 20 20 20 20 20 20 20 20 77 73 46 6c 61 67 73 20          wsFlags 
15680 7c 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c  |= WHERE_IDX_ONL
15690 59 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  Y;.      }else{.
156a0 20 20 20 20 20 20 20 20 62 4c 6f 6f 6b 75 70 20          bLookup 
156b0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
156c0 20 7d 0a 0a 20 20 20 20 2f 2a 2a 2a 2a 20 42 65   }..    /**** Be
156d0 67 69 6e 20 61 64 64 69 6e 67 20 75 70 20 74 68  gin adding up th
156e0 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
156f0 74 68 69 73 20 69 6e 64 65 78 20 28 4e 65 65 64  this index (Need
15700 73 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 29 0a  s improvements).
15710 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 73      **.    ** Es
15720 74 69 6d 61 74 65 20 74 68 65 20 6e 75 6d 62 65  timate the numbe
15730 72 20 6f 66 20 72 6f 77 73 20 6f 66 20 6f 75 74  r of rows of out
15740 70 75 74 2e 20 20 46 6f 72 20 61 6e 20 49 4e 20  put.  For an IN 
15750 6f 70 65 72 61 74 6f 72 2c 0a 20 20 20 20 2a 2a  operator,.    **
15760 20 64 6f 20 6e 6f 74 20 6c 65 74 20 74 68 65 20   do not let the 
15770 65 73 74 69 6d 61 74 65 20 65 78 63 65 65 64 20  estimate exceed 
15780 68 61 6c 66 20 74 68 65 20 72 6f 77 73 20 69 6e  half the rows in
15790 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20   the table..    
157a0 2a 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 28 64  */.    nRow = (d
157b0 6f 75 62 6c 65 29 28 61 69 52 6f 77 45 73 74 5b  ouble)(aiRowEst[
157c0 6e 45 71 5d 20 2a 20 6e 49 6e 4d 75 6c 29 3b 0a  nEq] * nInMul);.
157d0 20 20 20 20 69 66 28 20 62 49 6e 45 73 74 20 26      if( bInEst &
157e0 26 20 6e 52 6f 77 2a 32 3e 61 69 52 6f 77 45 73  & nRow*2>aiRowEs
157f0 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 6e 52  t[0] ){.      nR
15800 6f 77 20 3d 20 61 69 52 6f 77 45 73 74 5b 30 5d  ow = aiRowEst[0]
15810 2f 32 3b 0a 20 20 20 20 20 20 6e 49 6e 4d 75 6c  /2;.      nInMul
15820 20 3d 20 6e 52 6f 77 20 2f 20 61 69 52 6f 77 45   = nRow / aiRowE
15830 73 74 5b 6e 45 71 5d 3b 0a 20 20 20 20 7d 0a 0a  st[nEq];.    }..
15840 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 20 63 6f      /* Assume co
15850 6e 73 74 61 6e 74 20 63 6f 73 74 20 74 6f 20 61  nstant cost to a
15860 63 63 65 73 73 20 61 20 72 6f 77 20 61 6e 64 20  ccess a row and 
15870 6c 6f 67 61 72 69 74 68 6d 69 63 20 63 6f 73 74  logarithmic cost
15880 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 61 20   to.    ** do a 
15890 62 69 6e 61 72 79 20 73 65 61 72 63 68 2e 20 20  binary search.  
158a0 48 65 6e 63 65 2c 20 74 68 65 20 69 6e 69 74 69  Hence, the initi
158b0 61 6c 20 63 6f 73 74 20 69 73 20 74 68 65 20 6e  al cost is the n
158c0 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 0a  umber of output.
158d0 20 20 20 20 2a 2a 20 72 6f 77 73 20 70 6c 75 73      ** rows plus
158e0 20 6c 6f 67 32 28 74 61 62 6c 65 2d 73 69 7a 65   log2(table-size
158f0 29 20 74 69 6d 65 73 20 74 68 65 20 6e 75 6d 62  ) times the numb
15900 65 72 20 6f 66 20 62 69 6e 61 72 79 20 73 65 61  er of binary sea
15910 72 63 68 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  rches..    */.  
15920 20 20 63 6f 73 74 20 3d 20 6e 52 6f 77 20 2b 20    cost = nRow + 
15930 6e 49 6e 4d 75 6c 2a 65 73 74 4c 6f 67 28 61 69  nInMul*estLog(ai
15940 52 6f 77 45 73 74 5b 30 5d 29 3b 0a 0a 20 20 20  RowEst[0]);..   
15950 20 2f 2a 20 41 64 6a 75 73 74 20 74 68 65 20 6e   /* Adjust the n
15960 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 61 6e  umber of rows an
15970 64 20 74 68 65 20 63 6f 73 74 20 64 6f 77 6e 77  d the cost downw
15980 61 72 64 20 74 6f 20 72 65 66 6c 65 63 74 20 72  ard to reflect r
15990 6f 77 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ows.    ** that 
159a0 61 72 65 20 65 78 63 6c 75 64 65 64 20 62 79 20  are excluded by 
159b0 72 61 6e 67 65 20 63 6f 6e 73 74 72 61 69 6e 74  range constraint
159c0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 52  s..    */.    nR
159d0 6f 77 20 3d 20 28 6e 52 6f 77 20 2a 20 28 64 6f  ow = (nRow * (do
159e0 75 62 6c 65 29 6e 42 6f 75 6e 64 29 20 2f 20 28  uble)nBound) / (
159f0 64 6f 75 62 6c 65 29 31 30 30 3b 0a 20 20 20 20  double)100;.    
15a00 63 6f 73 74 20 3d 20 28 63 6f 73 74 20 2a 20 28  cost = (cost * (
15a10 64 6f 75 62 6c 65 29 6e 42 6f 75 6e 64 29 20 2f  double)nBound) /
15a20 20 28 64 6f 75 62 6c 65 29 31 30 30 3b 0a 0a 20   (double)100;.. 
15a30 20 20 20 2f 2a 20 41 64 64 20 69 6e 20 74 68 65     /* Add in the
15a40 20 65 73 74 69 6d 61 74 65 64 20 63 6f 73 74 20   estimated cost 
15a50 6f 66 20 73 6f 72 74 69 6e 67 20 74 68 65 20 72  of sorting the r
15a60 65 73 75 6c 74 0a 20 20 20 20 2a 2f 0a 20 20 20  esult.    */.   
15a70 20 69 66 28 20 62 53 6f 72 74 20 29 7b 0a 20 20   if( bSort ){.  
15a80 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74      cost += cost
15a90 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20  *estLog(cost);. 
15aa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
15ab0 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  all information 
15ac0 63 61 6e 20 62 65 20 74 61 6b 65 6e 20 64 69 72  can be taken dir
15ad0 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 69  ectly from the i
15ae0 6e 64 65 78 2c 20 77 65 20 61 76 6f 69 64 0a 20  ndex, we avoid. 
15af0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 61 62 6c     ** doing tabl
15b00 65 20 6c 6f 6f 6b 75 70 73 2e 20 20 54 68 69 73  e lookups.  This
15b10 20 72 65 64 75 63 65 73 20 74 68 65 20 63 6f 73   reduces the cos
15b20 74 20 62 79 20 68 61 6c 66 2e 20 20 28 4e 6f 74  t by half.  (Not
15b30 20 72 65 61 6c 6c 79 20 2d 0a 20 20 20 20 2a 2a   really -.    **
15b40 20 74 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62   this needs to b
15b50 65 20 66 69 78 65 64 2e 29 0a 20 20 20 20 2a 2f  e fixed.).    */
15b60 0a 20 20 20 20 69 66 28 20 70 49 64 78 20 26 26  .    if( pIdx &&
15b70 20 62 4c 6f 6f 6b 75 70 3d 3d 30 20 29 7b 0a 20   bLookup==0 ){. 
15b80 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 28 64 6f       cost /= (do
15b90 75 62 6c 65 29 32 3b 0a 20 20 20 20 7d 0a 20 20  uble)2;.    }.  
15ba0 20 20 2f 2a 2a 2a 2a 20 43 6f 73 74 20 6f 66 20    /**** Cost of 
15bb0 75 73 69 6e 67 20 74 68 69 73 20 69 6e 64 65 78  using this index
15bc0 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 63 6f   has now been co
15bd0 6d 70 75 74 65 64 20 2a 2a 2a 2a 2f 0a 0a 20 20  mputed ****/..  
15be0 20 20 57 48 45 52 45 54 52 41 43 45 28 28 0a 20    WHERETRACE((. 
15bf0 20 20 20 20 20 22 74 62 6c 3d 25 73 20 69 64 78       "tbl=%s idx
15c00 3d 25 73 20 6e 45 71 3d 25 64 20 6e 49 6e 4d 75  =%s nEq=%d nInMu
15c10 6c 3d 25 64 20 6e 42 6f 75 6e 64 3d 25 64 20 62  l=%d nBound=%d b
15c20 53 6f 72 74 3d 25 64 20 62 4c 6f 6f 6b 75 70 3d  Sort=%d bLookup=
15c30 25 64 22 0a 20 20 20 20 20 20 22 20 77 73 46 6c  %d".      " wsFl
15c40 61 67 73 3d 25 64 20 20 20 28 6e 52 6f 77 3d 25  ags=%d   (nRow=%
15c50 2e 32 66 20 63 6f 73 74 3d 25 2e 32 66 29 5c 6e  .2f cost=%.2f)\n
15c60 22 2c 0a 20 20 20 20 20 20 70 53 72 63 2d 3e 70  ",.      pSrc->p
15c70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 28 70 49 64  Tab->zName, (pId
15c80 78 20 3f 20 70 49 64 78 2d 3e 7a 4e 61 6d 65 20  x ? pIdx->zName 
15c90 3a 20 22 69 70 6b 22 29 2c 20 0a 20 20 20 20 20  : "ipk"), .     
15ca0 20 6e 45 71 2c 20 6e 49 6e 4d 75 6c 2c 20 6e 42   nEq, nInMul, nB
15cb0 6f 75 6e 64 2c 20 62 53 6f 72 74 2c 20 62 4c 6f  ound, bSort, bLo
15cc0 6f 6b 75 70 2c 20 77 73 46 6c 61 67 73 2c 20 6e  okup, wsFlags, n
15cd0 52 6f 77 2c 20 63 6f 73 74 0a 20 20 20 20 29 29  Row, cost.    ))
15ce0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
15cf0 73 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 62  s index is the b
15d00 65 73 74 20 77 65 20 68 61 76 65 20 73 65 65 6e  est we have seen
15d10 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 72 65   so far, then re
15d20 63 6f 72 64 20 74 68 69 73 0a 20 20 20 20 2a 2a  cord this.    **
15d30 20 69 6e 64 65 78 20 61 6e 64 20 69 74 73 20 63   index and its c
15d40 6f 73 74 20 69 6e 20 74 68 65 20 70 43 6f 73 74  ost in the pCost
15d50 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
15d60 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 70 49 64  */.    if( (!pId
15d70 78 20 7c 7c 20 77 73 46 6c 61 67 73 29 20 26 26  x || wsFlags) &&
15d80 20 63 6f 73 74 3c 70 43 6f 73 74 2d 3e 72 43 6f   cost<pCost->rCo
15d90 73 74 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 73  st ){.      pCos
15da0 74 2d 3e 72 43 6f 73 74 20 3d 20 63 6f 73 74 3b  t->rCost = cost;
15db0 0a 20 20 20 20 20 20 70 43 6f 73 74 2d 3e 6e 52  .      pCost->nR
15dc0 6f 77 20 3d 20 6e 52 6f 77 3b 0a 20 20 20 20 20  ow = nRow;.     
15dd0 20 70 43 6f 73 74 2d 3e 75 73 65 64 20 3d 20 75   pCost->used = u
15de0 73 65 64 3b 0a 20 20 20 20 20 20 70 43 6f 73 74  sed;.      pCost
15df0 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 3d  ->plan.wsFlags =
15e00 20 28 77 73 46 6c 61 67 73 26 77 73 46 6c 61 67   (wsFlags&wsFlag
15e10 4d 61 73 6b 29 3b 0a 20 20 20 20 20 20 70 43 6f  Mask);.      pCo
15e20 73 74 2d 3e 70 6c 61 6e 2e 6e 45 71 20 3d 20 6e  st->plan.nEq = n
15e30 45 71 3b 0a 20 20 20 20 20 20 70 43 6f 73 74 2d  Eq;.      pCost-
15e40 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 20 3d 20 70  >plan.u.pIdx = p
15e50 49 64 78 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Idx;.    }..    
15e60 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
15e70 61 6e 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c  an INDEXED BY cl
15e80 61 75 73 65 2c 20 74 68 65 6e 20 6f 6e 6c 79 20  ause, then only 
15e90 74 68 61 74 20 6f 6e 65 20 69 6e 64 65 78 20 69  that one index i
15ea0 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 69 64 65  s.    ** conside
15eb0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  red. */.    if( 
15ec0 70 53 72 63 2d 3e 70 49 6e 64 65 78 20 29 20 62  pSrc->pIndex ) b
15ed0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  reak;..    /* Re
15ee0 73 65 74 20 6d 61 73 6b 73 20 66 6f 72 20 74 68  set masks for th
15ef0 65 20 6e 65 78 74 20 69 6e 64 65 78 20 69 6e 20  e next index in 
15f00 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20  the loop */.    
15f10 77 73 46 6c 61 67 4d 61 73 6b 20 3d 20 7e 28 57  wsFlagMask = ~(W
15f20 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48  HERE_ROWID_EQ|WH
15f30 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29  ERE_ROWID_RANGE)
15f40 3b 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b  ;.    eqTermMask
15f50 20 3d 20 69 64 78 45 71 54 65 72 6d 4d 61 73 6b   = idxEqTermMask
15f60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
15f70 68 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52  here is no ORDER
15f80 20 42 59 20 63 6c 61 75 73 65 20 61 6e 64 20 74   BY clause and t
15f90 68 65 20 53 51 4c 49 54 45 5f 52 65 76 65 72 73  he SQLITE_Revers
15fa0 65 4f 72 64 65 72 20 66 6c 61 67 0a 20 20 2a 2a  eOrder flag.  **
15fb0 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 72 65   is set, then re
15fc0 76 65 72 73 65 20 74 68 65 20 6f 72 64 65 72 20  verse the order 
15fd0 74 68 61 74 20 74 68 65 20 69 6e 64 65 78 20 77  that the index w
15fe0 69 6c 6c 20 62 65 20 73 63 61 6e 6e 65 64 0a 20  ill be scanned. 
15ff0 20 2a 2a 20 69 6e 2e 20 54 68 69 73 20 69 73 20   ** in. This is 
16000 75 73 65 64 20 66 6f 72 20 61 70 70 6c 69 63 61  used for applica
16010 74 69 6f 6e 20 74 65 73 74 69 6e 67 2c 20 74 6f  tion testing, to
16020 20 68 65 6c 70 20 66 69 6e 64 20 63 61 73 65 73   help find cases
16030 0a 20 20 2a 2a 20 77 68 65 72 65 20 61 70 70 6c  .  ** where appl
16040 69 63 61 74 69 6f 6e 20 62 65 68 61 76 69 6f 75  ication behaviou
16050 72 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  r depends on the
16060 20 28 75 6e 64 65 66 69 6e 65 64 29 20 6f 72 64   (undefined) ord
16070 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 53 51 4c  er that.  ** SQL
16080 69 74 65 20 6f 75 74 70 75 74 73 20 72 6f 77 73  ite outputs rows
16090 20 69 6e 20 69 6e 20 74 68 65 20 61 62 73 65 6e   in in the absen
160a0 63 65 20 6f 66 20 61 6e 20 4f 52 44 45 52 20 42  ce of an ORDER B
160b0 59 20 63 6c 61 75 73 65 2e 20 20 2a 2f 0a 20 20  Y clause.  */.  
160c0 69 66 28 20 21 70 4f 72 64 65 72 42 79 20 26 26  if( !pOrderBy &&
160d0 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66 6c 61   pParse->db->fla
160e0 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65 76 65  gs & SQLITE_Reve
160f0 72 73 65 4f 72 64 65 72 20 29 7b 0a 20 20 20 20  rseOrder ){.    
16100 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c  pCost->plan.wsFl
16110 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56  ags |= WHERE_REV
16120 45 52 53 45 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ERSE;.  }..  ass
16130 65 72 74 28 20 70 4f 72 64 65 72 42 79 20 7c 7c  ert( pOrderBy ||
16140 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73   (pCost->plan.ws
16150 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
16160 52 42 59 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  RBY)==0 );.  ass
16170 65 72 74 28 20 70 43 6f 73 74 2d 3e 70 6c 61 6e  ert( pCost->plan
16180 2e 75 2e 70 49 64 78 3d 3d 30 20 7c 7c 20 28 70  .u.pIdx==0 || (p
16190 43 6f 73 74 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  Cost->plan.wsFla
161a0 67 73 26 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  gs&WHERE_ROWID_E
161b0 51 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Q)==0 );.  asser
161c0 74 28 20 70 53 72 63 2d 3e 70 49 6e 64 65 78 3d  t( pSrc->pIndex=
161d0 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 43  =0 .       || pC
161e0 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  ost->plan.u.pIdx
161f0 3d 3d 30 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  ==0 .       || p
16200 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64  Cost->plan.u.pId
16210 78 3d 3d 70 53 72 63 2d 3e 70 49 6e 64 65 78 20  x==pSrc->pIndex 
16220 0a 20 20 29 3b 0a 0a 20 20 57 48 45 52 45 54 52  .  );..  WHERETR
16230 41 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78  ACE(("best index
16240 20 69 73 3a 20 25 73 5c 6e 22 2c 20 0a 20 20 20   is: %s\n", .   
16250 20 28 70 43 6f 73 74 2d 3e 70 6c 61 6e 2e 75 2e   (pCost->plan.u.
16260 70 49 64 78 20 3f 20 70 43 6f 73 74 2d 3e 70 6c  pIdx ? pCost->pl
16270 61 6e 2e 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65  an.u.pIdx->zName
16280 20 3a 20 22 69 70 6b 22 29 0a 20 20 29 29 3b 0a   : "ipk").  ));.
16290 20 20 0a 20 20 62 65 73 74 4f 72 43 6c 61 75 73    .  bestOrClaus
162a0 65 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 70  eIndex(pParse, p
162b0 57 43 2c 20 70 53 72 63 2c 20 6e 6f 74 52 65 61  WC, pSrc, notRea
162c0 64 79 2c 20 70 4f 72 64 65 72 42 79 2c 20 70 43  dy, pOrderBy, pC
162d0 6f 73 74 29 3b 0a 20 20 70 43 6f 73 74 2d 3e 70  ost);.  pCost->p
162e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 7c 3d 20 65  lan.wsFlags |= e
162f0 71 54 65 72 6d 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  qTermMask;.}../*
16300 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 71 75 65  .** Find the que
16310 72 79 20 70 6c 61 6e 20 66 6f 72 20 61 63 63 65  ry plan for acce
16320 73 73 69 6e 67 20 74 61 62 6c 65 20 70 53 72 63  ssing table pSrc
16330 2d 3e 70 54 61 62 2e 20 57 72 69 74 65 20 74 68  ->pTab. Write th
16340 65 0a 2a 2a 20 62 65 73 74 20 71 75 65 72 79 20  e.** best query 
16350 70 6c 61 6e 20 61 6e 64 20 69 74 73 20 63 6f 73  plan and its cos
16360 74 20 69 6e 74 6f 20 74 68 65 20 57 68 65 72 65  t into the Where
16370 43 6f 73 74 20 6f 62 6a 65 63 74 20 73 75 70 70  Cost object supp
16380 6c 69 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20  lied .** as the 
16390 6c 61 73 74 20 70 61 72 61 6d 65 74 65 72 2e 20  last parameter. 
163a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
163b0 79 20 63 61 6c 63 75 6c 61 74 65 20 74 68 65 20  y calculate the 
163c0 63 6f 73 74 20 6f 66 0a 2a 2a 20 62 6f 74 68 20  cost of.** both 
163d0 72 65 61 6c 20 61 6e 64 20 76 69 72 74 75 61 6c  real and virtual
163e0 20 74 61 62 6c 65 20 73 63 61 6e 73 2e 0a 2a 2f   table scans..*/
163f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 73  .static void bes
16400 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20  tIndex(.  Parse 
16410 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
16420 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
16430 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
16440 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
16450 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  WC,           /*
16460 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
16470 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  e */.  struct Sr
16480 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63  cList_item *pSrc
16490 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20 63  ,  /* The FROM c
164a0 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73 65  lause term to se
164b0 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61 73  arch */.  Bitmas
164c0 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
164d0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
164e0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61 72   cursors that ar
164f0 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  e not available 
16500 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
16510 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20 20  OrderBy,        
16520 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
16530 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65   clause */.  Whe
16540 72 65 43 6f 73 74 20 2a 70 43 6f 73 74 20 20 20  reCost *pCost   
16550 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 65           /* Lowe
16560 73 74 20 63 6f 73 74 20 71 75 65 72 79 20 70 6c  st cost query pl
16570 61 6e 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66  an */.){.#ifndef
16580 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
16590 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
165a0 49 73 56 69 72 74 75 61 6c 28 70 53 72 63 2d 3e  IsVirtual(pSrc->
165b0 70 54 61 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  pTab) ){.    sql
165c0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
165d0 2a 70 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74  *p = 0;.    best
165e0 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
165f0 72 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20  rse, pWC, pSrc, 
16600 6e 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72  notReady, pOrder
16610 42 79 2c 20 70 43 6f 73 74 2c 20 26 70 29 3b 0a  By, pCost, &p);.
16620 20 20 20 20 69 66 28 20 70 2d 3e 6e 65 65 64 54      if( p->needT
16630 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
16640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
16650 65 28 70 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  e(p->idxStr);.  
16660 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
16670 62 46 72 65 65 28 70 50 61 72 73 65 2d 3e 64 62  bFree(pParse->db
16680 2c 20 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  , p);.  }else.#e
16690 6e 64 69 66 0a 20 20 7b 0a 20 20 20 20 62 65 73  ndif.  {.    bes
166a0 74 42 74 72 65 65 49 6e 64 65 78 28 70 50 61 72  tBtreeIndex(pPar
166b0 73 65 2c 20 70 57 43 2c 20 70 53 72 63 2c 20 6e  se, pWC, pSrc, n
166c0 6f 74 52 65 61 64 79 2c 20 70 4f 72 64 65 72 42  otReady, pOrderB
166d0 79 2c 20 70 43 6f 73 74 29 3b 0a 20 20 7d 0a 7d  y, pCost);.  }.}
166e0 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
166f0 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
16700 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
16710 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
16720 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
16730 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
16740 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
16750 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
16760 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
16770 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
16780 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
16790 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
167a0 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
167b0 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
167c0 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
167d0 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
167e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
167f0 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
16800 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
16810 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
16820 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
16830 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
16840 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
16850 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
16860 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
16870 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
16880 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
16890 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
168a0 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
168b0 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
168c0 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
168d0 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
168e0 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
168f0 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
16900 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
16910 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
16920 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
16930 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
16940 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
16950 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
16960 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
16970 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
16980 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
16990 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
169a0 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
169b0 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
169c0 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
169d0 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
169e0 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
169f0 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
16a00 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
16a10 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
16a20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
16a30 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
16a40 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
16a50 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
16a60 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
16a70 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
16a80 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
16a90 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
16aa0 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
16ab0 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
16ac0 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
16ad0 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
16ae0 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
16af0 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
16b00 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
16b10 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
16b20 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
16b30 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
16b40 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16b50 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
16b60 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
16b70 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
16b80 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
16b90 20 20 20 20 20 26 26 20 41 4c 57 41 59 53 28 28       && ALWAYS((
16ba0 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26  pTerm->wtFlags &
16bb0 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 29   TERM_CODED)==0)
16bc0 0a 20 20 20 20 20 20 26 26 20 28 70 4c 65 76 65  .      && (pLeve
16bd0 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
16be0 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
16bf0 74 79 28 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  ty(pTerm->pExpr,
16c00 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20   EP_FromJoin)). 
16c10 20 29 7b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 77   ){.    pTerm->w
16c20 74 46 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  tFlags |= TERM_C
16c30 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70 54  ODED;.    if( pT
16c40 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30 20  erm->iParent>=0 
16c50 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54 65  ){.      WhereTe
16c60 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 54  rm *pOther = &pT
16c70 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65 72  erm->pWC->a[pTer
16c80 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20 20  m->iParent];.   
16c90 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65 72     if( (--pOther
16ca0 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b 0a  ->nChild)==0 ){.
16cb0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
16cc0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74 68  erm(pLevel, pOth
16cd0 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
16ce0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
16cf0 43 6f 64 65 20 61 6e 20 4f 50 5f 41 66 66 69 6e  Code an OP_Affin
16d00 69 74 79 20 6f 70 63 6f 64 65 20 74 6f 20 61 70  ity opcode to ap
16d10 70 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61  ply the column a
16d20 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 7a  ffinity string z
16d30 41 66 66 0a 2a 2a 20 74 6f 20 74 68 65 20 6e 20  Aff.** to the n 
16d40 72 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69  registers starti
16d50 6e 67 20 61 74 20 62 61 73 65 2e 20 0a 2a 2a 0a  ng at base. .**.
16d60 2a 2a 20 42 75 66 66 65 72 20 7a 41 66 66 20 77  ** Buffer zAff w
16d70 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  as allocated usi
16d80 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
16d90 6f 63 28 29 2e 20 49 74 20 69 73 20 74 68 65 20  oc(). It is the 
16da0 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  .** responsibili
16db0 74 79 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ty of this funct
16dc0 69 6f 6e 20 74 6f 20 61 72 72 61 6e 67 65 20 66  ion to arrange f
16dd0 6f 72 20 69 74 20 74 6f 20 62 65 20 65 76 65 6e  or it to be even
16de0 74 75 61 6c 6c 79 0a 2a 2a 20 66 72 65 65 64 20  tually.** freed 
16df0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
16e00 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
16e10 20 76 6f 69 64 20 63 6f 64 65 41 70 70 6c 79 41   void codeApplyA
16e20 66 66 69 6e 69 74 79 28 50 61 72 73 65 20 2a 70  ffinity(Parse *p
16e30 50 61 72 73 65 2c 20 69 6e 74 20 62 61 73 65 2c  Parse, int base,
16e40 20 69 6e 74 20 6e 2c 20 63 68 61 72 20 2a 7a 41   int n, char *zA
16e50 66 66 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  ff){.  Vdbe *v =
16e60 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
16e70 20 20 61 73 73 65 72 74 28 20 76 21 3d 30 20 29    assert( v!=0 )
16e80 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
16e90 64 64 4f 70 32 28 76 2c 20 4f 50 5f 41 66 66 69  ddOp2(v, OP_Affi
16ea0 6e 69 74 79 2c 20 62 61 73 65 2c 20 6e 29 3b 0a  nity, base, n);.
16eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
16ec0 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 7a 41 66  ngeP4(v, -1, zAf
16ed0 66 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  f, P4_DYNAMIC);.
16ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
16ef0 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67 65  heAffinityChange
16f00 28 70 50 61 72 73 65 2c 20 62 61 73 65 2c 20 6e  (pParse, base, n
16f10 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  );.}.../*.** Gen
16f20 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
16f30 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69 74 79   single equality
16f40 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45   term of the WHE
16f50 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65  RE clause.  An e
16f60 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20  quality.** term 
16f70 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d  can be either X=
16f80 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e  expr or X IN (..
16f90 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74  .).   pTerm is t
16fa0 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a  he term to be .*
16fb0 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  * coded..**.** T
16fc0 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
16fd0 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74 72 61   for the constra
16fe0 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e 20 72  int is left in r
16ff0 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a 2a 2a  egister iReg..**
17000 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72  .** For a constr
17010 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d  aint of the form
17020 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70   X=expr, the exp
17030 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75  ression is evalu
17040 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20  ated and its.** 
17050 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f  result is left o
17060 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f  n the stack.  Fo
17070 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66  r constraints of
17080 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28   the form X IN (
17090 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75  ...).** this rou
170a0 74 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c  tine sets up a l
170b0 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74  oop that will it
170c0 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76  erate over all v
170d0 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73  alues of X..*/.s
170e0 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 45 71  tatic int codeEq
170f0 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
17100 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17110 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
17120 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
17130 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
17140 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
17150 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
17160 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
17170 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  .  WhereLevel *p
17180 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65 6e 20 6c  Level, /* When l
17190 65 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d  evel of the FROM
171a0 20 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77   clause we are w
171b0 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 20 20 69  orking on */.  i
171c0 6e 74 20 69 54 61 72 67 65 74 20 20 20 20 20 20  nt iTarget      
171d0 20 20 20 2f 2a 20 41 74 74 65 6d 70 74 20 74 6f     /* Attempt to
171e0 20 6c 65 61 76 65 20 72 65 73 75 6c 74 73 20 69   leave results i
171f0 6e 20 74 68 69 73 20 72 65 67 69 73 74 65 72 20  n this register 
17200 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 58  */.){.  Expr *pX
17210 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
17220 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
17230 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
17240 74 20 69 52 65 67 3b 20 20 20 20 20 20 20 20 20  t iReg;         
17250 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69           /* Regi
17260 73 74 65 72 20 68 6f 6c 64 69 6e 67 20 72 65 73  ster holding res
17270 75 6c 74 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ults */..  asser
17280 74 28 20 69 54 61 72 67 65 74 3e 30 20 29 3b 0a  t( iTarget>0 );.
17290 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
172a0 5f 45 51 20 29 7b 0a 20 20 20 20 69 52 65 67 20  _EQ ){.    iReg 
172b0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
172c0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
172d0 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 54 61 72  pX->pRight, iTar
172e0 67 65 74 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  get);.  }else if
172f0 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e  ( pX->op==TK_ISN
17300 55 4c 4c 20 29 7b 0a 20 20 20 20 69 52 65 67 20  ULL ){.    iReg 
17310 3d 20 69 54 61 72 67 65 74 3b 0a 20 20 20 20 73  = iTarget;.    s
17320 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17330 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
17340 69 52 65 67 29 3b 0a 23 69 66 6e 64 65 66 20 53  iReg);.#ifndef S
17350 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
17360 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
17370 20 69 6e 74 20 65 54 79 70 65 3b 0a 20 20 20 20   int eType;.    
17380 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 73 74  int iTab;.    st
17390 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
173a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ;..    assert( p
173b0 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a  X->op==TK_IN );.
173c0 20 20 20 20 69 52 65 67 20 3d 20 69 54 61 72 67      iReg = iTarg
173d0 65 74 3b 0a 20 20 20 20 65 54 79 70 65 20 3d 20  et;.    eType = 
173e0 73 71 6c 69 74 65 33 46 69 6e 64 49 6e 49 6e 64  sqlite3FindInInd
173f0 65 78 28 70 50 61 72 73 65 2c 20 70 58 2c 20 30  ex(pParse, pX, 0
17400 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58  );.    iTab = pX
17410 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
17420 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17430 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54  v, OP_Rewind, iT
17440 61 62 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ab, 0);.    asse
17450 72 74 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  rt( pLevel->plan
17460 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
17470 5f 49 4e 5f 41 42 4c 45 20 29 3b 0a 20 20 20 20  _IN_ABLE );.    
17480 69 66 28 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e  if( pLevel->u.in
17490 2e 6e 49 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  .nIn==0 ){.     
174a0 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74   pLevel->addrNxt
174b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
174c0 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
174d0 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e  }.    pLevel->u.
174e0 69 6e 2e 6e 49 6e 2b 2b 3b 0a 20 20 20 20 70 4c  in.nIn++;.    pL
174f0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f  evel->u.in.aInLo
17500 6f 70 20 3d 0a 20 20 20 20 20 20 20 73 71 6c 69  op =.       sqli
17510 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
17520 65 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ee(pParse->db, p
17530 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e 4c  Level->u.in.aInL
17540 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  oop,.           
17550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17560 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
17570 2d 3e 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 5b 30  ->u.in.aInLoop[0
17580 5d 29 2a 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e  ])*pLevel->u.in.
17590 6e 49 6e 29 3b 0a 20 20 20 20 70 49 6e 20 3d 20  nIn);.    pIn = 
175a0 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 61 49 6e  pLevel->u.in.aIn
175b0 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70 49  Loop;.    if( pI
175c0 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20 2b  n ){.      pIn +
175d0 3d 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  = pLevel->u.in.n
175e0 49 6e 20 2d 20 31 3b 0a 20 20 20 20 20 20 70 49  In - 1;.      pI
175f0 6e 2d 3e 69 43 75 72 20 3d 20 69 54 61 62 3b 0a  n->iCur = iTab;.
17600 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
17610 3d 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44 20  =IN_INDEX_ROWID 
17620 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 2d 3e  ){.        pIn->
17630 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71 6c 69  addrInTop = sqli
17640 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
17650 20 4f 50 5f 52 6f 77 69 64 2c 20 69 54 61 62 2c   OP_Rowid, iTab,
17660 20 69 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 65   iReg);.      }e
17670 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49 6e  lse{.        pIn
17680 2d 3e 61 64 64 72 49 6e 54 6f 70 20 3d 20 73 71  ->addrInTop = sq
17690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
176a0 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 54  v, OP_Column, iT
176b0 61 62 2c 20 30 2c 20 69 52 65 67 29 3b 0a 20 20  ab, 0, iReg);.  
176c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
176d0 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c  te3VdbeAddOp1(v,
176e0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 69 52 65 67   OP_IsNull, iReg
176f0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
17700 20 20 20 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e      pLevel->u.in
17710 2e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  .nIn = 0;.    }.
17720 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69 73  #endif.  }.  dis
17730 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
17740 20 70 54 65 72 6d 29 3b 0a 20 20 72 65 74 75 72   pTerm);.  retur
17750 6e 20 69 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iReg;.}../*.**
17760 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
17770 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75 61 74  hat will evaluat
17780 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49 4e 20  e all == and IN 
17790 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20  constraints for 
177a0 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20 54 68  an.** index.  Th
177b0 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c  e values for all
177c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
177d0 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73 74 61   left on the sta
177e0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  ck..**.** For ex
177f0 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65 72 20  ample, consider 
17800 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63 2c 64  table t1(a,b,c,d
17810 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64 65 78  ,e,f) with index
17820 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a 20 53   i1(a,b,c)..** S
17830 75 70 70 6f 73 65 20 74 68 65 20 57 48 45 52 45  uppose the WHERE
17840 20 63 6c 61 75 73 65 20 69 73 20 74 68 69 73 3a   clause is this:
17850 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49 4e 20    a==5 AND b IN 
17860 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e 35 20  (1,2,3) AND c>5 
17870 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68 65 20  AND c<10.** The 
17880 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d 61 6e  index has as man
17890 79 20 61 73 20 74 68 72 65 65 20 65 71 75 61 6c  y as three equal
178a0 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  ity constraints,
178b0 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a 2a 20   but in this.** 
178c0 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74 68 69  example, the thi
178d0 72 64 20 22 63 22 20 76 61 6c 75 65 20 69 73 20  rd "c" value is 
178e0 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20  an inequality.  
178f0 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a 2a 20  So only two .** 
17900 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
17910 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72 6f 75  coded.  This rou
17920 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65 72 61  tine will genera
17930 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
17940 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e 64 20  ate.** a==5 and 
17950 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20 20 54  b IN (1,2,3).  T
17960 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
17970 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20 77 69  s for a and b wi
17980 6c 6c 20 62 65 20 73 74 6f 72 65 64 0a 2a 2a 20  ll be stored.** 
17990 69 6e 20 63 6f 6e 73 65 63 75 74 69 76 65 20 72  in consecutive r
179a0 65 67 69 73 74 65 72 73 20 61 6e 64 20 74 68 65  egisters and the
179b0 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 66 69   index of the fi
179c0 72 73 74 20 72 65 67 69 73 74 65 72 20 69 73 20  rst register is 
179d0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
179e0 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61  In the example a
179f0 62 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75  bove nEq==2.  Bu
17a00 74 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e  t this subroutin
17a10 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  e works for any 
17a20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20  value.** of nEq 
17a30 69 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66  including 0.  If
17a40 20 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f   nEq==0, this ro
17a50 75 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20  utine is nearly 
17a60 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20  a no-op..** The 
17a70 6f 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f  only thing it do
17a80 65 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74  es is allocate t
17a90 68 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  he pLevel->iMem 
17aa0 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
17ab0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17ac0 61 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73  always allocates
17ad0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65   at least one me
17ae0 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
17af0 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20 69 6e 64  turns.** the ind
17b00 65 78 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72  ex of that memor
17b10 79 20 63 65 6c 6c 2e 20 54 68 65 20 63 6f 64 65  y cell. The code
17b20 20 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74   that.** calls t
17b30 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
17b40 20 75 73 65 20 74 68 61 74 20 6d 65 6d 6f 72 79   use that memory
17b50 20 63 65 6c 6c 20 74 6f 20 73 74 6f 72 65 20 74   cell to store t
17b60 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
17b70 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
17b80 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
17b90 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
17ba0 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
17bb0 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
17bc0 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
17bd0 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
17be0 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
17bf0 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
17c00 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
17c10 74 75 72 6e 69 6e 67 2c 20 2a 70 7a 41 66 66 20  turning, *pzAff 
17c20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
17c30 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
17c40 61 69 6e 69 6e 67 20 61 0a 2a 2a 20 63 6f 70 79  aining a.** copy
17c50 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61   of the column a
17c60 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 6f  ffinity string o
17c70 66 20 74 68 65 20 69 6e 64 65 78 20 61 6c 6c 6f  f the index allo
17c80 63 61 74 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  cated using.** s
17c90 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28 29  qlite3DbMalloc()
17ca0 2e 20 45 78 63 65 70 74 2c 20 65 6e 74 72 69 65  . Except, entrie
17cb0 73 20 69 6e 20 74 68 65 20 63 6f 70 79 20 6f 66  s in the copy of
17cc0 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 73 6f   the string asso
17cd0 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 65  ciated.** with e
17ce0 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
17cf0 6e 74 73 20 74 68 61 74 20 75 73 65 20 4e 4f 4e  nts that use NON
17d00 45 20 61 66 66 69 6e 69 74 79 20 61 72 65 20 73  E affinity are s
17d10 65 74 20 74 6f 0a 2a 2a 20 53 51 4c 49 54 45 5f  et to.** SQLITE_
17d20 41 46 46 5f 4e 4f 4e 45 2e 20 54 68 69 73 20 69  AFF_NONE. This i
17d30 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 53  s to deal with S
17d40 51 4c 20 73 75 63 68 20 61 73 20 74 68 65 20 66  QL such as the f
17d50 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
17d60 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 74    CREATE TABLE t
17d70 31 28 61 20 54 45 58 54 20 50 52 49 4d 41 52 59  1(a TEXT PRIMARY
17d80 20 4b 45 59 2c 20 62 29 3b 0a 2a 2a 20 20 20 53   KEY, b);.**   S
17d90 45 4c 45 43 54 20 2e 2e 2e 20 46 52 4f 4d 20 74  ELECT ... FROM t
17da0 31 20 41 53 20 74 32 2c 20 74 31 20 57 48 45 52  1 AS t2, t1 WHER
17db0 45 20 74 31 2e 61 20 3d 20 74 32 2e 62 3b 0a 2a  E t1.a = t2.b;.*
17dc0 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d  *.** In the exam
17dd0 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20 69  ple above, the i
17de0 6e 64 65 78 20 6f 6e 20 74 31 28 61 29 20 68 61  ndex on t1(a) ha
17df0 73 20 54 45 58 54 20 61 66 66 69 6e 69 74 79 2e  s TEXT affinity.
17e00 20 42 75 74 20 73 69 6e 63 65 0a 2a 2a 20 74 68   But since.** th
17e10 65 20 72 69 67 68 74 20 68 61 6e 64 20 73 69 64  e right hand sid
17e20 65 20 6f 66 20 74 68 65 20 65 71 75 61 6c 69 74  e of the equalit
17e30 79 20 63 6f 6e 73 74 72 61 69 6e 74 20 28 74 32  y constraint (t2
17e40 2e 62 29 20 68 61 73 20 4e 4f 4e 45 20 61 66 66  .b) has NONE aff
17e50 69 6e 69 74 79 2c 0a 2a 2a 20 6e 6f 20 63 6f 6e  inity,.** no con
17e60 76 65 72 73 69 6f 6e 20 73 68 6f 75 6c 64 20 62  version should b
17e70 65 20 61 74 74 65 6d 70 74 65 64 20 62 65 66 6f  e attempted befo
17e80 72 65 20 75 73 69 6e 67 20 61 20 74 32 2e 62 20  re using a t2.b 
17e90 76 61 6c 75 65 20 61 73 20 70 61 72 74 20 6f 66  value as part of
17ea0 0a 2a 2a 20 61 20 6b 65 79 20 74 6f 20 73 65 61  .** a key to sea
17eb0 72 63 68 20 74 68 65 20 69 6e 64 65 78 2e 20 48  rch the index. H
17ec0 65 6e 63 65 20 74 68 65 20 66 69 72 73 74 20 62  ence the first b
17ed0 79 74 65 20 69 6e 20 74 68 65 20 72 65 74 75 72  yte in the retur
17ee0 6e 65 64 20 61 66 66 69 6e 69 74 79 0a 2a 2a 20  ned affinity.** 
17ef0 73 74 72 69 6e 67 20 69 6e 20 74 68 69 73 20 65  string in this e
17f00 78 61 6d 70 6c 65 20 77 6f 75 6c 64 20 62 65 20  xample would be 
17f10 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 41 46  set to SQLITE_AF
17f20 46 5f 4e 4f 4e 45 2e 0a 2a 2f 0a 73 74 61 74 69  F_NONE..*/.stati
17f30 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c 45 71 75  c int codeAllEqu
17f40 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 50 61  alityTerms(.  Pa
17f50 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
17f60 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
17f70 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
17f80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
17f90 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73 74 65    /* Which neste
17fa0 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 46 52  d loop of the FR
17fb0 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69 6e 67  OM we are coding
17fc0 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
17fd0 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a 20 54  e *pWC,     /* T
17fe0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
17ff0 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
18000 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 57 68  Ready,     /* Wh
18010 69 63 68 20 70 61 72 74 73 20 6f 66 20 46 52 4f  ich parts of FRO
18020 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 62  M have not yet b
18030 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69  een coded */.  i
18040 6e 74 20 6e 45 78 74 72 61 52 65 67 2c 20 20 20  nt nExtraReg,   
18050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
18060 66 20 65 78 74 72 61 20 72 65 67 69 73 74 65 72  f extra register
18070 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f  s to allocate */
18080 0a 20 20 63 68 61 72 20 2a 2a 70 7a 41 66 66 20  .  char **pzAff 
18090 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
180a0 20 53 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   Set to point to
180b0 20 61 66 66 69 6e 69 74 79 20 73 74 72 69 6e 67   affinity string
180c0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
180d0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e   = pLevel->plan.
180e0 6e 45 71 3b 20 20 20 2f 2a 20 54 68 65 20 6e 75  nEq;   /* The nu
180f0 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
18100 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
18110 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
18120 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18130 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
18140 6d 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  m under construc
18150 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20  tion */.  Index 
18160 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20  *pIdx;          
18170 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
18180 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65 64 20  ndex being used 
18190 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f  for this loop */
181a0 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 4c  .  int iCur = pL
181b0 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20  evel->iTabCur;  
181c0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f   /* The cursor o
181d0 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  f the table */. 
181e0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
181f0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
18200 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74  * A single const
18210 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20  raint term */.  
18220 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20 20  int j;          
18230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18240 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
18250 0a 20 20 69 6e 74 20 72 65 67 42 61 73 65 3b 20  .  int regBase; 
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74 65   /* Base registe
18280 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 67 3b  r */.  int nReg;
18290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
182b0 66 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 61  f registers to a
182c0 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 63 68 61  llocate */.  cha
182d0 72 20 2a 7a 41 66 66 3b 20 20 20 20 20 20 20 20  r *zAff;        
182e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 66             /* Af
182f0 66 69 6e 69 74 79 20 73 74 72 69 6e 67 20 74 6f  finity string to
18300 20 72 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a   return */..  /*
18310 20 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 73 20   This module is 
18320 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 6f 6e 20 71  only called on q
18330 75 65 72 79 20 70 6c 61 6e 73 20 74 68 61 74 20  uery plans that 
18340 75 73 65 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f  use an index. */
18350 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 76 65  .  assert( pLeve
18360 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
18370 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20  & WHERE_INDEXED 
18380 29 3b 0a 20 20 70 49 64 78 20 3d 20 70 4c 65 76  );.  pIdx = pLev
18390 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
183a0 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
183b0 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72  t how many memor
183c0 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20  y cells we will 
183d0 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61  need then alloca
183e0 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2f 0a 20 20  te them..  */.  
183f0 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
18400 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20 6e 52  ->nMem + 1;.  nR
18410 65 67 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  eg = pLevel->pla
18420 6e 2e 6e 45 71 20 2b 20 6e 45 78 74 72 61 52 65  n.nEq + nExtraRe
18430 67 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  g;.  pParse->nMe
18440 6d 20 2b 3d 20 6e 52 65 67 3b 0a 0a 20 20 7a 41  m += nReg;..  zA
18450 66 66 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  ff = sqlite3DbSt
18460 72 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c  rDup(pParse->db,
18470 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66   sqlite3IndexAff
18480 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49 64 78  inityStr(v, pIdx
18490 29 29 3b 0a 20 20 69 66 28 20 21 7a 41 66 66 20  ));.  if( !zAff 
184a0 29 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 64  ){.    pParse->d
184b0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
184c0 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45  = 1;.  }..  /* E
184d0 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61  valuate the equa
184e0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
184f0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18500 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 3d 6e  pIdx->nColumn>=n
18510 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  Eq );.  for(j=0;
18520 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20   j<nEq; j++){.  
18530 20 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 69 6e    int r1;.    in
18540 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
18550 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65  lumn[j];.    pTe
18560 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57  rm = findTerm(pW
18570 43 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52  C, iCur, k, notR
18580 65 61 64 79 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c  eady, pLevel->pl
18590 61 6e 2e 77 73 46 6c 61 67 73 2c 20 70 49 64 78  an.wsFlags, pIdx
185a0 29 3b 0a 20 20 20 20 69 66 28 20 4e 45 56 45 52  );.    if( NEVER
185b0 28 70 54 65 72 6d 3d 3d 30 29 20 29 20 62 72 65  (pTerm==0) ) bre
185c0 61 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ak;.    assert( 
185d0 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
185e0 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
185f0 20 29 3b 0a 20 20 20 20 72 31 20 3d 20 63 6f 64   );.    r1 = cod
18600 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
18610 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c 65  arse, pTerm, pLe
18620 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29 3b  vel, regBase+j);
18630 0a 20 20 20 20 69 66 28 20 72 31 21 3d 72 65 67  .    if( r1!=reg
18640 42 61 73 65 2b 6a 20 29 7b 0a 20 20 20 20 20 20  Base+j ){.      
18650 69 66 28 20 6e 52 65 67 3d 3d 31 20 29 7b 0a 20  if( nReg==1 ){. 
18660 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
18670 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61  leaseTempReg(pPa
18680 72 73 65 2c 20 72 65 67 42 61 73 65 29 3b 0a 20  rse, regBase);. 
18690 20 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d         regBase =
186a0 20 72 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   r1;.      }else
186b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
186c0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
186d0 50 5f 53 43 6f 70 79 2c 20 72 31 2c 20 72 65 67  P_SCopy, r1, reg
186e0 42 61 73 65 2b 6a 29 3b 0a 20 20 20 20 20 20 7d  Base+j);.      }
186f0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63  .    }.    testc
18700 61 73 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ase( pTerm->eOpe
18710 72 61 74 6f 72 20 26 20 57 4f 5f 49 53 4e 55 4c  rator & WO_ISNUL
18720 4c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  L );.    testcas
18730 65 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  e( pTerm->eOpera
18740 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 3b 0a 20  tor & WO_IN );. 
18750 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 65     if( (pTerm->e
18760 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 49  Operator & (WO_I
18770 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29 3d 3d 30  SNULL|WO_IN))==0
18780 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
18790 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
187a0 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
187b0 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64  e+j, pLevel->add
187c0 72 42 72 6b 29 3b 0a 20 20 20 20 20 20 69 66 28  rBrk);.      if(
187d0 20 7a 41 66 66 20 0a 20 20 20 20 20 20 20 26 26   zAff .       &&
187e0 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
187f0 66 66 69 6e 69 74 79 28 70 54 65 72 6d 2d 3e 70  ffinity(pTerm->p
18800 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 7a 41  Expr->pRight, zA
18810 66 66 5b 6a 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  ff[j])==SQLITE_A
18820 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 29 7b  FF_NONE.      ){
18830 0a 20 20 20 20 20 20 20 20 7a 41 66 66 5b 6a 5d  .        zAff[j]
18840 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f   = SQLITE_AFF_NO
18850 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NE;.      }.    
18860 7d 0a 20 20 7d 0a 20 20 2a 70 7a 41 66 66 20 3d  }.  }.  *pzAff =
18870 20 7a 41 66 66 3b 0a 20 20 72 65 74 75 72 6e 20   zAff;.  return 
18880 72 65 67 42 61 73 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  regBase;.}../*.*
18890 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
188a0 66 6f 72 20 74 68 65 20 73 74 61 72 74 20 6f 66  for the start of
188b0 20 74 68 65 20 69 4c 65 76 65 6c 2d 74 68 20 6c   the iLevel-th l
188c0 6f 6f 70 20 69 6e 20 74 68 65 20 57 48 45 52 45  oop in the WHERE
188d0 20 63 6c 61 75 73 65 0a 2a 2a 20 69 6d 70 6c 65   clause.** imple
188e0 6d 65 6e 74 61 74 69 6f 6e 20 64 65 73 63 72 69  mentation descri
188f0 62 65 64 20 62 79 20 70 57 49 6e 66 6f 2e 0a 2a  bed by pWInfo..*
18900 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
18910 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61 72   codeOneLoopStar
18920 74 28 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  t(.  WhereInfo *
18930 70 57 49 6e 66 6f 2c 20 20 20 2f 2a 20 43 6f 6d  pWInfo,   /* Com
18940 70 6c 65 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f  plete informatio
18950 6e 20 61 62 6f 75 74 20 74 68 65 20 57 48 45 52  n about the WHER
18960 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  E clause */.  in
18970 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20  t iLevel,       
18980 20 20 20 2f 2a 20 57 68 69 63 68 20 6c 65 76 65     /* Which leve
18990 6c 20 6f 66 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  l of pWInfo->a[]
189a0 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 64 65 64   should be coded
189b0 20 2a 2f 0a 20 20 75 31 36 20 77 63 74 72 6c 46   */.  u16 wctrlF
189c0 6c 61 67 73 2c 20 20 20 20 20 20 2f 2a 20 4f 6e  lags,      /* On
189d0 65 20 6f 66 20 74 68 65 20 57 48 45 52 45 5f 2a  e of the WHERE_*
189e0 20 66 6c 61 67 73 20 64 65 66 69 6e 65 64 20 69   flags defined i
189f0 6e 20 73 71 6c 69 74 65 49 6e 74 2e 68 20 2a 2f  n sqliteInt.h */
18a00 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
18a10 61 64 79 20 20 20 20 20 2f 2a 20 57 68 69 63 68  ady     /* Which
18a20 20 74 61 62 6c 65 73 20 61 72 65 20 63 75 72 72   tables are curr
18a30 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 20  ently available 
18a40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6a 2c 20 6b  */.){.  int j, k
18a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
18a60 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
18a70 0a 20 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20  .  int iCur;    
18a80 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
18a90 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
18aa0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  he table */.  in
18ab0 74 20 61 64 64 72 4e 78 74 3b 20 20 20 20 20 20  t addrNxt;      
18ac0 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a     /* Where to j
18ad0 75 6d 70 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ump to continue 
18ae0 77 69 74 68 20 74 68 65 20 6e 65 78 74 20 49 4e  with the next IN
18af0 20 63 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   case */.  int o
18b00 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 20 20  mitTable;       
18b10 2f 2a 20 54 72 75 65 20 69 66 20 77 65 20 75 73  /* True if we us
18b20 65 20 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79  e the index only
18b30 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 3b 20   */.  int bRev; 
18b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18b50 75 65 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f  ue if we need to
18b60 20 73 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65   scan in reverse
18b70 20 6f 72 64 65 72 20 2a 2f 0a 20 20 57 68 65 72   order */.  Wher
18b80 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20  eLevel *pLevel; 
18b90 20 2f 2a 20 54 68 65 20 77 68 65 72 65 20 6c 65   /* The where le
18ba0 76 65 6c 20 74 6f 20 62 65 20 63 6f 64 65 64 20  vel to be coded 
18bb0 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
18bc0 20 2a 70 57 43 3b 20 20 20 20 2f 2a 20 44 65 63   *pWC;    /* Dec
18bd0 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  omposition of th
18be0 65 20 65 6e 74 69 72 65 20 57 48 45 52 45 20 63  e entire WHERE c
18bf0 6c 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65  lause */.  Where
18c00 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
18c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
18c20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
18c30 6d 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  m */.  Parse *pP
18c40 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  arse;           
18c50 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
18c60 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 56  g context */.  V
18c70 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20  dbe *v;         
18c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18c90 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
18ca0 74 6d 74 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  tmt under constr
18cb0 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 73 74 72  uctions */.  str
18cc0 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
18cd0 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
18ce0 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72 6d  FROM clause term
18cf0 20 62 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a   being coded */.
18d00 20 20 69 6e 74 20 61 64 64 72 42 72 6b 3b 20 20    int addrBrk;  
18d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 74    /* Jump here t
18d30 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74  o break out of t
18d40 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  he loop */.  int
18d50 20 61 64 64 72 43 6f 6e 74 3b 20 20 20 20 20 20   addrCont;      
18d60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d70 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 63 6f 6e  Jump here to con
18d80 74 69 6e 75 65 20 77 69 74 68 20 6e 65 78 74 20  tinue with next 
18d90 63 79 63 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  cycle */.  int i
18da0 52 6f 77 69 64 52 65 67 20 3d 20 30 3b 20 20 20  RowidReg = 0;   
18db0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 69 73       /* Rowid is
18dc0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 69 73 20   stored in this 
18dd0 72 65 67 69 73 74 65 72 2c 20 69 66 20 6e 6f 74  register, if not
18de0 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20 69   zero */.  int i
18df0 52 65 6c 65 61 73 65 52 65 67 20 3d 20 30 3b 20  ReleaseReg = 0; 
18e00 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65 67       /* Temp reg
18e10 69 73 74 65 72 20 74 6f 20 66 72 65 65 20 62 65  ister to free be
18e20 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 2a  fore returning *
18e30 2f 0a 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  /..  pParse = pW
18e40 49 6e 66 6f 2d 3e 70 50 61 72 73 65 3b 0a 20 20  Info->pParse;.  
18e50 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
18e60 65 3b 0a 20 20 70 57 43 20 3d 20 70 57 49 6e 66  e;.  pWC = pWInf
18e70 6f 2d 3e 70 57 43 3b 0a 20 20 70 4c 65 76 65 6c  o->pWC;.  pLevel
18e80 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 4c   = &pWInfo->a[iL
18e90 65 76 65 6c 5d 3b 0a 20 20 70 54 61 62 49 74 65  evel];.  pTabIte
18ea0 6d 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 70 54 61  m = &pWInfo->pTa
18eb0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
18ec0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 69 43 75 72 20  >iFrom];.  iCur 
18ed0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
18ee0 73 6f 72 3b 0a 20 20 62 52 65 76 20 3d 20 28 70  sor;.  bRev = (p
18ef0 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
18f00 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56 45  ags & WHERE_REVE
18f10 52 53 45 29 21 3d 30 3b 0a 20 20 6f 6d 69 74 54  RSE)!=0;.  omitT
18f20 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
18f30 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
18f40 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d  HERE_IDX_ONLY)!=
18f50 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  0 .           &&
18f60 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
18f70 48 45 52 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45  HERE_FORCE_TABLE
18f80 29 3d 3d 30 3b 0a 0a 20 20 2f 2a 20 43 72 65 61  )==0;..  /* Crea
18f90 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74 68  te labels for th
18fa0 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22 63  e "break" and "c
18fb0 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75 63  ontinue" instruc
18fc0 74 69 6f 6e 73 0a 20 20 2a 2a 20 66 6f 72 20 74  tions.  ** for t
18fd0 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e  he current loop.
18fe0 20 20 4a 75 6d 70 20 74 6f 20 61 64 64 72 42 72    Jump to addrBr
18ff0 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f  k to break out o
19000 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4a  f a loop..  ** J
19010 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20 67  ump to cont to g
19020 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f  o immediately to
19030 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61 74   the next iterat
19040 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ion of the.  ** 
19050 6c 6f 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  loop..  **.  ** 
19060 57 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  When there is an
19070 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 77 65   IN operator, we
19080 20 61 6c 73 6f 20 68 61 76 65 20 61 20 22 61 64   also have a "ad
19090 64 72 4e 78 74 22 20 6c 61 62 65 6c 20 74 68 61  drNxt" label tha
190a0 74 0a 20 20 2a 2a 20 6d 65 61 6e 73 20 74 6f 20  t.  ** means to 
190b0 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 74 68  continue with th
190c0 65 20 6e 65 78 74 20 49 4e 20 76 61 6c 75 65 20  e next IN value 
190d0 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e 20 20 57 68  combination.  Wh
190e0 65 6e 0a 20 20 2a 2a 20 74 68 65 72 65 20 61 72  en.  ** there ar
190f0 65 20 6e 6f 20 49 4e 20 6f 70 65 72 61 74 6f 72  e no IN operator
19100 73 20 69 6e 20 74 68 65 20 63 6f 6e 73 74 72 61  s in the constra
19110 69 6e 74 73 2c 20 74 68 65 20 22 61 64 64 72 4e  ints, the "addrN
19120 78 74 22 20 6c 61 62 65 6c 0a 20 20 2a 2a 20 69  xt" label.  ** i
19130 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 22 61  s the same as "a
19140 64 64 72 42 72 6b 22 2e 0a 20 20 2a 2f 0a 20 20  ddrBrk"..  */.  
19150 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76 65 6c  addrBrk = pLevel
19160 2d 3e 61 64 64 72 42 72 6b 20 3d 20 70 4c 65 76  ->addrBrk = pLev
19170 65 6c 2d 3e 61 64 64 72 4e 78 74 20 3d 20 73 71  el->addrNxt = sq
19180 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
19190 65 6c 28 76 29 3b 0a 20 20 61 64 64 72 43 6f 6e  el(v);.  addrCon
191a0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  t = pLevel->addr
191b0 43 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  Cont = sqlite3Vd
191c0 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
191d0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
191e0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
191f0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
19200 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
19210 61 6e 64 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  and.  ** initial
19220 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ize a memory cel
19230 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69  l that records i
19240 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74  f this table mat
19250 63 68 65 73 20 61 6e 79 0a 20 20 2a 2a 20 72 6f  ches any.  ** ro
19260 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
19270 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
19280 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
19290 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28  el->iFrom>0 && (
192a0 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69 6e  pTabItem[0].join
192b0 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
192c0 3d 30 20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c  =0 ){.    pLevel
192d0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 2b 2b  ->iLeftJoin = ++
192e0 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20  pParse->nMem;.  
192f0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
19300 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
19310 72 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  r, 0, pLevel->iL
19320 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 56 64  eftJoin);.    Vd
19330 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 69  beComment((v, "i
19340 6e 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f  nit LEFT JOIN no
19350 2d 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a  -match flag"));.
19360 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
19370 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
19380 54 41 42 4c 45 0a 20 20 69 66 28 20 20 28 70 4c  TABLE.  if(  (pL
19390 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61  evel->plan.wsFla
193a0 67 73 20 26 20 57 48 45 52 45 5f 56 49 52 54 55  gs & WHERE_VIRTU
193b0 41 4c 54 41 42 4c 45 29 21 3d 30 20 29 7b 0a 20  ALTABLE)!=0 ){. 
193c0 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
193d0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
193e0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
193f0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
19400 64 20 56 4e 65 78 74 0a 20 20 20 20 2a 2a 20 20  d VNext.    **  
19410 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
19420 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
19430 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65 67 3b  */.    int iReg;
19440 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20 66     /* P3 Value f
19450 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a 2f  or OP_VFilter */
19460 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64  .    sqlite3_ind
19470 65 78 5f 69 6e 66 6f 20 2a 70 56 74 61 62 49 64  ex_info *pVtabId
19480 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
19490 2e 75 2e 70 56 74 61 62 49 64 78 3b 0a 20 20 20  .u.pVtabIdx;.   
194a0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
194b0 20 3d 20 70 56 74 61 62 49 64 78 2d 3e 6e 43 6f   = pVtabIdx->nCo
194c0 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 73 74  nstraint;.    st
194d0 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
194e0 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
194f0 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 56                pV
19530 74 61 62 49 64 78 2d 3e 61 43 6f 6e 73 74 72 61  tabIdx->aConstra
19540 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20 63 6f  intUsage;.    co
19550 6e 73 74 20 73 74 72 75 63 74 20 73 71 6c 69 74  nst struct sqlit
19560 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
19570 69 6e 74 20 2a 61 43 6f 6e 73 74 72 61 69 6e 74  int *aConstraint
19580 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
19590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195b0 20 20 20 70 56 74 61 62 49 64 78 2d 3e 61 43 6f     pVtabIdx->aCo
195c0 6e 73 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 69  nstraint;..    i
195d0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 47 65 74  Reg = sqlite3Get
195e0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
195f0 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b 32 29  , nConstraint+2)
19600 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
19610 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  <=nConstraint; j
19620 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6b  ++){.      for(k
19630 3d 30 3b 20 6b 3c 6e 43 6f 6e 73 74 72 61 69 6e  =0; k<nConstrain
19640 74 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  t; k++){.       
19650 20 69 66 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61   if( aUsage[k].a
19660 72 67 76 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20  rgvIndex==j ){. 
19670 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65           int iTe
19680 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
19690 5b 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [k].iTermOffset;
196a0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
196b0 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
196c0 65 2c 20 70 57 43 2d 3e 61 5b 69 54 65 72 6d 5d  e, pWC->a[iTerm]
196d0 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20  .pExpr->pRight, 
196e0 69 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20  iReg+j+1);.     
196f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19700 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19710 20 20 20 20 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73      if( k==nCons
19720 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a  traint ) break;.
19730 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
19740 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
19750 50 5f 49 6e 74 65 67 65 72 2c 20 70 56 74 61 62  P_Integer, pVtab
19760 49 64 78 2d 3e 69 64 78 4e 75 6d 2c 20 69 52 65  Idx->idxNum, iRe
19770 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  g);.    sqlite3V
19780 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19790 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52  Integer, j-1, iR
197a0 65 67 2b 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  eg+1);.    sqlit
197b0 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
197c0 4f 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72  OP_VFilter, iCur
197d0 2c 20 61 64 64 72 42 72 6b 2c 20 69 52 65 67 2c  , addrBrk, iReg,
197e0 20 70 56 74 61 62 49 64 78 2d 3e 69 64 78 53 74   pVtabIdx->idxSt
197f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
19800 20 20 20 20 20 20 20 20 20 70 56 74 61 62 49 64           pVtabId
19810 78 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  x->needToFreeIdx
19820 53 74 72 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46  Str ? P4_MPRINTF
19830 20 3a 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20   : P4_STATIC);. 
19840 20 20 20 70 56 74 61 62 49 64 78 2d 3e 6e 65 65     pVtabIdx->nee
19850 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20  dToFreeIdxStr = 
19860 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
19870 6a 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a  j<nConstraint; j
19880 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
19890 55 73 61 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b  Usage[j].omit ){
198a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65  .        int iTe
198b0 72 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74  rm = aConstraint
198c0 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b  [j].iTermOffset;
198d0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
198e0 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 57  Term(pLevel, &pW
198f0 43 2d 3e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20  C->a[iTerm]);.  
19900 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19910 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
19920 56 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65 76 65  VNext;.    pLeve
19930 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
19940 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
19950 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
19960 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 73 71  tAddr(v);.    sq
19970 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
19980 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 52  Range(pParse, iR
19990 65 67 2c 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2b  eg, nConstraint+
199a0 32 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64  2);.  }else.#end
199b0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
199c0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
199d0 2f 0a 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  /..  if( pLevel-
199e0 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
199f0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
19a00 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a  {.    /* Case 1:
19a10 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c    We can directl
19a20 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
19a30 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61  ngle row using a
19a40 6e 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  n.    **        
19a50 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
19a60 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
19a70 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
19a80 4f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  Or.    **       
19a90 20 20 20 77 65 20 72 65 66 65 72 65 6e 63 65 20     we reference 
19aa0 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73  multiple rows us
19ab0 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20  ing a "rowid IN 
19ac0 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 20 20  (...)".    **   
19ad0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
19ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 52 65  ..    */.    iRe
19af0 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69 74  leaseReg = sqlit
19b00 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
19b10 72 73 65 29 3b 0a 20 20 20 20 70 54 65 72 6d 20  rse);.    pTerm 
19b20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
19b30 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
19b40 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c  dy, WO_EQ|WO_IN,
19b50 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
19b60 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
19b70 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
19b80 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
19b90 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 6c  assert( pTerm->l
19ba0 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
19bb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6f  );.    assert( o
19bc0 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20  mitTable==0 );. 
19bd0 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 63     iRowidReg = c
19be0 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
19bf0 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70  pParse, pTerm, p
19c00 4c 65 76 65 6c 2c 20 69 52 65 6c 65 61 73 65 52  Level, iReleaseR
19c10 65 67 29 3b 0a 20 20 20 20 61 64 64 72 4e 78 74  eg);.    addrNxt
19c20 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e   = pLevel->addrN
19c30 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  xt;.    sqlite3V
19c40 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
19c50 4d 75 73 74 42 65 49 6e 74 2c 20 69 52 6f 77 69  MustBeInt, iRowi
19c60 64 52 65 67 2c 20 61 64 64 72 4e 78 74 29 3b 0a  dReg, addrNxt);.
19c70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
19c80 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4e 6f 74 45  ddOp3(v, OP_NotE
19c90 78 69 73 74 73 2c 20 69 43 75 72 2c 20 61 64 64  xists, iCur, add
19ca0 72 4e 78 74 2c 20 69 52 6f 77 69 64 52 65 67 29  rNxt, iRowidReg)
19cb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
19cc0 72 43 61 63 68 65 53 74 6f 72 65 28 70 50 61 72  rCacheStore(pPar
19cd0 73 65 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52  se, iCur, -1, iR
19ce0 6f 77 69 64 52 65 67 29 3b 0a 20 20 20 20 56 64  owidReg);.    Vd
19cf0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
19d00 6b 22 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  k"));.    pLevel
19d10 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
19d20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76    }else if( pLev
19d30 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
19d40 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
19d50 41 4e 47 45 20 29 7b 0a 20 20 20 20 2f 2a 20 43  ANGE ){.    /* C
19d60 61 73 65 20 32 3a 20 20 57 65 20 68 61 76 65 20  ase 2:  We have 
19d70 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f  an inequality co
19d80 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
19d90 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
19da0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
19db0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
19dc0 70 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  p;.    int start
19dd0 3b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 45 6e 64  ;.    int memEnd
19de0 56 61 6c 75 65 20 3d 20 30 3b 0a 20 20 20 20 57  Value = 0;.    W
19df0 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72 74  hereTerm *pStart
19e00 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 61 73  , *pEnd;..    as
19e10 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
19e20 3d 30 20 29 3b 0a 20 20 20 20 70 53 74 61 72 74  =0 );.    pStart
19e30 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
19e40 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
19e50 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
19e60 2c 20 30 29 3b 0a 20 20 20 20 70 45 6e 64 20 3d  , 0);.    pEnd =
19e70 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
19e80 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
19e90 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20  y, WO_LT|WO_LE, 
19ea0 30 29 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  0);.    if( bRev
19eb0 20 29 7b 0a 20 20 20 20 20 20 70 54 65 72 6d 20   ){.      pTerm 
19ec0 3d 20 70 53 74 61 72 74 3b 0a 20 20 20 20 20 20  = pStart;.      
19ed0 70 53 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20  pStart = pEnd;. 
19ee0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
19ef0 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  m;.    }.    if(
19f00 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20   pStart ){.     
19f10 20 45 78 70 72 20 2a 70 58 3b 20 20 20 20 20 20   Expr *pX;      
19f20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
19f30 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 64 65  pression that de
19f40 66 69 6e 65 73 20 74 68 65 20 73 74 61 72 74 20  fines the start 
19f50 62 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 20 69  bound */.      i
19f60 6e 74 20 72 31 2c 20 72 54 65 6d 70 3b 20 20 20  nt r1, rTemp;   
19f70 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
19f80 73 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 74 68  s for holding th
19f90 65 20 73 74 61 72 74 20 62 6f 75 6e 64 61 72 79  e start boundary
19fa0 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68   */..      /* Th
19fb0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 73  e following cons
19fc0 74 61 6e 74 20 6d 61 70 73 20 54 4b 5f 78 78 20  tant maps TK_xx 
19fd0 63 6f 64 65 73 20 69 6e 74 6f 20 63 6f 72 72 65  codes into corre
19fe0 73 70 6f 6e 64 69 6e 67 20 0a 20 20 20 20 20 20  sponding .      
19ff0 2a 2a 20 73 65 65 6b 20 6f 70 63 6f 64 65 73 2e  ** seek opcodes.
1a000 20 20 49 74 20 64 65 70 65 6e 64 73 20 6f 6e 20    It depends on 
1a010 61 20 70 61 72 74 69 63 75 6c 61 72 20 6f 72 64  a particular ord
1a020 65 72 69 6e 67 20 6f 66 20 54 4b 5f 78 78 0a 20  ering of TK_xx. 
1a030 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
1a040 6e 73 74 20 75 38 20 61 4d 6f 76 65 4f 70 5b 5d  nst u8 aMoveOp[]
1a050 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
1a060 2f 2a 20 54 4b 5f 47 54 20 2a 2f 20 20 4f 50 5f  /* TK_GT */  OP_
1a070 53 65 65 6b 47 74 2c 0a 20 20 20 20 20 20 20 20  SeekGt,.        
1a080 20 20 20 2f 2a 20 54 4b 5f 4c 45 20 2a 2f 20 20     /* TK_LE */  
1a090 4f 50 5f 53 65 65 6b 4c 65 2c 0a 20 20 20 20 20  OP_SeekLe,.     
1a0a0 20 20 20 20 20 20 2f 2a 20 54 4b 5f 4c 54 20 2a        /* TK_LT *
1a0b0 2f 20 20 4f 50 5f 53 65 65 6b 4c 74 2c 0a 20 20  /  OP_SeekLt,.  
1a0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 4b 5f 47           /* TK_G
1a0d0 45 20 2a 2f 20 20 4f 50 5f 53 65 65 6b 47 65 0a  E */  OP_SeekGe.
1a0e0 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 61        };.      a
1a0f0 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 54 4b  ssert( TK_LE==TK
1a100 5f 47 54 2b 31 20 29 3b 20 20 20 20 20 20 2f 2a  _GT+1 );      /*
1a110 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6f   Make sure the o
1a120 72 64 65 72 69 6e 67 2e 2e 20 2a 2f 0a 20 20 20  rdering.. */.   
1a130 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
1a140 3d 3d 54 4b 5f 47 54 2b 32 20 29 3b 20 20 20 20  ==TK_GT+2 );    
1a150 20 20 2f 2a 20 20 2e 2e 2e 20 6f 66 20 74 68 65    /*  ... of the
1a160 20 54 4b 5f 78 78 20 76 61 6c 75 65 73 2e 2e 2e   TK_xx values...
1a170 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1a180 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 47 54 2b 33  ( TK_GE==TK_GT+3
1a190 20 29 3b 20 20 20 20 20 20 2f 2a 20 20 2e 2e 2e   );      /*  ...
1a1a0 20 69 73 20 63 6f 72 72 65 63 63 74 2e 20 2a 2f   is correcct. */
1a1b0 0a 0a 20 20 20 20 20 20 70 58 20 3d 20 70 53 74  ..      pX = pSt
1a1c0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
1a1d0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
1a1e0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1a1f0 20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72   pStart->leftCur
1a200 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
1a210 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
1a220 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
1a230 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
1a240 26 72 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 73  &rTemp);.      s
1a250 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1a260 28 76 2c 20 61 4d 6f 76 65 4f 70 5b 70 58 2d 3e  (v, aMoveOp[pX->
1a270 6f 70 2d 54 4b 5f 47 54 5d 2c 20 69 43 75 72 2c  op-TK_GT], iCur,
1a280 20 61 64 64 72 42 72 6b 2c 20 72 31 29 3b 0a 20   addrBrk, r1);. 
1a290 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
1a2a0 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
1a2b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a2c0 63 68 65 41 66 66 69 6e 69 74 79 43 68 61 6e 67  cheAffinityChang
1a2d0 65 28 70 50 61 72 73 65 2c 20 72 31 2c 20 31 29  e(pParse, r1, 1)
1a2e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
1a2f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
1a300 61 72 73 65 2c 20 72 54 65 6d 70 29 3b 0a 20 20  arse, rTemp);.  
1a310 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28      disableTerm(
1a320 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74 29 3b  pLevel, pStart);
1a330 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a340 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1a350 4f 70 32 28 76 2c 20 62 52 65 76 20 3f 20 4f 50  Op2(v, bRev ? OP
1a360 5f 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e  _Last : OP_Rewin
1a370 64 2c 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b  d, iCur, addrBrk
1a380 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1a390 20 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 45   pEnd ){.      E
1a3a0 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 70  xpr *pX;.      p
1a3b0 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b  X = pEnd->pExpr;
1a3c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1a3d0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  X!=0 );.      as
1a3e0 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74  sert( pEnd->left
1a3f0 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a  Cursor==iCur );.
1a400 20 20 20 20 20 20 6d 65 6d 45 6e 64 56 61 6c 75        memEndValu
1a410 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d  e = ++pParse->nM
1a420 65 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  em;.      sqlite
1a430 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
1a440 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 6d 65  , pX->pRight, me
1a450 6d 45 6e 64 56 61 6c 75 65 29 3b 0a 20 20 20 20  mEndValue);.    
1a460 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b    if( pX->op==TK
1a470 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54  _LT || pX->op==T
1a480 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
1a490 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20  testOp = bRev ? 
1a4a0 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20  OP_Le : OP_Ge;. 
1a4b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a4c0 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
1a4d0 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
1a4e0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
1a4f0 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
1a500 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20 20  vel, pEnd);.    
1a510 7d 0a 20 20 20 20 73 74 61 72 74 20 3d 20 73 71  }.    start = sq
1a520 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
1a530 41 64 64 72 28 76 29 3b 0a 20 20 20 20 70 4c 65  Addr(v);.    pLe
1a540 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f  vel->op = bRev ?
1a550 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65   OP_Prev : OP_Ne
1a560 78 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  xt;.    pLevel->
1a570 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70  p1 = iCur;.    p
1a580 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72  Level->p2 = star
1a590 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  t;.    pLevel->p
1a5a0 35 20 3d 20 28 70 53 74 61 72 74 3d 3d 30 20 26  5 = (pStart==0 &
1a5b0 26 20 70 45 6e 64 3d 3d 30 29 20 3f 31 3a 30 3b  & pEnd==0) ?1:0;
1a5c0 0a 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21  .    if( testOp!
1a5d0 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
1a5e0 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20 69 52    iRowidReg = iR
1a5f0 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71 6c 69  eleaseReg = sqli
1a600 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
1a610 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
1a620 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
1a630 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
1a640 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20  , iRowidReg);.  
1a650 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1a660 61 63 68 65 53 74 6f 72 65 28 70 50 61 72 73 65  acheStore(pParse
1a670 2c 20 69 43 75 72 2c 20 2d 31 2c 20 69 52 6f 77  , iCur, -1, iRow
1a680 69 64 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71  idReg);.      sq
1a690 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1a6a0 76 2c 20 74 65 73 74 4f 70 2c 20 6d 65 6d 45 6e  v, testOp, memEn
1a6b0 64 56 61 6c 75 65 2c 20 61 64 64 72 42 72 6b 2c  dValue, addrBrk,
1a6c0 20 69 52 6f 77 69 64 52 65 67 29 3b 0a 20 20 20   iRowidReg);.   
1a6d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
1a6e0 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
1a6f0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
1a700 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
1a710 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
1a720 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
1a730 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
1a740 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 7c  RE_COLUMN_RANGE|
1a750 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 29  WHERE_COLUMN_EQ)
1a760 20 29 7b 0a 20 20 20 20 2f 2a 20 43 61 73 65 20   ){.    /* Case 
1a770 33 3a 20 41 20 73 63 61 6e 20 75 73 69 6e 67 20  3: A scan using 
1a780 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  an index..    **
1a790 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a7a0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
1a7b0 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 7a 65 72   may contain zer
1a7c0 6f 20 6f 72 20 6d 6f 72 65 20 65 71 75 61 6c 69  o or more equali
1a7d0 74 79 20 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  ty .    **      
1a7e0 20 20 20 74 65 72 6d 73 20 28 22 3d 3d 22 20 6f     terms ("==" o
1a7f0 72 20 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73  r "IN" operators
1a800 29 20 74 68 61 74 20 72 65 66 65 72 20 74 6f 20  ) that refer to 
1a810 74 68 65 20 4e 0a 20 20 20 20 2a 2a 20 20 20 20  the N.    **    
1a820 20 20 20 20 20 6c 65 66 74 2d 6d 6f 73 74 20 63       left-most c
1a830 6f 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e  olumns of the in
1a840 64 65 78 2e 20 49 74 20 6d 61 79 20 61 6c 73 6f  dex. It may also
1a850 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a 20   contain.    ** 
1a860 20 20 20 20 20 20 20 20 69 6e 65 71 75 61 6c 69          inequali
1a870 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 28  ty constraints (
1a880 3e 2c 20 3c 2c 20 3e 3d 20 6f 72 20 3c 3d 29 20  >, <, >= or <=) 
1a890 6f 6e 20 74 68 65 20 69 6e 64 65 78 65 64 0a 20  on the indexed. 
1a8a0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f     **         co
1a8b0 6c 75 6d 6e 20 74 68 61 74 20 69 6d 6d 65 64 69  lumn that immedi
1a8c0 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 73 20 74 68  ately follows th
1a8d0 65 20 4e 20 65 71 75 61 6c 69 74 69 65 73 2e 20  e N equalities. 
1a8e0 4f 6e 6c 79 20 0a 20 20 20 20 2a 2a 20 20 20 20  Only .    **    
1a8f0 20 20 20 20 20 74 68 65 20 72 69 67 68 74 2d 6d       the right-m
1a900 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62  ost column can b
1a910 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
1a920 2d 20 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a  - the rest must.
1a930 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
1a940 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
1a950 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 20  "IN" operators. 
1a960 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1a970 74 68 65 20 0a 20 20 20 20 2a 2a 20 20 20 20 20  the .    **     
1a980 20 20 20 20 69 6e 64 65 78 20 69 73 20 6f 6e 20      index is on 
1a990 28 78 2c 79 2c 7a 29 2c 20 74 68 65 6e 20 74 68  (x,y,z), then th
1a9a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6c 61 75  e following clau
1a9b0 73 65 73 20 61 72 65 20 61 6c 6c 20 0a 20 20 20  ses are all .   
1a9c0 20 2a 2a 20 20 20 20 20 20 20 20 20 6f 70 74 69   **         opti
1a9d0 6d 69 7a 65 64 3a 0a 20 20 20 20 2a 2a 0a 20 20  mized:.    **.  
1a9e0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1a9f0 78 3d 35 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  x=5.    **      
1aa00 20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3d        x=5 AND y=
1aa10 31 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  10.    **       
1aa20 20 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3c 31       x=5 AND y<1
1aa30 30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  0.    **        
1aa40 20 20 20 20 78 3d 35 20 41 4e 44 20 79 3e 35 20      x=5 AND y>5 
1aa50 41 4e 44 20 79 3c 31 30 0a 20 20 20 20 2a 2a 20  AND y<10.    ** 
1aa60 20 20 20 20 20 20 20 20 20 20 20 78 3d 35 20 41             x=5 A
1aa70 4e 44 20 79 3d 35 20 41 4e 44 20 7a 3c 3d 31 30  ND y=5 AND z<=10
1aa80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1aa90 20 20 20 20 20 20 20 54 68 65 20 7a 3c 31 30 20         The z<10 
1aaa0 74 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 6c 6c  term of the foll
1aab0 6f 77 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20  owing cannot be 
1aac0 75 73 65 64 2c 20 6f 6e 6c 79 0a 20 20 20 20 2a  used, only.    *
1aad0 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 78 3d  *         the x=
1aae0 35 20 74 65 72 6d 3a 0a 20 20 20 20 2a 2a 0a 20  5 term:.    **. 
1aaf0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20     **           
1ab00 20 78 3d 35 20 41 4e 44 20 7a 3c 31 30 0a 20 20   x=5 AND z<10.  
1ab10 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ab20 20 20 20 20 4e 20 6d 61 79 20 62 65 20 7a 65 72      N may be zer
1ab30 6f 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  o if there are i
1ab40 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
1ab50 61 69 6e 74 73 2e 0a 20 20 20 20 2a 2a 20 20 20  aints..    **   
1ab60 20 20 20 20 20 20 49 66 20 74 68 65 72 65 20 61        If there a
1ab70 72 65 20 6e 6f 20 69 6e 65 71 75 61 6c 69 74 79  re no inequality
1ab80 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 74 68   constraints, th
1ab90 65 6e 20 4e 20 69 73 20 61 74 0a 20 20 20 20 2a  en N is at.    *
1aba0 2a 20 20 20 20 20 20 20 20 20 6c 65 61 73 74 20  *         least 
1abb0 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  one..    **.    
1abc0 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20  **         This 
1abd0 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65  case is also use
1abe0 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65  d when there are
1abf0 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65   no WHERE clause
1ac00 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1ac10 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74 20  constraints but 
1ac20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c 65  an index is sele
1ac30 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e 20  cted anyway, in 
1ac40 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 20 20 20  order.    **    
1ac50 20 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68       to force th
1ac60 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74  e output order t
1ac70 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20  o conform to an 
1ac80 4f 52 44 45 52 20 42 59 2e 0a 20 20 20 20 2a 2f  ORDER BY..    */
1ac90 20 20 0a 20 20 20 20 69 6e 74 20 61 53 74 61 72    .    int aStar
1aca0 74 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  tOp[] = {.      
1acb0 30 2c 0a 20 20 20 20 20 20 30 2c 0a 20 20 20 20  0,.      0,.    
1acc0 20 20 4f 50 5f 52 65 77 69 6e 64 2c 20 20 20 20    OP_Rewind,    
1acd0 20 20 20 20 20 20 20 2f 2a 20 32 3a 20 28 21 73         /* 2: (!s
1ace0 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73  tart_constraints
1acf0 20 26 26 20 73 74 61 72 74 45 71 20 26 26 20 20   && startEq &&  
1ad00 21 62 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20  !bRev) */.      
1ad10 4f 50 5f 4c 61 73 74 2c 20 20 20 20 20 20 20 20  OP_Last,        
1ad20 20 20 20 20 20 2f 2a 20 33 3a 20 28 21 73 74 61       /* 3: (!sta
1ad30 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 26  rt_constraints &
1ad40 26 20 73 74 61 72 74 45 71 20 26 26 20 20 20 62  & startEq &&   b
1ad50 52 65 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50  Rev) */.      OP
1ad60 5f 53 65 65 6b 47 74 2c 20 20 20 20 20 20 20 20  _SeekGt,        
1ad70 20 20 20 2f 2a 20 34 3a 20 28 73 74 61 72 74 5f     /* 4: (start_
1ad80 63 6f 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20  constraints  && 
1ad90 21 73 74 61 72 74 45 71 20 26 26 20 21 62 52 65  !startEq && !bRe
1ada0 76 29 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53  v) */.      OP_S
1adb0 65 65 6b 4c 74 2c 20 20 20 20 20 20 20 20 20 20  eekLt,          
1adc0 20 2f 2a 20 35 3a 20 28 73 74 61 72 74 5f 63 6f   /* 5: (start_co
1add0 6e 73 74 72 61 69 6e 74 73 20 20 26 26 20 21 73  nstraints  && !s
1ade0 74 61 72 74 45 71 20 26 26 20 20 62 52 65 76 29  tartEq &&  bRev)
1adf0 20 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65   */.      OP_See
1ae00 6b 47 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  kGe,           /
1ae10 2a 20 36 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73  * 6: (start_cons
1ae20 74 72 61 69 6e 74 73 20 20 26 26 20 20 73 74 61  traints  &&  sta
1ae30 72 74 45 71 20 26 26 20 21 62 52 65 76 29 20 2a  rtEq && !bRev) *
1ae40 2f 0a 20 20 20 20 20 20 4f 50 5f 53 65 65 6b 4c  /.      OP_SeekL
1ae50 65 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e            /* 
1ae60 37 3a 20 28 73 74 61 72 74 5f 63 6f 6e 73 74 72  7: (start_constr
1ae70 61 69 6e 74 73 20 20 26 26 20 20 73 74 61 72 74  aints  &&  start
1ae80 45 71 20 26 26 20 20 62 52 65 76 29 20 2a 2f 0a  Eq &&  bRev) */.
1ae90 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 61      };.    int a
1aea0 45 6e 64 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  EndOp[] = {.    
1aeb0 20 20 4f 50 5f 4e 6f 6f 70 2c 20 20 20 20 20 20    OP_Noop,      
1aec0 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 28 21 65         /* 0: (!e
1aed0 6e 64 5f 63 6f 6e 73 74 72 61 69 6e 74 73 29 20  nd_constraints) 
1aee0 2a 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 47  */.      OP_IdxG
1aef0 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  E,            /*
1af00 20 31 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61   1: (end_constra
1af10 69 6e 74 73 20 26 26 20 21 62 52 65 76 29 20 2a  ints && !bRev) *
1af20 2f 0a 20 20 20 20 20 20 4f 50 5f 49 64 78 4c 54  /.      OP_IdxLT
1af30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af40 32 3a 20 28 65 6e 64 5f 63 6f 6e 73 74 72 61 69  2: (end_constrai
1af50 6e 74 73 20 26 26 20 62 52 65 76 29 20 2a 2f 0a  nts && bRev) */.
1af60 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6e      };.    int n
1af70 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61  Eq = pLevel->pla
1af80 6e 2e 6e 45 71 3b 0a 20 20 20 20 69 6e 74 20 69  n.nEq;.    int i
1af90 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b 20 20  sMinQuery = 0;  
1afa0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1afb0 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
1afc0 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
1afd0 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65  .. */.    int re
1afe0 67 42 61 73 65 3b 20 20 20 20 20 20 20 20 20 20  gBase;          
1aff0 20 20 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72         /* Base r
1b000 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
1b010 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75 65  constraint value
1b020 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 31 3b  s */.    int r1;
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 72 65        /* Temp re
1b050 67 69 73 74 65 72 20 2a 2f 0a 20 20 20 20 57 68  gister */.    Wh
1b060 65 72 65 54 65 72 6d 20 2a 70 52 61 6e 67 65 53  ereTerm *pRangeS
1b070 74 61 72 74 20 3d 20 30 3b 20 20 2f 2a 20 49 6e  tart = 0;  /* In
1b080 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b090 69 6e 74 20 61 74 20 72 61 6e 67 65 20 73 74 61  int at range sta
1b0a0 72 74 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 54  rt */.    WhereT
1b0b0 65 72 6d 20 2a 70 52 61 6e 67 65 45 6e 64 20 3d  erm *pRangeEnd =
1b0c0 20 30 3b 20 20 20 20 2f 2a 20 49 6e 65 71 75 61   0;    /* Inequa
1b0d0 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  lity constraint 
1b0e0 61 74 20 72 61 6e 67 65 20 65 6e 64 20 2a 2f 0a  at range end */.
1b0f0 20 20 20 20 69 6e 74 20 73 74 61 72 74 45 71 3b      int startEq;
1b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b110 20 2f 2a 20 54 72 75 65 20 69 66 20 72 61 6e 67   /* True if rang
1b120 65 20 73 74 61 72 74 20 75 73 65 73 20 3d 3d 2c  e start uses ==,
1b130 20 3e 3d 20 6f 72 20 3c 3d 20 2a 2f 0a 20 20 20   >= or <= */.   
1b140 20 69 6e 74 20 65 6e 64 45 71 3b 20 20 20 20 20   int endEq;     
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b160 20 54 72 75 65 20 69 66 20 72 61 6e 67 65 20 65   True if range e
1b170 6e 64 20 75 73 65 73 20 3d 3d 2c 20 3e 3d 20 6f  nd uses ==, >= o
1b180 72 20 3c 3d 20 2a 2f 0a 20 20 20 20 69 6e 74 20  r <= */.    int 
1b190 73 74 61 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74  start_constraint
1b1a0 73 3b 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72  s;       /* Star
1b1b0 74 20 6f 66 20 72 61 6e 67 65 20 69 73 20 63 6f  t of range is co
1b1c0 6e 73 74 72 61 69 6e 65 64 20 2a 2f 0a 20 20 20  nstrained */.   
1b1d0 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
1b1e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1b1f0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1b200 72 61 69 6e 74 20 74 65 72 6d 73 20 2a 2f 0a 20  raint terms */. 
1b210 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
1b220 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69          /* The i
1b230 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
1b240 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
1b250 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
1b260 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75    /* The VDBE cu
1b270 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64  rsor for the ind
1b280 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45  ex */.    int nE
1b290 78 74 72 61 52 65 67 20 3d 20 30 3b 20 20 20 2f  xtraReg = 0;   /
1b2a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
1b2b0 61 20 72 65 67 69 73 74 65 72 73 20 6e 65 65 64  a registers need
1b2c0 65 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 70  ed */.    int op
1b2d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1b2e0 2a 20 49 6e 73 74 72 75 63 74 69 6f 6e 20 6f 70  * Instruction op
1b2f0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 63 68 61 72  code */.    char
1b300 20 2a 7a 41 66 66 3b 0a 0a 20 20 20 20 70 49 64   *zAff;..    pId
1b310 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
1b320 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  .u.pIdx;.    iId
1b330 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
1b340 49 64 78 43 75 72 3b 0a 20 20 20 20 6b 20 3d 20  IdxCur;.    k = 
1b350 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e  pIdx->aiColumn[n
1b360 45 71 5d 3b 20 20 20 20 20 2f 2a 20 43 6f 6c 75  Eq];     /* Colu
1b370 6d 6e 20 66 6f 72 20 69 6e 65 71 75 61 6c 69 74  mn for inequalit
1b380 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  y constraints */
1b390 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
1b3a0 20 6c 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20   loop satisfies 
1b3b0 61 20 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f  a sort order (pO
1b3c0 72 64 65 72 42 79 29 20 72 65 71 75 65 73 74 20  rderBy) request 
1b3d0 74 68 61 74 20 0a 20 20 20 20 2a 2a 20 77 61 73  that .    ** was
1b3e0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1b3f0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
1b400 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
1b410 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
1b420 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65 6e 20   ** query, then 
1b430 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  the caller will 
1b440 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65 20 6c  only allow the l
1b450 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72 0a 20  oop to run for. 
1b460 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 69     ** a single i
1b470 74 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 6d  teration. This m
1b480 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 69  eans that the fi
1b490 72 73 74 20 72 6f 77 20 72 65 74 75 72 6e 65 64  rst row returned
1b4a0 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64 20 6e  .    ** should n
1b4b0 6f 74 20 68 61 76 65 20 61 20 4e 55 4c 4c 20 76  ot have a NULL v
1b4c0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 27  alue stored in '
1b4d0 78 27 2e 20 49 66 20 63 6f 6c 75 6d 6e 20 27 78  x'. If column 'x
1b4e0 27 20 69 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ' is.    ** the 
1b4f0 66 69 72 73 74 20 6f 6e 65 20 61 66 74 65 72 20  first one after 
1b500 74 68 65 20 6e 45 71 20 65 71 75 61 6c 69 74 79  the nEq equality
1b510 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 69 6e 20   constraints in 
1b520 74 68 65 20 69 6e 64 65 78 2c 0a 20 20 20 20 2a  the index,.    *
1b530 2a 20 74 68 69 73 20 72 65 71 75 69 72 65 73 20  * this requires 
1b540 73 6f 6d 65 20 73 70 65 63 69 61 6c 20 68 61 6e  some special han
1b550 64 6c 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20  dling..    */.  
1b560 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61 67    if( (wctrlFlag
1b570 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59 5f  s&WHERE_ORDERBY_
1b580 4d 49 4e 29 21 3d 30 0a 20 20 20 20 20 26 26 20  MIN)!=0.     && 
1b590 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73  (pLevel->plan.ws
1b5a0 46 6c 61 67 73 26 57 48 45 52 45 5f 4f 52 44 45  Flags&WHERE_ORDE
1b5b0 52 42 59 29 0a 20 20 20 20 20 26 26 20 28 70 49  RBY).     && (pI
1b5c0 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29  dx->nColumn>nEq)
1b5d0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
1b5e0 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42   assert( pOrderB
1b5f0 79 2d 3e 6e 45 78 70 72 3d 3d 31 20 29 3b 20 2a  y->nExpr==1 ); *
1b600 2f 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  /.      /* asser
1b610 74 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 30  t( pOrderBy->a[0
1b620 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
1b630 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  ==pIdx->aiColumn
1b640 5b 6e 45 71 5d 20 29 3b 20 2a 2f 0a 20 20 20 20  [nEq] ); */.    
1b650 20 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31    isMinQuery = 1
1b660 3b 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65  ;.      nExtraRe
1b670 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  g = 1;.    }..  
1b680 20 20 2f 2a 20 46 69 6e 64 20 61 6e 79 20 69 6e    /* Find any in
1b690 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
1b6a0 69 6e 74 20 74 65 72 6d 73 20 66 6f 72 20 74 68  int terms for th
1b6b0 65 20 73 74 61 72 74 20 61 6e 64 20 65 6e 64 20  e start and end 
1b6c0 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 72  .    ** of the r
1b6d0 61 6e 67 65 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  ange. .    */.  
1b6e0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1b6f0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1b700 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 7b 0a  RE_TOP_LIMIT ){.
1b710 20 20 20 20 20 20 70 52 61 6e 67 65 45 6e 64 20        pRangeEnd 
1b720 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
1b730 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
1b740 79 2c 20 28 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 29  y, (WO_LT|WO_LE)
1b750 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 6e  , pIdx);.      n
1b760 45 78 74 72 61 52 65 67 20 3d 20 31 3b 0a 20 20  ExtraReg = 1;.  
1b770 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
1b780 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73  el->plan.wsFlags
1b790 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d   & WHERE_BTM_LIM
1b7a0 49 54 20 29 7b 0a 20 20 20 20 20 20 70 52 61 6e  IT ){.      pRan
1b7b0 67 65 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65  geStart = findTe
1b7c0 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c  rm(pWC, iCur, k,
1b7d0 20 6e 6f 74 52 65 61 64 79 2c 20 28 57 4f 5f 47   notReady, (WO_G
1b7e0 54 7c 57 4f 5f 47 45 29 2c 20 70 49 64 78 29 3b  T|WO_GE), pIdx);
1b7f0 0a 20 20 20 20 20 20 6e 45 78 74 72 61 52 65 67  .      nExtraReg
1b800 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
1b810 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1b820 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6c  e to evaluate al
1b830 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74 65 72  l constraint ter
1b840 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49  ms using == or I
1b850 4e 0a 20 20 20 20 2a 2a 20 61 6e 64 20 73 74 6f  N.    ** and sto
1b860 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66  re the values of
1b870 20 74 68 6f 73 65 20 74 65 72 6d 73 20 69 6e 20   those terms in 
1b880 61 6e 20 61 72 72 61 79 20 6f 66 20 72 65 67 69  an array of regi
1b890 73 74 65 72 73 0a 20 20 20 20 2a 2a 20 73 74 61  sters.    ** sta
1b8a0 72 74 69 6e 67 20 61 74 20 72 65 67 42 61 73 65  rting at regBase
1b8b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 67  ..    */.    reg
1b8c0 42 61 73 65 20 3d 20 63 6f 64 65 41 6c 6c 45 71  Base = codeAllEq
1b8d0 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20 20  ualityTerms(.   
1b8e0 20 20 20 20 20 70 50 61 72 73 65 2c 20 70 4c 65       pParse, pLe
1b8f0 76 65 6c 2c 20 70 57 43 2c 20 6e 6f 74 52 65 61  vel, pWC, notRea
1b900 64 79 2c 20 6e 45 78 74 72 61 52 65 67 2c 20 26  dy, nExtraReg, &
1b910 7a 41 66 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  zAff.    );.    
1b920 61 64 64 72 4e 78 74 20 3d 20 70 4c 65 76 65 6c  addrNxt = pLevel
1b930 2d 3e 61 64 64 72 4e 78 74 3b 0a 0a 20 20 20 20  ->addrNxt;..    
1b940 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1b950 6e 67 20 61 20 72 65 76 65 72 73 65 20 6f 72 64  ng a reverse ord
1b960 65 72 20 73 63 61 6e 20 6f 6e 20 61 6e 20 61 73  er scan on an as
1b970 63 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 6f  cending index, o
1b980 72 0a 20 20 20 20 2a 2a 20 61 20 66 6f 72 77 61  r.    ** a forwa
1b990 72 64 20 6f 72 64 65 72 20 73 63 61 6e 20 6f 6e  rd order scan on
1b9a0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e   a descending in
1b9b0 64 65 78 2c 20 69 6e 74 65 72 63 68 61 6e 67 65  dex, interchange
1b9c0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 73 74 61   the .    ** sta
1b9d0 72 74 20 61 6e 64 20 65 6e 64 20 74 65 72 6d 73  rt and end terms
1b9e0 20 28 70 52 61 6e 67 65 53 74 61 72 74 20 61 6e   (pRangeStart an
1b9f0 64 20 70 52 61 6e 67 65 45 6e 64 29 2e 0a 20 20  d pRangeEnd)..  
1ba00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 52 65    */.    if( bRe
1ba10 76 3d 3d 28 70 49 64 78 2d 3e 61 53 6f 72 74 4f  v==(pIdx->aSortO
1ba20 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49 54  rder[nEq]==SQLIT
1ba30 45 5f 53 4f 5f 41 53 43 29 20 29 7b 0a 20 20 20  E_SO_ASC) ){.   
1ba40 20 20 20 53 57 41 50 28 57 68 65 72 65 54 65 72     SWAP(WhereTer
1ba50 6d 20 2a 2c 20 70 52 61 6e 67 65 45 6e 64 2c 20  m *, pRangeEnd, 
1ba60 70 52 61 6e 67 65 53 74 61 72 74 29 3b 0a 20 20  pRangeStart);.  
1ba70 20 20 7d 0a 0a 20 20 20 20 74 65 73 74 63 61 73    }..    testcas
1ba80 65 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26  e( pRangeStart &
1ba90 26 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65  & pRangeStart->e
1baa0 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 4c 45  Operator & WO_LE
1bab0 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1bac0 28 20 70 52 61 6e 67 65 53 74 61 72 74 20 26 26  ( pRangeStart &&
1bad0 20 70 52 61 6e 67 65 53 74 61 72 74 2d 3e 65 4f   pRangeStart->eO
1bae0 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 47 45 20  perator & WO_GE 
1baf0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
1bb00 20 70 52 61 6e 67 65 45 6e 64 20 26 26 20 70 52   pRangeEnd && pR
1bb10 61 6e 67 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74  angeEnd->eOperat
1bb20 6f 72 20 26 20 57 4f 5f 4c 45 20 29 3b 0a 20 20  or & WO_LE );.  
1bb30 20 20 74 65 73 74 63 61 73 65 28 20 70 52 61 6e    testcase( pRan
1bb40 67 65 45 6e 64 20 26 26 20 70 52 61 6e 67 65 45  geEnd && pRangeE
1bb50 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  nd->eOperator & 
1bb60 57 4f 5f 47 45 20 29 3b 0a 20 20 20 20 73 74 61  WO_GE );.    sta
1bb70 72 74 45 71 20 3d 20 21 70 52 61 6e 67 65 53 74  rtEq = !pRangeSt
1bb80 61 72 74 20 7c 7c 20 70 52 61 6e 67 65 53 74 61  art || pRangeSta
1bb90 72 74 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rt->eOperator & 
1bba0 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
1bbb0 20 20 20 65 6e 64 45 71 20 3d 20 20 20 21 70 52     endEq =   !pR
1bbc0 61 6e 67 65 45 6e 64 20 7c 7c 20 70 52 61 6e 67  angeEnd || pRang
1bbd0 65 45 6e 64 2d 3e 65 4f 70 65 72 61 74 6f 72 20  eEnd->eOperator 
1bbe0 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b  & (WO_LE|WO_GE);
1bbf0 0a 20 20 20 20 73 74 61 72 74 5f 63 6f 6e 73 74  .    start_const
1bc00 72 61 69 6e 74 73 20 3d 20 70 52 61 6e 67 65 53  raints = pRangeS
1bc10 74 61 72 74 20 7c 7c 20 6e 45 71 3e 30 3b 0a 0a  tart || nEq>0;..
1bc20 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65 20      /* Seek the 
1bc30 69 6e 64 65 78 20 63 75 72 73 6f 72 20 74 6f 20  index cursor to 
1bc40 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
1bc50 20 72 61 6e 67 65 2e 20 2a 2f 0a 20 20 20 20 6e   range. */.    n
1bc60 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 45 71  Constraint = nEq
1bc70 3b 0a 20 20 20 20 69 66 28 20 70 52 61 6e 67 65  ;.    if( pRange
1bc80 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 45  Start ){.      E
1bc90 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 52  xpr *pRight = pR
1bca0 61 6e 67 65 53 74 61 72 74 2d 3e 70 45 78 70 72  angeStart->pExpr
1bcb0 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
1bcc0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1bcd0 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 2c 20  pParse, pRight, 
1bce0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
1bcf0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1bd00 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1bd10 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 2c  ll, regBase+nEq,
1bd20 20 61 64 64 72 4e 78 74 29 3b 0a 20 20 20 20 20   addrNxt);.     
1bd30 20 69 66 28 20 7a 41 66 66 20 0a 20 20 20 20 20   if( zAff .     
1bd40 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6d 70    && sqlite3Comp
1bd50 61 72 65 41 66 66 69 6e 69 74 79 28 70 52 69 67  areAffinity(pRig
1bd60 68 74 2c 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72  ht, zAff[nConstr
1bd70 61 69 6e 74 5d 29 3d 3d 53 51 4c 49 54 45 5f 41  aint])==SQLITE_A
1bd80 46 46 5f 4e 4f 4e 45 0a 20 20 20 20 20 20 29 7b  FF_NONE.      ){
1bd90 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63  .        /* Sinc
1bda0 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
1bdb0 20 69 73 20 74 6f 20 62 65 20 70 65 72 66 6f 72   is to be perfor
1bdc0 6d 65 64 20 77 69 74 68 20 6e 6f 20 63 6f 6e 76  med with no conv
1bdd0 65 72 73 69 6f 6e 73 20 61 70 70 6c 69 65 64 0a  ersions applied.
1bde0 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68          ** to th
1bdf0 65 20 6f 70 65 72 61 6e 64 73 2c 20 73 65 74 20  e operands, set 
1be00 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
1be10 61 70 70 6c 79 20 74 6f 20 70 52 69 67 68 74 20  apply to pRight 
1be20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  to .        ** S
1be30 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 2e 20  QLITE_AFF_NONE. 
1be40 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a 41 66 66   */.        zAff
1be50 5b 6e 43 6f 6e 73 74 72 61 69 6e 74 5d 20 3d 20  [nConstraint] = 
1be60 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1be70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
1be80 43 6f 6e 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20  Constraint++;.  
1be90 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4d 69    }else if( isMi
1bea0 6e 51 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20  nQuery ){.      
1beb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1bec0 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  2(v, OP_Null, 0,
1bed0 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20   regBase+nEq);. 
1bee0 20 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e 74       nConstraint
1bef0 2b 2b 3b 0a 20 20 20 20 20 20 73 74 61 72 74 45  ++;.      startE
1bf00 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 61  q = 0;.      sta
1bf10 72 74 5f 63 6f 6e 73 74 72 61 69 6e 74 73 20 3d  rt_constraints =
1bf20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f   1;.    }.    co
1bf30 64 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  deApplyAffinity(
1bf40 70 50 61 72 73 65 2c 20 72 65 67 42 61 73 65 2c  pParse, regBase,
1bf50 20 6e 43 6f 6e 73 74 72 61 69 6e 74 2c 20 7a 41   nConstraint, zA
1bf60 66 66 29 3b 0a 20 20 20 20 6f 70 20 3d 20 61 53  ff);.    op = aS
1bf70 74 61 72 74 4f 70 5b 28 73 74 61 72 74 5f 63 6f  tartOp[(start_co
1bf80 6e 73 74 72 61 69 6e 74 73 3c 3c 32 29 20 2b 20  nstraints<<2) + 
1bf90 28 73 74 61 72 74 45 71 3c 3c 31 29 20 2b 20 62  (startEq<<1) + b
1bfa0 52 65 76 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  Rev];.    assert
1bfb0 28 20 6f 70 21 3d 30 20 29 3b 0a 20 20 20 20 74  ( op!=0 );.    t
1bfc0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f  estcase( op==OP_
1bfd0 52 65 77 69 6e 64 20 29 3b 0a 20 20 20 20 74 65  Rewind );.    te
1bfe0 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 4c  stcase( op==OP_L
1bff0 61 73 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ast );.    testc
1c000 61 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b  ase( op==OP_Seek
1c010 47 74 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  Gt );.    testca
1c020 73 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 47  se( op==OP_SeekG
1c030 65 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  e );.    testcas
1c040 65 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 65  e( op==OP_SeekLe
1c050 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
1c060 28 20 6f 70 3d 3d 4f 50 5f 53 65 65 6b 4c 74 20  ( op==OP_SeekLt 
1c070 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1c080 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c 20  beAddOp4(v, op, 
1c090 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78 74  iIdxCur, addrNxt
1c0a0 2c 20 72 65 67 42 61 73 65 2c 20 0a 20 20 20 20  , regBase, .    
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f    SQLITE_INT_TO_
1c0d0 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e 74 29  PTR(nConstraint)
1c0e0 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 0a 20 20  , P4_INT32);..  
1c0f0 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 76 61    /* Load the va
1c100 6c 75 65 20 66 6f 72 20 74 68 65 20 69 6e 65 71  lue for the ineq
1c110 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
1c120 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  t at the end of 
1c130 74 68 65 0a 20 20 20 20 2a 2a 20 72 61 6e 67 65  the.    ** range
1c140 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 2a   (if any)..    *
1c150 2f 0a 20 20 20 20 6e 43 6f 6e 73 74 72 61 69 6e  /.    nConstrain
1c160 74 20 3d 20 6e 45 71 3b 0a 20 20 20 20 69 66 28  t = nEq;.    if(
1c170 20 70 52 61 6e 67 65 45 6e 64 20 29 7b 0a 20 20   pRangeEnd ){.  
1c180 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
1c190 20 3d 20 70 52 61 6e 67 65 45 6e 64 2d 3e 70 45   = pRangeEnd->pE
1c1a0 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
1c1b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1c1c0 63 68 65 52 65 6d 6f 76 65 28 70 50 61 72 73 65  cheRemove(pParse
1c1d0 2c 20 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a  , regBase+nEq);.
1c1e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c1f0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
1c200 69 67 68 74 2c 20 72 65 67 42 61 73 65 2b 6e 45  ight, regBase+nE
1c210 71 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  q);.      sqlite
1c220 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
1c230 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 42 61 73  P_IsNull, regBas
1c240 65 2b 6e 45 71 2c 20 61 64 64 72 4e 78 74 29 3b  e+nEq, addrNxt);
1c250 0a 20 20 20 20 20 20 7a 41 66 66 20 3d 20 73 71  .      zAff = sq
1c260 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 50  lite3DbStrDup(pP
1c270 61 72 73 65 2d 3e 64 62 2c 20 7a 41 66 66 29 3b  arse->db, zAff);
1c280 0a 20 20 20 20 20 20 69 66 28 20 7a 41 66 66 20  .      if( zAff 
1c290 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  .       && sqlit
1c2a0 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
1c2b0 79 28 70 52 69 67 68 74 2c 20 7a 41 66 66 5b 6e  y(pRight, zAff[n
1c2c0 43 6f 6e 73 74 72 61 69 6e 74 5d 29 3d 3d 53 51  Constraint])==SQ
1c2d0 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 0a 20 20  LITE_AFF_NONE.  
1c2e0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
1c2f0 2a 20 53 69 6e 63 65 20 74 68 65 20 63 6f 6d 70  * Since the comp
1c300 61 72 69 73 6f 6e 20 69 73 20 74 6f 20 62 65 20  arison is to be 
1c310 70 65 72 66 6f 72 6d 65 64 20 77 69 74 68 20 6e  performed with n
1c320 6f 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61 70  o conversions ap
1c330 70 6c 69 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  plied.        **
1c340 20 74 6f 20 74 68 65 20 6f 70 65 72 61 6e 64 73   to the operands
1c350 2c 20 73 65 74 20 74 68 65 20 61 66 66 69 6e 69  , set the affini
1c360 74 79 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 70  ty to apply to p
1c370 52 69 67 68 74 20 74 6f 20 0a 20 20 20 20 20 20  Right to .      
1c380 20 20 2a 2a 20 53 51 4c 49 54 45 5f 41 46 46 5f    ** SQLITE_AFF_
1c390 4e 4f 4e 45 2e 20 20 2a 2f 0a 20 20 20 20 20 20  NONE.  */.      
1c3a0 20 20 7a 41 66 66 5b 6e 43 6f 6e 73 74 72 61 69    zAff[nConstrai
1c3b0 6e 74 5d 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  nt] = SQLITE_AFF
1c3c0 5f 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20  _NONE;.      }. 
1c3d0 20 20 20 20 20 63 6f 64 65 41 70 70 6c 79 41 66       codeApplyAf
1c3e0 66 69 6e 69 74 79 28 70 50 61 72 73 65 2c 20 72  finity(pParse, r
1c3f0 65 67 42 61 73 65 2c 20 6e 45 71 2b 31 2c 20 7a  egBase, nEq+1, z
1c400 41 66 66 29 3b 0a 20 20 20 20 20 20 6e 43 6f 6e  Aff);.      nCon
1c410 73 74 72 61 69 6e 74 2b 2b 3b 0a 20 20 20 20 7d  straint++;.    }
1c420 0a 0a 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20  ..    /* Top of 
1c430 74 68 65 20 6c 6f 6f 70 20 62 6f 64 79 20 2a 2f  the loop body */
1c440 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20  .    pLevel->p2 
1c450 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
1c460 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20  rentAddr(v);..  
1c470 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
1c480 65 20 69 6e 64 65 78 20 63 75 72 73 6f 72 20 69  e index cursor i
1c490 73 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  s past the end o
1c4a0 66 20 74 68 65 20 72 61 6e 67 65 2e 20 2a 2f 0a  f the range. */.
1c4b0 20 20 20 20 6f 70 20 3d 20 61 45 6e 64 4f 70 5b      op = aEndOp[
1c4c0 28 70 52 61 6e 67 65 45 6e 64 20 7c 7c 20 6e 45  (pRangeEnd || nE
1c4d0 71 29 20 2a 20 28 31 20 2b 20 62 52 65 76 29 5d  q) * (1 + bRev)]
1c4e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1c4f0 6f 70 3d 3d 4f 50 5f 4e 6f 6f 70 20 29 3b 0a 20  op==OP_Noop );. 
1c500 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d     testcase( op=
1c510 3d 4f 50 5f 49 64 78 47 45 20 29 3b 0a 20 20 20  =OP_IdxGE );.   
1c520 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 4f   testcase( op==O
1c530 50 5f 49 64 78 4c 54 20 29 3b 0a 20 20 20 20 69  P_IdxLT );.    i
1c540 66 28 20 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  f( op!=OP_Noop )
1c550 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
1c560 64 62 65 41 64 64 4f 70 34 28 76 2c 20 6f 70 2c  dbeAddOp4(v, op,
1c570 20 69 49 64 78 43 75 72 2c 20 61 64 64 72 4e 78   iIdxCur, addrNx
1c580 74 2c 20 72 65 67 42 61 73 65 2c 0a 20 20 20 20  t, regBase,.    
1c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5a0 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54      SQLITE_INT_T
1c5b0 4f 5f 50 54 52 28 6e 43 6f 6e 73 74 72 61 69 6e  O_PTR(nConstrain
1c5c0 74 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  t), P4_INT32);. 
1c5d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1c5e0 43 68 61 6e 67 65 50 35 28 76 2c 20 65 6e 64 45  ChangeP5(v, endE
1c5f0 71 21 3d 62 52 65 76 20 3f 31 3a 30 29 3b 0a 20  q!=bRev ?1:0);. 
1c600 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
1c610 74 68 65 72 65 20 61 72 65 20 69 6e 65 71 75 61  there are inequa
1c620 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
1c630 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
1c640 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66   value.    ** of
1c650 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d   the table colum
1c660 6e 20 74 68 61 74 20 74 68 65 20 69 6e 65 71 75  n that the inequ
1c670 61 6c 69 74 79 20 63 6f 6e 74 72 61 69 6e 73 20  ality contrains 
1c680 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20  is not NULL..   
1c690 20 2a 2a 20 49 66 20 69 74 20 69 73 2c 20 6a 75   ** If it is, ju
1c6a0 6d 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  mp to the next i
1c6b0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
1c6c0 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  loop..    */.   
1c6d0 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
1c6e0 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
1c6f0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
1c700 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c  Level->plan.wsFl
1c710 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f  ags & WHERE_BTM_
1c720 4c 49 4d 49 54 20 29 3b 0a 20 20 20 20 74 65 73  LIMIT );.    tes
1c730 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d 3e 70  tcase( pLevel->p
1c740 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
1c750 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 29 3b  ERE_TOP_LIMIT );
1c760 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
1c770 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
1c780 28 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54  (WHERE_BTM_LIMIT
1c790 7c 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54  |WHERE_TOP_LIMIT
1c7a0 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
1c7b0 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
1c7c0 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43  OP_Column, iIdxC
1c7d0 75 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20  ur, nEq, r1);.  
1c7e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1c7f0 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp2(v, OP_IsNu
1c800 6c 6c 2c 20 72 31 2c 20 61 64 64 72 43 6f 6e 74  ll, r1, addrCont
1c810 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
1c820 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
1c830 65 67 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a  eg(pParse, r1);.
1c840 0a 20 20 20 20 2f 2a 20 53 65 65 6b 20 74 68 65  .    /* Seek the
1c850 20 74 61 62 6c 65 20 63 75 72 73 6f 72 2c 20 69   table cursor, i
1c860 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
1c870 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
1c880 65 76 65 6c 2c 20 70 52 61 6e 67 65 53 74 61 72  evel, pRangeStar
1c890 74 29 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54  t);.    disableT
1c8a0 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 52 61 6e  erm(pLevel, pRan
1c8b0 67 65 45 6e 64 29 3b 0a 20 20 20 20 69 66 28 20  geEnd);.    if( 
1c8c0 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
1c8d0 20 20 20 20 69 52 6f 77 69 64 52 65 67 20 3d 20      iRowidReg = 
1c8e0 69 52 65 6c 65 61 73 65 52 65 67 20 3d 20 73 71  iReleaseReg = sq
1c8f0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
1c900 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73  pParse);.      s
1c910 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1c920 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c  (v, OP_IdxRowid,
1c930 20 69 49 64 78 43 75 72 2c 20 69 52 6f 77 69 64   iIdxCur, iRowid
1c940 52 65 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Reg);.      sqli
1c950 74 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72  te3ExprCacheStor
1c960 65 28 70 50 61 72 73 65 2c 20 69 43 75 72 2c 20  e(pParse, iCur, 
1c970 2d 31 2c 20 69 52 6f 77 69 64 52 65 67 29 3b 0a  -1, iRowidReg);.
1c980 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1c990 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 53 65  eAddOp2(v, OP_Se
1c9a0 65 6b 2c 20 69 43 75 72 2c 20 69 52 6f 77 69 64  ek, iCur, iRowid
1c9b0 52 65 67 29 3b 20 20 2f 2a 20 44 65 66 65 72 72  Reg);  /* Deferr
1c9c0 65 64 20 73 65 65 6b 20 2a 2f 0a 20 20 20 20 7d  ed seek */.    }
1c9d0 0a 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20  ..    /* Record 
1c9e0 74 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  the instruction 
1c9f0 75 73 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74  used to terminat
1ca00 65 20 74 68 65 20 6c 6f 6f 70 2e 20 44 69 73 61  e the loop. Disa
1ca10 62 6c 65 20 0a 20 20 20 20 2a 2a 20 57 48 45 52  ble .    ** WHER
1ca20 45 20 63 6c 61 75 73 65 20 74 65 72 6d 73 20 6d  E clause terms m
1ca30 61 64 65 20 72 65 64 75 6e 64 61 6e 74 20 62 79  ade redundant by
1ca40 20 74 68 65 20 69 6e 64 65 78 20 72 61 6e 67 65   the index range
1ca50 20 73 63 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   scan..    */.  
1ca60 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62    pLevel->op = b
1ca70 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20  Rev ? OP_Prev : 
1ca80 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
1ca90 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
1caa0 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e  r;.  }else..#ifn
1cab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1cac0 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  OR_OPTIMIZATION.
1cad0 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c    if( pLevel->pl
1cae0 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
1caf0 52 45 5f 4d 55 4c 54 49 5f 4f 52 20 29 7b 0a 20  RE_MULTI_OR ){. 
1cb00 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
1cb10 77 6f 20 6f 72 20 6d 6f 72 65 20 73 65 70 61 72  wo or more separ
1cb20 61 74 65 6c 79 20 69 6e 64 65 78 65 64 20 74 65  ately indexed te
1cb30 72 6d 73 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  rms connected by
1cb40 20 4f 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   OR.    **.    *
1cb50 2a 20 45 78 61 6d 70 6c 65 3a 0a 20 20 20 20 2a  * Example:.    *
1cb60 2a 0a 20 20 20 20 2a 2a 20 20 20 43 52 45 41 54  *.    **   CREAT
1cb70 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 2c 63  E TABLE t1(a,b,c
1cb80 2c 64 29 3b 0a 20 20 20 20 2a 2a 20 20 20 43 52  ,d);.    **   CR
1cb90 45 41 54 45 20 49 4e 44 45 58 20 69 31 20 4f 4e  EATE INDEX i1 ON
1cba0 20 74 31 28 61 29 3b 0a 20 20 20 20 2a 2a 20 20   t1(a);.    **  
1cbb0 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 69 32   CREATE INDEX i2
1cbc0 20 4f 4e 20 74 31 28 62 29 3b 0a 20 20 20 20 2a   ON t1(b);.    *
1cbd0 2a 20 20 20 43 52 45 41 54 45 20 49 4e 44 45 58  *   CREATE INDEX
1cbe0 20 69 33 20 4f 4e 20 74 31 28 63 29 3b 0a 20 20   i3 ON t1(c);.  
1cbf0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 53 45    **.    **   SE
1cc00 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57  LECT * FROM t1 W
1cc10 48 45 52 45 20 61 3d 35 20 4f 52 20 62 3d 37 20  HERE a=5 OR b=7 
1cc20 4f 52 20 28 63 3d 31 31 20 41 4e 44 20 64 3d 31  OR (c=11 AND d=1
1cc30 33 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  3).    **.    **
1cc40 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 2c   In the example,
1cc50 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65 65   there are three
1cc60 20 69 6e 64 65 78 65 64 20 74 65 72 6d 73 20 63   indexed terms c
1cc70 6f 6e 6e 65 63 74 65 64 20 62 79 20 4f 52 2e 0a  onnected by OR..
1cc80 20 20 20 20 2a 2a 20 54 68 65 20 74 6f 70 20 6f      ** The top o
1cc90 66 20 74 68 65 20 6c 6f 6f 70 20 6c 6f 6f 6b 73  f the loop looks
1cca0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
1ccb0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1ccc0 20 20 20 4e 75 6c 6c 20 20 20 20 20 20 20 31 20     Null       1 
1ccd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
1cce0 20 5a 65 72 6f 20 74 68 65 20 72 6f 77 73 65 74   Zero the rowset
1ccf0 20 69 6e 20 72 65 67 20 31 0a 20 20 20 20 2a 2a   in reg 1.    **
1cd00 0a 20 20 20 20 2a 2a 20 54 68 65 6e 2c 20 66 6f  .    ** Then, fo
1cd10 72 20 65 61 63 68 20 69 6e 64 65 78 65 64 20 74  r each indexed t
1cd20 65 72 6d 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  erm, the followi
1cd30 6e 67 2e 20 54 68 65 20 61 72 67 75 6d 65 6e 74  ng. The argument
1cd40 73 20 74 6f 0a 20 20 20 20 2a 2a 20 52 6f 77 53  s to.    ** RowS
1cd50 65 74 54 65 73 74 20 61 72 65 20 73 75 63 68 20  etTest are such 
1cd60 74 68 61 74 20 74 68 65 20 72 6f 77 69 64 20 6f  that the rowid o
1cd70 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
1cd80 77 20 69 73 20 69 6e 73 65 72 74 65 64 0a 20 20  w is inserted.  
1cd90 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 52 6f    ** into the Ro
1cda0 77 53 65 74 2e 20 49 66 20 69 74 20 69 73 20 61  wSet. If it is a
1cdb0 6c 72 65 61 64 79 20 70 72 65 73 65 6e 74 2c 20  lready present, 
1cdc0 63 6f 6e 74 72 6f 6c 20 73 6b 69 70 73 20 74 68  control skips th
1cdd0 65 0a 20 20 20 20 2a 2a 20 47 6f 73 75 62 20 6f  e.    ** Gosub o
1cde0 70 63 6f 64 65 20 61 6e 64 20 6a 75 6d 70 73 20  pcode and jumps 
1cdf0 73 74 72 61 69 67 68 74 20 74 6f 20 74 68 65 20  straight to the 
1ce00 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 62  code generated b
1ce10 79 20 57 68 65 72 65 45 6e 64 28 29 2e 0a 20 20  y WhereEnd()..  
1ce20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1ce30 20 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 42     sqlite3WhereB
1ce40 65 67 69 6e 28 3c 74 65 72 6d 3e 29 0a 20 20 20  egin(<term>).   
1ce50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 52 6f 77   **          Row
1ce60 53 65 74 54 65 73 74 20 20 20 20 20 20 20 20 20  SetTest         
1ce70 20 20 20 20 20 20 20 20 20 23 20 49 6e 73 65 72           # Inser
1ce80 74 20 72 6f 77 69 64 20 69 6e 74 6f 20 72 6f 77  t rowid into row
1ce90 73 65 74 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  set.    **      
1cea0 20 20 20 20 47 6f 73 75 62 20 20 20 20 20 20 32      Gosub      2
1ceb0 20 41 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20   A.    **       
1cec0 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
1ced0 28 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ().    **.    **
1cee0 20 46 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 61   Following the a
1cef0 62 6f 76 65 2c 20 63 6f 64 65 20 74 6f 20 74 65  bove, code to te
1cf00 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
1cf10 2e 20 4c 61 62 65 6c 20 41 2c 20 74 68 65 20 74  . Label A, the t
1cf20 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 6f 66 20  arget.    ** of 
1cf30 74 68 65 20 47 6f 73 75 62 20 61 62 6f 76 65 2c  the Gosub above,
1cf40 20 6a 75 6d 70 73 20 74 6f 20 74 68 65 20 69 6e   jumps to the in
1cf50 73 74 72 75 63 74 69 6f 6e 20 72 69 67 68 74 20  struction right 
1cf60 61 66 74 65 72 20 74 68 65 20 47 6f 74 6f 2e 0a  after the Goto..
1cf70 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
1cf80 20 20 20 20 20 20 20 4e 75 6c 6c 20 20 20 20 20         Null     
1cf90 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
1cfa0 20 20 20 23 20 5a 65 72 6f 20 74 68 65 20 72 6f     # Zero the ro
1cfb0 77 73 65 74 20 69 6e 20 72 65 67 20 31 0a 20 20  wset in reg 1.  
1cfc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 47 6f    **          Go
1cfd0 74 6f 20 20 20 20 20 20 20 42 20 20 20 20 20 20  to       B      
1cfe0 20 20 20 20 20 20 20 20 20 20 23 20 54 68 65 20            # The 
1cff0 6c 6f 6f 70 20 69 73 20 66 69 6e 69 73 68 65 64  loop is finished
1d000 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1d010 20 20 20 20 20 20 41 3a 20 3c 6c 6f 6f 70 20 62        A: <loop b
1d020 6f 64 79 3e 20 20 20 20 20 20 20 20 20 20 20 20  ody>            
1d030 20 20 20 20 20 23 20 52 65 74 75 72 6e 20 64 61       # Return da
1d040 74 61 2c 20 77 68 61 74 65 76 65 72 2e 0a 20 20  ta, whatever..  
1d050 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20    **.    **     
1d060 20 20 20 20 20 52 65 74 75 72 6e 20 20 20 20 20       Return     
1d070 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
1d080 20 23 20 4a 75 6d 70 20 62 61 63 6b 20 74 6f 20   # Jump back to 
1d090 74 68 65 20 47 6f 73 75 62 0a 20 20 20 20 2a 2a  the Gosub.    **
1d0a0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 42 3a  .    **       B:
1d0b0 20 3c 61 66 74 65 72 20 74 68 65 20 6c 6f 6f 70   <after the loop
1d0c0 3e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2f 0a  >.    **.    */.
1d0d0 20 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20      WhereClause 
1d0e0 2a 70 4f 72 57 63 3b 20 20 20 20 2f 2a 20 54 68  *pOrWc;    /* Th
1d0f0 65 20 4f 52 2d 63 6c 61 75 73 65 20 62 72 6f 6b  e OR-clause brok
1d100 65 6e 20 6f 75 74 20 69 6e 74 6f 20 73 75 62 74  en out into subt
1d110 65 72 6d 73 20 2a 2f 0a 20 20 20 20 57 68 65 72  erms */.    Wher
1d120 65 54 65 72 6d 20 2a 70 46 69 6e 61 6c 3b 20 20  eTerm *pFinal;  
1d130 20 20 20 2f 2a 20 46 69 6e 61 6c 20 73 75 62 74     /* Final subt
1d140 65 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 4f  erm within the O
1d150 52 2d 63 6c 61 75 73 65 2e 20 2a 2f 0a 20 20 20  R-clause. */.   
1d160 20 53 72 63 4c 69 73 74 20 6f 6e 65 54 61 62 3b   SrcList oneTab;
1d170 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6f 72 74          /* Short
1d180 65 6e 65 64 20 74 61 62 6c 65 20 6c 69 73 74 20  ened table list 
1d190 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 72 65 67 52  */..    int regR
1d1a0 65 74 75 72 6e 20 3d 20 2b 2b 70 50 61 72 73 65  eturn = ++pParse
1d1b0 2d 3e 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  ->nMem;         
1d1c0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 75 73    /* Register us
1d1d0 65 64 20 77 69 74 68 20 4f 50 5f 47 6f 73 75 62  ed with OP_Gosub
1d1e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52   */.    int regR
1d1f0 6f 77 73 65 74 20 3d 20 30 3b 20 20 20 20 20 20  owset = 0;      
1d200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d210 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f    /* Register fo
1d220 72 20 52 6f 77 53 65 74 20 6f 62 6a 65 63 74 20  r RowSet object 
1d230 2a 2f 0a 20 20 20 20 69 6e 74 20 72 65 67 52 6f  */.    int regRo
1d240 77 69 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  wid = 0;        
1d250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d260 20 2f 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6c   /* Register hol
1d270 64 69 6e 67 20 72 6f 77 69 64 20 2a 2f 0a 20 20  ding rowid */.  
1d280 20 20 69 6e 74 20 69 4c 6f 6f 70 42 6f 64 79 20    int iLoopBody 
1d290 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
1d2a0 65 4c 61 62 65 6c 28 76 29 3b 20 20 2f 2a 20 53  eLabel(v);  /* S
1d2b0 74 61 72 74 20 6f 66 20 6c 6f 6f 70 20 62 6f 64  tart of loop bod
1d2c0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 52 65  y */.    int iRe
1d2d0 74 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20  tInit;          
1d2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d2f0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
1d300 20 72 65 67 52 65 74 75 72 6e 20 69 6e 69 74 20   regReturn init 
1d310 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  */.    int ii;. 
1d320 20 20 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 70    .    pTerm = p
1d330 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 54  Level->plan.u.pT
1d340 65 72 6d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  erm;.    assert(
1d350 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
1d360 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
1d370 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 4f 52  eOperator==WO_OR
1d380 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d390 28 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20  (pTerm->wtFlags 
1d3a0 26 20 54 45 52 4d 5f 4f 52 49 4e 46 4f 29 21 3d  & TERM_ORINFO)!=
1d3b0 30 20 29 3b 0a 20 20 20 20 70 4f 72 57 63 20 3d  0 );.    pOrWc =
1d3c0 20 26 70 54 65 72 6d 2d 3e 75 2e 70 4f 72 49 6e   &pTerm->u.pOrIn
1d3d0 66 6f 2d 3e 77 63 3b 0a 20 20 20 20 70 46 69 6e  fo->wc;.    pFin
1d3e0 61 6c 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 70  al = &pOrWc->a[p
1d3f0 4f 72 57 63 2d 3e 6e 54 65 72 6d 2d 31 5d 3b 0a  OrWc->nTerm-1];.
1d400 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 61  .    /* Set up a
1d410 20 53 72 63 4c 69 73 74 20 63 6f 6e 74 61 69 6e   SrcList contain
1d420 69 6e 67 20 6a 75 73 74 20 74 68 65 20 74 61 62  ing just the tab
1d430 6c 65 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64  le being scanned
1d440 20 62 79 20 74 68 69 73 20 6c 6f 6f 70 2e 20 2a   by this loop. *
1d450 2f 0a 20 20 20 20 6f 6e 65 54 61 62 2e 6e 53 72  /.    oneTab.nSr
1d460 63 20 3d 20 31 3b 0a 20 20 20 20 6f 6e 65 54 61  c = 1;.    oneTa
1d470 62 2e 6e 41 6c 6c 6f 63 20 3d 20 31 3b 0a 20 20  b.nAlloc = 1;.  
1d480 20 20 6f 6e 65 54 61 62 2e 61 5b 30 5d 20 3d 20    oneTab.a[0] = 
1d490 2a 70 54 61 62 49 74 65 6d 3b 0a 0a 20 20 20 20  *pTabItem;..    
1d4a0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1d4b0 65 20 72 6f 77 73 65 74 20 72 65 67 69 73 74 65  e rowset registe
1d4c0 72 20 74 6f 20 63 6f 6e 74 61 69 6e 20 4e 55 4c  r to contain NUL
1d4d0 4c 2e 20 41 6e 20 53 51 4c 20 4e 55 4c 4c 20 69  L. An SQL NULL i
1d4e0 73 20 0a 20 20 20 20 2a 2a 20 65 71 75 69 76 61  s .    ** equiva
1d4f0 6c 65 6e 74 20 74 6f 20 61 6e 20 65 6d 70 74 79  lent to an empty
1d500 20 72 6f 77 73 65 74 2e 0a 20 20 20 20 2a 2a 0a   rowset..    **.
1d510 20 20 20 20 2a 2a 20 41 6c 73 6f 20 69 6e 69 74      ** Also init
1d520 69 61 6c 69 7a 65 20 72 65 67 52 65 74 75 72 6e  ialize regReturn
1d530 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1d540 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 69  address of the i
1d550 6e 73 74 72 75 63 74 69 6f 6e 20 0a 20 20 20 20  nstruction .    
1d560 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  ** immediately f
1d570 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4f 50 5f  ollowing the OP_
1d580 52 65 74 75 72 6e 20 61 74 20 74 68 65 20 62 6f  Return at the bo
1d590 74 74 6f 6d 20 6f 66 20 74 68 65 20 6c 6f 6f 70  ttom of the loop
1d5a0 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69 73  . This.    ** is
1d5b0 20 72 65 71 75 69 72 65 64 20 69 6e 20 61 20 66   required in a f
1d5c0 65 77 20 6f 62 73 63 75 72 65 20 4c 45 46 54 20  ew obscure LEFT 
1d5d0 4a 4f 49 4e 20 63 61 73 65 73 20 77 68 65 72 65  JOIN cases where
1d5e0 20 63 6f 6e 74 72 6f 6c 20 6a 75 6d 70 73 0a 20   control jumps. 
1d5f0 20 20 20 2a 2a 20 6f 76 65 72 20 74 68 65 20 74     ** over the t
1d600 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 69  op of the loop i
1d610 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
1d620 69 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  it. In this case
1d630 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f 72   the .    ** cor
1d640 72 65 63 74 20 72 65 73 70 6f 6e 73 65 20 66 6f  rect response fo
1d650 72 20 74 68 65 20 65 6e 64 2d 6f 66 2d 6c 6f 6f  r the end-of-loo
1d660 70 20 63 6f 64 65 20 28 74 68 65 20 4f 50 5f 52  p code (the OP_R
1d670 65 74 75 72 6e 29 20 69 73 20 74 6f 20 0a 20 20  eturn) is to .  
1d680 20 20 2a 2a 20 66 61 6c 6c 20 74 68 72 6f 75 67    ** fall throug
1d690 68 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69 6e  h to the next in
1d6a0 73 74 72 75 63 74 69 6f 6e 2c 20 6a 75 73 74 20  struction, just 
1d6b0 61 73 20 61 6e 20 4f 50 5f 4e 65 78 74 20 64 6f  as an OP_Next do
1d6c0 65 73 20 69 66 0a 20 20 20 20 2a 2a 20 63 61 6c  es if.    ** cal
1d6d0 6c 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  led on an uninit
1d6e0 69 61 6c 69 7a 65 64 20 63 75 72 73 6f 72 2e 0a  ialized cursor..
1d6f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28      */.    if( (
1d700 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45  wctrlFlags & WHE
1d710 52 45 5f 44 55 50 4c 49 43 41 54 45 53 5f 4f 4b  RE_DUPLICATES_OK
1d720 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1d730 67 52 6f 77 73 65 74 20 3d 20 2b 2b 70 50 61 72  gRowset = ++pPar
1d740 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20 20  se->nMem;.      
1d750 72 65 67 52 6f 77 69 64 20 3d 20 2b 2b 70 50 61  regRowid = ++pPa
1d760 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
1d770 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1d780 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
1d790 2c 20 72 65 67 52 6f 77 73 65 74 29 3b 0a 20 20  , regRowset);.  
1d7a0 20 20 7d 0a 20 20 20 20 69 52 65 74 49 6e 69 74    }.    iRetInit
1d7b0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
1d7c0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
1d7d0 65 72 2c 20 30 2c 20 72 65 67 52 65 74 75 72 6e  er, 0, regReturn
1d7e0 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30  );..    for(ii=0
1d7f0 3b 20 69 69 3c 70 4f 72 57 63 2d 3e 6e 54 65 72  ; ii<pOrWc->nTer
1d800 6d 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  m; ii++){.      
1d810 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
1d820 72 6d 20 3d 20 26 70 4f 72 57 63 2d 3e 61 5b 69  rm = &pOrWc->a[i
1d830 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  i];.      if( pO
1d840 72 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  rTerm->leftCurso
1d850 72 3d 3d 69 43 75 72 20 7c 7c 20 70 4f 72 54 65  r==iCur || pOrTe
1d860 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
1d870 4f 5f 41 4e 44 20 29 7b 0a 20 20 20 20 20 20 20  O_AND ){.       
1d880 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 53 75 62   WhereInfo *pSub
1d890 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 20  WInfo;          
1d8a0 2f 2a 20 49 6e 66 6f 20 66 6f 72 20 73 69 6e 67  /* Info for sing
1d8b0 6c 65 20 4f 52 2d 74 65 72 6d 20 73 63 61 6e 20  le OR-term scan 
1d8c0 2a 2f 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  */.        /* Lo
1d8d0 6f 70 20 74 68 72 6f 75 67 68 20 74 61 62 6c 65  op through table
1d8e0 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6d 61   entries that ma
1d8f0 74 63 68 20 74 65 72 6d 20 70 4f 72 54 65 72 6d  tch term pOrTerm
1d900 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 53 75  . */.        pSu
1d910 62 57 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 33  bWInfo = sqlite3
1d920 57 68 65 72 65 42 65 67 69 6e 28 70 50 61 72 73  WhereBegin(pPars
1d930 65 2c 20 26 6f 6e 65 54 61 62 2c 20 70 4f 72 54  e, &oneTab, pOrT
1d940 65 72 6d 2d 3e 70 45 78 70 72 2c 20 30 2c 0a 20  erm->pExpr, 0,. 
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 20 20 20 20 20 20 20 57 48 45 52 45 5f 4f 4d 49         WHERE_OMI
1d970 54 5f 4f 50 45 4e 20 7c 20 57 48 45 52 45 5f 4f  T_OPEN | WHERE_O
1d980 4d 49 54 5f 43 4c 4f 53 45 20 7c 20 57 48 45 52  MIT_CLOSE | WHER
1d990 45 5f 46 4f 52 43 45 5f 54 41 42 4c 45 29 3b 0a  E_FORCE_TABLE);.
1d9a0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 75 62          if( pSub
1d9b0 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  WInfo ){.       
1d9c0 20 20 20 69 66 28 20 28 77 63 74 72 6c 46 6c 61     if( (wctrlFla
1d9d0 67 73 20 26 20 57 48 45 52 45 5f 44 55 50 4c 49  gs & WHERE_DUPLI
1d9e0 43 41 54 45 53 5f 4f 4b 29 3d 3d 30 20 29 7b 0a  CATES_OK)==0 ){.
1d9f0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1da00 69 53 65 74 20 3d 20 28 28 69 69 3d 3d 70 4f 72  iSet = ((ii==pOr
1da10 57 63 2d 3e 6e 54 65 72 6d 2d 31 29 3f 2d 31 3a  Wc->nTerm-1)?-1:
1da20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ii);.           
1da30 20 69 6e 74 20 72 3b 0a 20 20 20 20 20 20 20 20   int r;.        
1da40 20 20 20 20 72 20 3d 20 73 71 6c 69 74 65 33 45      r = sqlite3E
1da50 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e  xprCodeGetColumn
1da60 28 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65  (pParse, pTabIte
1da70 6d 2d 3e 70 54 61 62 2c 20 2d 31 2c 20 69 43 75  m->pTab, -1, iCu
1da80 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  r, .            
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 67               reg
1dab0 52 6f 77 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  Rowid, 0);.     
1dac0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1dad0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 52  beAddOp4(v, OP_R
1dae0 6f 77 53 65 74 54 65 73 74 2c 20 72 65 67 52 6f  owSetTest, regRo
1daf0 77 73 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20  wset,.          
1db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1db20 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 32 2c  urrentAddr(v)+2,
1db30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1db40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1db50 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f  , SQLITE_INT_TO_
1db60 50 54 52 28 69 53 65 74 29 2c 20 50 34 5f 49 4e  PTR(iSet), P4_IN
1db70 54 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  T32);.          
1db80 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
1db90 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dba0 20 4f 50 5f 47 6f 73 75 62 2c 20 72 65 67 52 65   OP_Gosub, regRe
1dbb0 74 75 72 6e 2c 20 69 4c 6f 6f 70 42 6f 64 79 29  turn, iLoopBody)
1dbc0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
1dbd0 46 69 6e 69 73 68 20 74 68 65 20 6c 6f 6f 70 20  Finish the loop 
1dbe0 74 68 72 6f 75 67 68 20 74 61 62 6c 65 20 65 6e  through table en
1dbf0 74 72 69 65 73 20 74 68 61 74 20 6d 61 74 63 68  tries that match
1dc00 20 74 65 72 6d 20 70 4f 72 54 65 72 6d 2e 20 2a   term pOrTerm. *
1dc10 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
1dc20 74 65 33 57 68 65 72 65 45 6e 64 28 70 53 75 62  te3WhereEnd(pSub
1dc30 57 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20  WInfo);.        
1dc40 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1dc50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
1dc60 68 61 6e 67 65 50 31 28 76 2c 20 69 52 65 74 49  hangeP1(v, iRetI
1dc70 6e 69 74 2c 20 73 71 6c 69 74 65 33 56 64 62 65  nit, sqlite3Vdbe
1dc80 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
1dc90 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 56  .    /* sqlite3V
1dca0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1dcb0 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 52 6f 77 73  Null, 0, regRows
1dcc0 65 74 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69  et); */.    sqli
1dcd0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
1dce0 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c 65   OP_Goto, 0, pLe
1dcf0 76 65 6c 2d 3e 61 64 64 72 42 72 6b 29 3b 0a 20  vel->addrBrk);. 
1dd00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
1dd10 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 69 4c  solveLabel(v, iL
1dd20 6f 6f 70 42 6f 64 79 29 3b 0a 0a 20 20 20 20 70  oopBody);..    p
1dd30 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 52  Level->op = OP_R
1dd40 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 76 65  eturn;.    pLeve
1dd50 6c 2d 3e 70 31 20 3d 20 72 65 67 52 65 74 75 72  l->p1 = regRetur
1dd60 6e 3b 0a 20 20 20 20 64 69 73 61 62 6c 65 54 65  n;.    disableTe
1dd70 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
1dd80 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
1dd90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
1dda0 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  _OR_OPTIMIZATION
1ddb0 20 2a 2f 0a 0a 20 20 7b 0a 20 20 20 20 2f 2a 20   */..  {.    /* 
1ddc0 43 61 73 65 20 35 3a 20 20 54 68 65 72 65 20 69  Case 5:  There i
1ddd0 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
1dde0 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
1ddf0 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 2a 2a   complete.    **
1de00 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
1de10 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
1de20 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  le..    */.    s
1de30 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 61  tatic const u8 a
1de40 53 74 65 70 5b 5d 20 3d 20 7b 20 4f 50 5f 4e 65  Step[] = { OP_Ne
1de50 78 74 2c 20 4f 50 5f 50 72 65 76 20 7d 3b 0a 20  xt, OP_Prev };. 
1de60 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1de70 75 38 20 61 53 74 61 72 74 5b 5d 20 3d 20 7b 20  u8 aStart[] = { 
1de80 4f 50 5f 52 65 77 69 6e 64 2c 20 4f 50 5f 4c 61  OP_Rewind, OP_La
1de90 73 74 20 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  st };.    assert
1dea0 28 20 62 52 65 76 3d 3d 30 20 7c 7c 20 62 52 65  ( bRev==0 || bRe
1deb0 76 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  v==1 );.    asse
1dec0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
1ded0 20 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e   );.    pLevel->
1dee0 6f 70 20 3d 20 61 53 74 65 70 5b 62 52 65 76 5d  op = aStep[bRev]
1def0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31  ;.    pLevel->p1
1df00 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 70 4c 65   = iCur;.    pLe
1df10 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71  vel->p2 = 1 + sq
1df20 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1df30 76 2c 20 61 53 74 61 72 74 5b 62 52 65 76 5d 2c  v, aStart[bRev],
1df40 20 69 43 75 72 2c 20 61 64 64 72 42 72 6b 29 3b   iCur, addrBrk);
1df50 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 35 20  .    pLevel->p5 
1df60 3d 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  = SQLITE_STMTSTA
1df70 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
1df80 50 3b 0a 20 20 7d 0a 20 20 6e 6f 74 52 65 61 64  P;.  }.  notRead
1df90 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70 57  y &= ~getMask(pW
1dfa0 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 69 43 75  C->pMaskSet, iCu
1dfb0 72 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 65 72 74  r);..  /* Insert
1dfc0 20 63 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76   code to test ev
1dfd0 65 72 79 20 73 75 62 65 78 70 72 65 73 73 69 6f  ery subexpressio
1dfe0 6e 20 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f  n that can be co
1dff0 6d 70 6c 65 74 65 6c 79 0a 20 20 2a 2a 20 63 6f  mpletely.  ** co
1e000 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
1e010 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
1e020 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 6b  tables..  */.  k
1e030 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 54 65 72   = 0;.  for(pTer
1e040 6d 3d 70 57 43 2d 3e 61 2c 20 6a 3d 70 57 43 2d  m=pWC->a, j=pWC-
1e050 3e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d  >nTerm; j>0; j--
1e060 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
1e070 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 74 65  Expr *pE;.    te
1e080 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77  stcase( pTerm->w
1e090 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  tFlags & TERM_VI
1e0a0 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 74 65 73  RTUAL );.    tes
1e0b0 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e 77 74  tcase( pTerm->wt
1e0c0 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  Flags & TERM_COD
1e0d0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54  ED );.    if( pT
1e0e0 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 26 20 28  erm->wtFlags & (
1e0f0 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
1e100 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e 74 69  M_CODED) ) conti
1e110 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 54  nue;.    if( (pT
1e120 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
1e130 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
1e140 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 70 45  continue;.    pE
1e150 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b   = pTerm->pExpr;
1e160 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21  .    assert( pE!
1e170 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
1e180 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
1e190 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  && !ExprHasPrope
1e1a0 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d 4a  rty(pE, EP_FromJ
1e1b0 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  oin) ){.      co
1e1c0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
1e1d0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1e1e0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
1e1f0 20 61 64 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54   addrCont, SQLIT
1e200 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20  E_JUMPIFNULL);. 
1e210 20 20 20 6b 20 3d 20 31 3b 0a 20 20 20 20 70 54     k = 1;.    pT
1e220 65 72 6d 2d 3e 77 74 46 6c 61 67 73 20 7c 3d 20  erm->wtFlags |= 
1e230 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 7d 0a  TERM_CODED;.  }.
1e240 0a 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54  .  /* For a LEFT
1e250 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
1e260 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
1e270 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
1e280 66 61 63 74 20 74 68 61 74 0a 20 20 2a 2a 20 61  fact that.  ** a
1e290 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20  t least one row 
1e2a0 6f 66 20 74 68 65 20 72 69 67 68 74 20 74 61 62  of the right tab
1e2b0 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64 20 74  le has matched t
1e2c0 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20  he left table.  
1e2d0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 65 76  .  */.  if( pLev
1e2e0 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b  el->iLeftJoin ){
1e2f0 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 64 64  .    pLevel->add
1e300 72 46 69 72 73 74 20 3d 20 73 71 6c 69 74 65 33  rFirst = sqlite3
1e310 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
1e320 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  v);.    sqlite3V
1e330 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
1e340 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
1e350 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
1e360 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
1e370 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45 46 54  (v, "record LEFT
1e380 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a 20 20   JOIN hit"));.  
1e390 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e3a0 68 65 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b  heClear(pParse);
1e3b0 0a 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 70  .    for(pTerm=p
1e3c0 57 43 2d 3e 61 2c 20 6a 3d 30 3b 20 6a 3c 70 57  WC->a, j=0; j<pW
1e3d0 43 2d 3e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70  C->nTerm; j++, p
1e3e0 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 74  Term++){.      t
1e3f0 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d 3e  estcase( pTerm->
1e400 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f 56  wtFlags & TERM_V
1e410 49 52 54 55 41 4c 20 29 3b 0a 20 20 20 20 20 20  IRTUAL );.      
1e420 74 65 73 74 63 61 73 65 28 20 70 54 65 72 6d 2d  testcase( pTerm-
1e430 3e 77 74 46 6c 61 67 73 20 26 20 54 45 52 4d 5f  >wtFlags & TERM_
1e440 43 4f 44 45 44 20 29 3b 0a 20 20 20 20 20 20 69  CODED );.      i
1e450 66 28 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67  f( pTerm->wtFlag
1e460 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41  s & (TERM_VIRTUA
1e470 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20  L|TERM_CODED) ) 
1e480 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1e490 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72  if( (pTerm->prer
1e4a0 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79  eqAll & notReady
1e4b0 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
1e4c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1e4d0 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a 20  Term->pExpr );. 
1e4e0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e4f0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1e500 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 61 64  pTerm->pExpr, ad
1e510 64 72 43 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a  drCont, SQLITE_J
1e520 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20  UMPIFNULL);.    
1e530 20 20 70 54 65 72 6d 2d 3e 77 74 46 6c 61 67 73    pTerm->wtFlags
1e540 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a   |= TERM_CODED;.
1e550 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
1e560 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
1e570 67 28 70 50 61 72 73 65 2c 20 69 52 65 6c 65 61  g(pParse, iRelea
1e580 73 65 52 65 67 29 3b 0a 0a 20 20 72 65 74 75 72  seReg);..  retur
1e590 6e 20 6e 6f 74 52 65 61 64 79 3b 0a 7d 0a 0a 23  n notReady;.}..#
1e5a0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1e5b0 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68  E_TEST)./*.** Th
1e5c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
1e5d0 61 62 6c 65 20 68 6f 6c 64 73 20 61 20 74 65 78  able holds a tex
1e5e0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  t description of
1e5f0 20 71 75 65 72 79 20 70 6c 61 6e 20 67 65 6e 65   query plan gene
1e600 72 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  rated.** by the 
1e610 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61 6c 6c  most recent call
1e620 20 74 6f 20 73 71 6c 69 74 65 33 57 68 65 72 65   to sqlite3Where
1e630 42 65 67 69 6e 28 29 2e 20 20 45 61 63 68 20 63  Begin().  Each c
1e640 61 6c 6c 20 74 6f 20 57 68 65 72 65 42 65 67 69  all to WhereBegi
1e650 6e 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  n.** overwrites 
1e660 74 68 65 20 70 72 65 76 69 6f 75 73 2e 20 20 54  the previous.  T
1e670 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1e680 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1e690 69 6e 67 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79  ing and.** analy
1e6a0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61  sis only..*/.cha
1e6b0 72 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f  r sqlite3_query_
1e6c0 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20  plan[BMS*2*40]; 
1e6d0 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20   /* Text of the 
1e6e0 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  join */.static i
1e6f0 6e 74 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20  nt nQPlan = 0;  
1e700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e710 65 78 74 20 66 72 65 65 20 73 6c 6f 77 20 69 6e  ext free slow in
1e720 20 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a   _query_plan[] *
1e730 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  /..#endif /* SQL
1e740 49 54 45 5f 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a  ITE_TEST */.../*
1e750 0a 2a 2a 20 46 72 65 65 20 61 20 57 68 65 72 65  .** Free a Where
1e760 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a 2a  Info structure.*
1e770 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 68  /.static void wh
1e780 65 72 65 49 6e 66 6f 46 72 65 65 28 73 71 6c 69  ereInfoFree(sqli
1e790 74 65 33 20 2a 64 62 2c 20 57 68 65 72 65 49 6e  te3 *db, WhereIn
1e7a0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69  fo *pWInfo){.  i
1e7b0 66 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20  f( pWInfo ){.   
1e7c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
1e7d0 69 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e  i=0; i<pWInfo->n
1e7e0 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  Level; i++){.   
1e7f0 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
1e800 5f 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70  _info *pInfo = p
1e810 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78  WInfo->a[i].pIdx
1e820 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  Info;.      if( 
1e830 70 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20  pInfo ){.       
1e840 20 2f 2a 20 61 73 73 65 72 74 28 20 70 49 6e 66   /* assert( pInf
1e850 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
1e860 53 74 72 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  Str==0 || db->ma
1e870 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 20 2a 2f  llocFailed ); */
1e880 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e  .        if( pIn
1e890 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
1e8a0 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  xStr ){.        
1e8b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e8c0 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20  Info->idxStr);. 
1e8d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e8e0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
1e8f0 62 2c 20 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  b, pInfo);.     
1e900 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 65   }.    }.    whe
1e910 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 70 57  reClauseClear(pW
1e920 49 6e 66 6f 2d 3e 70 57 43 29 3b 0a 20 20 20 20  Info->pWC);.    
1e930 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
1e940 2c 20 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  , pWInfo);.  }.}
1e950 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
1e960 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  e the beginning 
1e970 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64  of the loop used
1e980 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73   for WHERE claus
1e990 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a  e processing..**
1e9a0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1e9b0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
1e9c0 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75  o an opaque stru
1e9d0 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
1e9e0 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  ins.** informati
1e9f0 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72  on needed to ter
1ea00 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
1ea10 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c    Later, the cal
1ea20 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  ling routine.** 
1ea30 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71  should invoke sq
1ea40 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20  lite3WhereEnd() 
1ea50 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20  with the return 
1ea60 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75  value of this fu
1ea70 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64  nction.** in ord
1ea80 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74  er to complete t
1ea90 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
1eaa0 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a  processing..**.*
1eab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1eac0 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69  curs, this routi
1ead0 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e  ne returns NULL.
1eae0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63  .**.** The basic
1eaf0 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61   idea is to do a
1eb00 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e   nested loop, on
1eb10 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20  e loop for each 
1eb20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20  table in.** the 
1eb30 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61  FROM clause of a
1eb40 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52   select.  (INSER
1eb50 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61  T and UPDATE sta
1eb60 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a  tements are the.
1eb70 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c  ** same as a SEL
1eb80 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20  ECT with only a 
1eb90 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
1eba0 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
1ebb0 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c  )  For.** exampl
1ebc0 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73  e, if the SQL is
1ebd0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
1ebe0 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d     SELECT * FROM
1ebf0 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52   t1, t2, t3 WHER
1ec00 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65  E ...;.**.** The
1ec10 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72  n the code gener
1ec20 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75  ated is conceptu
1ec30 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f  ally like the fo
1ec40 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
1ec50 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31      foreach row1
1ec60 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20   in t1 do       
1ec70 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
1ec80 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f  ted.**        fo
1ec90 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
1eca0 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20   do      |-- by 
1ecb0 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
1ecc0 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  n().**          
1ecd0 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20  foreach row3 in 
1ece0 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20  t3 do   /.**    
1ecf0 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20          ....**  
1ed00 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
1ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61  \    Code genera
1ed30 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e  ted.**        en
1ed40 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
1ed50 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20           |-- by 
1ed60 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
1ed70 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20  ).**      end   
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f        /.**.** No
1eda0 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70  te that the loop
1edb0 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e  s might not be n
1edc0 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ested in the ord
1edd0 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65 79  er in which they
1ede0 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68  .** appear in th
1edf0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66  e FROM clause if
1ee00 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64   a different ord
1ee10 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62 6c  er is better abl
1ee20 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65  e to make.** use
1ee30 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f   of indices.  No
1ee40 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65  te also that whe
1ee50 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  n the IN operato
1ee60 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20  r appears in.** 
1ee70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1ee80 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c  , it might resul
1ee90 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20  t in additional 
1eea0 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72  nested loops for
1eeb0 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  .** scanning thr
1eec0 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20  ough all values 
1eed0 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
1eee0 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e  d side of the IN
1eef0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72  ..**.** There ar
1ef00 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20  e Btree cursors 
1ef10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ef20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20  each table.  t1 
1ef30 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e  uses cursor.** n
1ef40 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e  umber pTabList->
1ef50 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74  a[0].iCursor.  t
1ef60 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f  2 uses the curso
1ef70 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d  r pTabList->a[1]
1ef80 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64  .iCursor..** And
1ef90 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73   so forth.  This
1efa0 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74   routine generat
1efb0 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20  es code to open 
1efc0 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f  those VDBE curso
1efd0 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  rs.** and sqlite
1efe0 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65  3WhereEnd() gene
1eff0 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74  rates the code t
1f000 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a  o close them..**
1f010 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61  .** The code tha
1f020 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65  t sqlite3WhereBe
1f030 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20  gin() generates 
1f040 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f  leaves the curso
1f050 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70  rs named.** in p
1f060 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67  TabList pointing
1f070 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70   at their approp
1f080 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20  riate entries.  
1f090 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a  The [...] code.*
1f0a0 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c  * can use OP_Col
1f0b0 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64  umn and OP_Rowid
1f0c0 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73   opcodes on thes
1f0d0 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74  e cursors to ext
1f0e0 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f  ract.** data fro
1f0f0 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61  m the various ta
1f100 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70  bles of the loop
1f110 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57  ..**.** If the W
1f120 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65  HERE clause is e
1f130 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63  mpty, the foreac
1f140 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63  h loops must eac
1f150 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20  h scan their.** 
1f160 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20  entire tables.  
1f170 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79  Thus a three-way
1f180 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e   join is an O(N^
1f190 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42  3) operation.  B
1f1a0 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62  ut if.** the tab
1f1b0 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73  les have indices
1f1c0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74   and there are t
1f1d0 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52  erms in the WHER
1f1e0 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a  E clause that.**
1f1f0 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20   refer to those 
1f200 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c  indices, a compl
1f210 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63  ete table scan c
1f220 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e  an be avoided an
1f230 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69  d the.** code wi
1f240 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74  ll run much fast
1f250 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65  er.  Most of the
1f260 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f   work of this ro
1f270 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e  utine is checkin
1f280 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74  g.** to see if t
1f290 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73  here are indices
1f2a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1f2b0 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68  d to speed up th
1f2c0 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65  e loop..**.** Te
1f2d0 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
1f2e0 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f   clause are also
1f2f0 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77   used to limit w
1f300 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c  hich rows actual
1f310 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f  ly.** make it to
1f320 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68   the "..." in th
1f330 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20  e middle of the 
1f340 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63  loop.  After eac
1f350 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20  h "foreach",.** 
1f360 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
1f370 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75  RE clause that u
1f380 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e  se only terms in
1f390 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f   that loop and o
1f3a0 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72  uter.** loops ar
1f3b0 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  e evaluated and 
1f3c0 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20  if false a jump 
1f3d0 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61  is made around a
1f3e0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
1f3f0 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72   inner loops (or
1f400 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e   around the "...
1f410 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63  " if the test oc
1f420 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
1f430 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c  inner-.** most l
1f440 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52  oop).**.** OUTER
1f450 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20   JOINS.**.** An 
1f460 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61  outer join of ta
1f470 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69  bles t1 and t2 i
1f480 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f  s conceptally co
1f490 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ded as follows:.
1f4a0 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68  **.**    foreach
1f4b0 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a   row1 in t1 do.*
1f4c0 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a  *      flag = 0.
1f4d0 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20  **      foreach 
1f4e0 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a  row2 in t2 do.**
1f4f0 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a          start:.*
1f500 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a  *          ....*
1f510 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20  *          flag 
1f520 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a  = 1.**      end.
1f530 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d  **      if flag=
1f540 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20  =0 then.**      
1f550 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20    move the row2 
1f560 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c  cursor to a null
1f570 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67   row.**        g
1f580 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20  oto start.**    
1f590 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a    fi.**    end.*
1f5a0 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c  *.** ORDER BY CL
1f5b0 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a  AUSE PROCESSING.
1f5c0 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79  **.** *ppOrderBy
1f5d0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1f5e0 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
1f5f0 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54  ause of a SELECT
1f600 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69   statement,.** i
1f610 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20  f there is one. 
1f620 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
1f630 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
1f640 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69  or if this routi
1f650 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
1f660 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f  from an UPDATE o
1f670 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65  r DELETE stateme
1f680 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72  nt, then ppOrder
1f690 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  By is NULL..**.*
1f6a0 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61  * If an index ca
1f6b0 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61  n be used so tha
1f6c0 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75  t the natural ou
1f6d0 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68  tput order of th
1f6e0 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20  e table.** scan 
1f6f0 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74  is correct for t
1f700 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
1f710 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e  se, then that in
1f720 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a  dex is used and.
1f730 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  ** *ppOrderBy is
1f740 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54   set to NULL.  T
1f750 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  his is an optimi
1f760 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76  zation that prev
1f770 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63  ents an.** unnec
1f780 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74  essary sort of t
1f790 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66  he result set if
1f7a0 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70   an index approp
1f7b0 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a  riate for the.**
1f7c0 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
1f7d0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
1f7e0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68  .**.** If the wh
1f7f0 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73  ere clause loops
1f800 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e   cannot be arran
1f810 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74  ged to provide t
1f820 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75  he correct.** ou
1f830 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e  tput order, then
1f840 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20   the *ppOrderBy 
1f850 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  is unchanged..*/
1f860 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69  .WhereInfo *sqli
1f870 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20  te3WhereBegin(. 
1f880 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1f890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1f8a0 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
1f8b0 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c    SrcList *pTabL
1f8c0 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73  ist,    /* A lis
1f8d0 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20  t of all tables 
1f8e0 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f  to be scanned */
1f8f0 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c  .  Expr *pWhere,
1f900 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1f910 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
1f920 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f    ExprList **ppO
1f930 72 64 65 72 42 79 2c 20 2f 2a 20 41 6e 20 4f 52  rderBy, /* An OR
1f940 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f  DER BY clause, o
1f950 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 75 31 36 20  r NULL */.  u16 
1f960 77 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20  wctrlFlags      
1f970 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
1f980 57 48 45 52 45 5f 2a 20 66 6c 61 67 73 20 64 65  WHERE_* flags de
1f990 66 69 6e 65 64 20 69 6e 20 73 71 6c 69 74 65 49  fined in sqliteI
1f9a0 6e 74 2e 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nt.h */.){.  int
1f9b0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1f9c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1f9d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
1f9e0 20 6e 42 79 74 65 57 49 6e 66 6f 3b 20 20 20 20   nByteWInfo;    
1f9f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 2e 20          /* Num. 
1fa00 62 79 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  bytes allocated 
1fa10 66 6f 72 20 57 68 65 72 65 49 6e 66 6f 20 73 74  for WhereInfo st
1fa20 72 75 63 74 20 2a 2f 0a 20 20 57 68 65 72 65 49  ruct */.  WhereI
1fa30 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20  nfo *pWInfo;    
1fa40 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63       /* Will bec
1fa50 6f 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ome the return v
1fa60 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
1fa70 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20  ction */.  Vdbe 
1fa80 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1fa90 62 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72  be;   /* The vir
1faa0 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e  tual database en
1fab0 67 69 6e 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  gine */.  Bitmas
1fac0 6b 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20  k notReady;     
1fad0 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20       /* Cursors 
1fae0 74 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74  that are not yet
1faf0 20 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20   positioned */. 
1fb00 20 57 68 65 72 65 4d 61 73 6b 53 65 74 20 2a 70   WhereMaskSet *p
1fb10 4d 61 73 6b 53 65 74 3b 20 20 20 20 2f 2a 20 54  MaskSet;    /* T
1fb20 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61  he expression ma
1fb30 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65 72  sk set */.  Wher
1fb40 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20 20 20  eClause *pWC;   
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
1fb60 65 63 6f 6d 70 6f 73 69 74 69 6f 6e 20 6f 66 20  ecomposition of 
1fb70 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
1fb80 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
1fb90 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49  List_item *pTabI
1fba0 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c  tem;  /* A singl
1fbb0 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61  e entry from pTa
1fbc0 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65  bList */.  Where
1fbd0 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20  Level *pLevel;  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
1fbf0 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20  single level in 
1fc00 74 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20  the pWInfo list 
1fc10 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20  */.  int iFrom; 
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
1fc40 75 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65  used FROM clause
1fc50 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   element */.  in
1fc60 74 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20  t andFlags;     
1fc70 20 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d           /* AND-
1fc80 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f  ed combination o
1fc90 66 20 61 6c 6c 20 70 57 43 2d 3e 61 5b 5d 2e 77  f all pWC->a[].w
1fca0 74 46 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69  tFlags */.  sqli
1fcb0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
1fcc0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1fcd0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
1fce0 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65  ..  /* The numbe
1fcf0 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
1fd00 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
1fd10 73 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65  s limited by the
1fd20 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20   number of.  ** 
1fd30 62 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73  bits in a Bitmas
1fd40 6b 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54  k .  */.  if( pT
1fd50 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53  abList->nSrc>BMS
1fd60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
1fd70 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
1fd80 22 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c  "at most %d tabl
1fd90 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42  es in a join", B
1fda0 4d 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  MS);.    return 
1fdb0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c  0;.  }..  /* All
1fdc0 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
1fdd0 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e  lize the WhereIn
1fde0 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
1fdf0 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  t will become th
1fe00 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61  e.  ** return va
1fe10 6c 75 65 2e 20 41 20 73 69 6e 67 6c 65 20 61 6c  lue. A single al
1fe20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 75 73 65 64  location is used
1fe30 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 57 68   to store the Wh
1fe40 65 72 65 49 6e 66 6f 0a 20 20 2a 2a 20 73 74 72  ereInfo.  ** str
1fe50 75 63 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  uct, the content
1fe60 73 20 6f 66 20 57 68 65 72 65 49 6e 66 6f 2e 61  s of WhereInfo.a
1fe70 5b 5d 2c 20 74 68 65 20 57 68 65 72 65 43 6c 61  [], the WhereCla
1fe80 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 20 20  use structure.  
1fe90 2a 2a 20 61 6e 64 20 74 68 65 20 57 68 65 72 65  ** and the Where
1fea0 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75 72  MaskSet structur
1feb0 65 2e 20 53 69 6e 63 65 20 57 68 65 72 65 43 6c  e. Since WhereCl
1fec0 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 61 6e  ause contains an
1fed0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 66 69 65   8-byte.  ** fie
1fee0 6c 64 20 28 74 79 70 65 20 42 69 74 6d 61 73 6b  ld (type Bitmask
1fef0 29 20 69 74 20 6d 75 73 74 20 62 65 20 61 6c 69  ) it must be ali
1ff00 67 6e 65 64 20 6f 6e 20 61 6e 20 38 2d 62 79 74  gned on an 8-byt
1ff10 65 20 62 6f 75 6e 64 61 72 79 20 6f 6e 0a 20 20  e boundary on.  
1ff20 2a 2a 20 73 6f 6d 65 20 61 72 63 68 69 74 65 63  ** some architec
1ff30 74 75 72 65 73 2e 20 48 65 6e 63 65 20 74 68 65  tures. Hence the
1ff40 20 52 4f 55 4e 44 38 28 29 20 62 65 6c 6f 77 2e   ROUND8() below.
1ff50 0a 20 20 2a 2f 0a 20 20 64 62 20 3d 20 70 50 61  .  */.  db = pPa
1ff60 72 73 65 2d 3e 64 62 3b 0a 20 20 6e 42 79 74 65  rse->db;.  nByte
1ff70 57 49 6e 66 6f 20 3d 20 52 4f 55 4e 44 38 28 73  WInfo = ROUND8(s
1ff80 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29  izeof(WhereInfo)
1ff90 2b 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  +(pTabList->nSrc
1ffa0 2d 31 29 2a 73 69 7a 65 6f 66 28 57 68 65 72 65  -1)*sizeof(Where
1ffb0 4c 65 76 65 6c 29 29 3b 0a 20 20 70 57 49 6e 66  Level));.  pWInf
1ffc0 6f 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  o = sqlite3DbMal
1ffd0 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 0a 20 20 20  locZero(db, .   
1ffe0 20 20 20 6e 42 79 74 65 57 49 6e 66 6f 20 2b 20     nByteWInfo + 
1fff0 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 57 68  .      sizeof(Wh
20000 65 72 65 43 6c 61 75 73 65 29 20 2b 0a 20 20 20  ereClause) +.   
20010 20 20 20 73 69 7a 65 6f 66 28 57 68 65 72 65 4d     sizeof(WhereM
20020 61 73 6b 53 65 74 29 0a 20 20 29 3b 0a 20 20 69  askSet).  );.  i
20030 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
20040 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
20050 77 68 65 72 65 42 65 67 69 6e 45 72 72 6f 72 3b  whereBeginError;
20060 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
20070 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73 74  Level = pTabList
20080 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f  ->nSrc;.  pWInfo
20090 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
200a0 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
200b0 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
200c0 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
200d0 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
200e0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
200f0 70 57 49 6e 66 6f 2d 3e 70 57 43 20 3d 20 70 57  pWInfo->pWC = pW
20100 43 20 3d 20 28 57 68 65 72 65 43 6c 61 75 73 65  C = (WhereClause
20110 20 2a 29 26 28 28 75 38 20 2a 29 70 57 49 6e 66   *)&((u8 *)pWInf
20120 6f 29 5b 6e 42 79 74 65 57 49 6e 66 6f 5d 3b 0a  o)[nByteWInfo];.
20130 20 20 70 57 49 6e 66 6f 2d 3e 77 63 74 72 6c 46    pWInfo->wctrlF
20140 6c 61 67 73 20 3d 20 77 63 74 72 6c 46 6c 61 67  lags = wctrlFlag
20150 73 3b 0a 20 20 70 4d 61 73 6b 53 65 74 20 3d 20  s;.  pMaskSet = 
20160 28 57 68 65 72 65 4d 61 73 6b 53 65 74 2a 29 26  (WhereMaskSet*)&
20170 70 57 43 5b 31 5d 3b 0a 0a 20 20 2f 2a 20 53 70  pWC[1];..  /* Sp
20180 6c 69 74 20 74 68 65 20 57 48 45 52 45 20 63 6c  lit the WHERE cl
20190 61 75 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61  ause into separa
201a0 74 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  te subexpression
201b0 73 20 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a  s where each.  *
201c0 2a 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  * subexpression 
201d0 69 73 20 73 65 70 61 72 61 74 65 64 20 62 79 20  is separated by 
201e0 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e  an AND operator.
201f0 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
20200 53 65 74 28 70 4d 61 73 6b 53 65 74 29 3b 0a 20  Set(pMaskSet);. 
20210 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
20220 28 70 57 43 2c 20 70 50 61 72 73 65 2c 20 70 4d  (pWC, pParse, pM
20230 61 73 6b 53 65 74 29 3b 0a 20 20 73 71 6c 69 74  askSet);.  sqlit
20240 65 33 45 78 70 72 43 6f 64 65 43 6f 6e 73 74 61  e3ExprCodeConsta
20250 6e 74 73 28 70 50 61 72 73 65 2c 20 70 57 68 65  nts(pParse, pWhe
20260 72 65 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69  re);.  whereSpli
20270 74 28 70 57 43 2c 20 70 57 68 65 72 65 2c 20 54  t(pWC, pWhere, T
20280 4b 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f  K_AND);.    .  /
20290 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20  * Special case: 
202a0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
202b0 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e  hat is constant.
202c0 20 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20    Evaluate the. 
202d0 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61   ** expression a
202e0 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f  nd either jump o
202f0 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63  ver all of the c
20300 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75  ode or fall thru
20310 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68  ..  */.  if( pWh
20320 65 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74  ere && (pTabList
20330 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c  ->nSrc==0 || sql
20340 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
20350 6e 74 4e 6f 74 4a 6f 69 6e 28 70 57 68 65 72 65  ntNotJoin(pWhere
20360 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
20370 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
20380 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
20390 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 53 51 4c  nfo->iBreak, SQL
203a0 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
203b0 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
203c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 73 73 69 67  .  }..  /* Assig
203d0 6e 20 61 20 62 69 74 20 66 72 6f 6d 20 74 68 65  n a bit from the
203e0 20 62 69 74 6d 61 73 6b 20 74 6f 20 65 76 65 72   bitmask to ever
203f0 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 46 52  y term in the FR
20400 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
20410 20 20 2a 2a 20 57 68 65 6e 20 61 73 73 69 67 6e    ** When assign
20420 69 6e 67 20 62 69 74 6d 61 73 6b 20 76 61 6c 75  ing bitmask valu
20430 65 73 20 74 6f 20 46 52 4f 4d 20 63 6c 61 75 73  es to FROM claus
20440 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 6d 75  e cursors, it mu
20450 73 74 20 62 65 0a 20 20 2a 2a 20 74 68 65 20 63  st be.  ** the c
20460 61 73 65 20 74 68 61 74 20 69 66 20 58 20 69 73  ase that if X is
20470 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f 72   the bitmask for
20480 20 74 68 65 20 4e 2d 74 68 20 46 52 4f 4d 20 63   the N-th FROM c
20490 6c 61 75 73 65 20 74 65 72 6d 20 74 68 65 6e 0a  lause term then.
204a0 20 20 2a 2a 20 74 68 65 20 62 69 74 6d 61 73 6b    ** the bitmask
204b0 20 66 6f 72 20 61 6c 6c 20 46 52 4f 4d 20 63 6c   for all FROM cl
204c0 61 75 73 65 20 74 65 72 6d 73 20 74 6f 20 74 68  ause terms to th
204d0 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 4e 2d  e left of the N-
204e0 74 68 20 74 65 72 6d 0a 20 20 2a 2a 20 69 73 20  th term.  ** is 
204f0 28 58 2d 31 29 2e 20 20 20 41 6e 20 65 78 70 72  (X-1).   An expr
20500 65 73 73 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  ession from the 
20510 4f 4e 20 63 6c 61 75 73 65 20 6f 66 20 61 20 4c  ON clause of a L
20520 45 46 54 20 4a 4f 49 4e 20 63 61 6e 20 75 73 65  EFT JOIN can use
20530 0a 20 20 2a 2a 20 69 74 73 20 45 78 70 72 2e 69  .  ** its Expr.i
20540 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 20 76  RightJoinTable v
20550 61 6c 75 65 20 74 6f 20 66 69 6e 64 20 74 68 65  alue to find the
20560 20 62 69 74 6d 61 73 6b 20 6f 66 20 74 68 65 20   bitmask of the 
20570 72 69 67 68 74 20 74 61 62 6c 65 0a 20 20 2a 2a  right table.  **
20580 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 53   of the join.  S
20590 75 62 74 72 61 63 74 69 6e 67 20 6f 6e 65 20 66  ubtracting one f
205a0 72 6f 6d 20 74 68 65 20 72 69 67 68 74 20 74 61  rom the right ta
205b0 62 6c 65 20 62 69 74 6d 61 73 6b 20 67 69 76 65  ble bitmask give
205c0 73 20 61 0a 20 20 2a 2a 20 62 69 74 6d 61 73 6b  s a.  ** bitmask
205d0 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65 73 20   for all tables 
205e0 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74  to the left of t
205f0 68 65 20 6a 6f 69 6e 2e 20 20 4b 6e 6f 77 69 6e  he join.  Knowin
20600 67 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20  g the bitmask.  
20610 2a 2a 20 66 6f 72 20 61 6c 6c 20 74 61 62 6c 65  ** for all table
20620 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
20630 20 61 20 6c 65 66 74 20 6a 6f 69 6e 20 69 73 20   a left join is 
20640 69 6d 70 6f 72 74 61 6e 74 2e 20 20 54 69 63 6b  important.  Tick
20650 65 74 20 23 33 30 31 35 2e 0a 20 20 2a 2a 0a 20  et #3015..  **. 
20660 20 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68   ** Configure th
20670 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 76 6d  e WhereClause.vm
20680 61 73 6b 20 76 61 72 69 61 62 6c 65 20 73 6f 20  ask variable so 
20690 74 68 61 74 20 62 69 74 73 20 74 68 61 74 20 63  that bits that c
206a0 6f 72 72 65 73 70 6f 6e 64 0a 20 20 2a 2a 20 74  orrespond.  ** t
206b0 6f 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  o virtual table 
206c0 63 75 72 73 6f 72 73 20 61 72 65 20 73 65 74 2e  cursors are set.
206d0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
206e0 20 73 65 6c 65 63 74 69 76 65 6c 79 20 64 69 73   selectively dis
206f0 61 62 6c 65 20 0a 20 20 2a 2a 20 74 68 65 20 4f  able .  ** the O
20700 52 2d 74 6f 2d 49 4e 20 74 72 61 6e 73 66 6f 72  R-to-IN transfor
20710 6d 61 74 69 6f 6e 20 69 6e 20 65 78 70 72 41 6e  mation in exprAn
20720 61 6c 79 7a 65 4f 72 54 65 72 6d 28 29 2e 20 49  alyzeOrTerm(). I
20730 74 20 69 73 20 6e 6f 74 20 68 65 6c 70 66 75 6c  t is not helpful
20740 20 0a 20 20 2a 2a 20 77 69 74 68 20 76 69 72 74   .  ** with virt
20750 75 61 6c 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ual tables..  */
20760 0a 20 20 61 73 73 65 72 74 28 20 70 57 43 2d 3e  .  assert( pWC->
20770 76 6d 61 73 6b 3d 3d 30 20 26 26 20 70 4d 61 73  vmask==0 && pMas
20780 6b 53 65 74 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  kSet->n==0 );.  
20790 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
207a0 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b  ist->nSrc; i++){
207b0 0a 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28  .    createMask(
207c0 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  pMaskSet, pTabLi
207d0 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
207e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
207f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
20800 42 4c 45 0a 20 20 20 20 69 66 28 20 41 4c 57 41  BLE.    if( ALWA
20810 59 53 28 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69  YS(pTabList->a[i
20820 5d 2e 70 54 61 62 29 20 26 26 20 49 73 56 69 72  ].pTab) && IsVir
20830 74 75 61 6c 28 70 54 61 62 4c 69 73 74 2d 3e 61  tual(pTabList->a
20840 5b 69 5d 2e 70 54 61 62 29 20 29 7b 0a 20 20 20  [i].pTab) ){.   
20850 20 20 20 70 57 43 2d 3e 76 6d 61 73 6b 20 7c 3d     pWC->vmask |=
20860 20 28 28 42 69 74 6d 61 73 6b 29 31 20 3c 3c 20   ((Bitmask)1 << 
20870 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  i);.    }.#endif
20880 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45  .  }.#ifndef NDE
20890 42 55 47 0a 20 20 7b 0a 20 20 20 20 42 69 74 6d  BUG.  {.    Bitm
208a0 61 73 6b 20 74 6f 54 68 65 4c 65 66 74 20 3d 20  ask toTheLeft = 
208b0 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
208c0 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
208d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 69  ; i++){.      Bi
208e0 74 6d 61 73 6b 20 6d 20 3d 20 67 65 74 4d 61 73  tmask m = getMas
208f0 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62  k(pMaskSet, pTab
20900 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73  List->a[i].iCurs
20910 6f 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  or);.      asser
20920 74 28 20 28 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c  t( (m-1)==toTheL
20930 65 66 74 20 29 3b 0a 20 20 20 20 20 20 74 6f 54  eft );.      toT
20940 68 65 4c 65 66 74 20 7c 3d 20 6d 3b 0a 20 20 20  heLeft |= m;.   
20950 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
20960 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20   /* Analyze all 
20970 6f 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73  of the subexpres
20980 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61  sions.  Note tha
20990 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20  t exprAnalyze() 
209a0 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e  might.  ** add n
209b0 65 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73  ew virtual terms
209c0 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
209d0 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
209e0 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20  e.  We do not.  
209f0 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79  ** want to analy
20a00 7a 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c  ze these virtual
20a10 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74   terms, so start
20a20 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68   analyzing at th
20a30 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77  e end.  ** and w
20a40 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74  ork forward so t
20a50 68 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69  hat the added vi
20a60 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20  rtual terms are 
20a70 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e  never processed.
20a80 0a 20 20 2a 2f 0a 20 20 65 78 70 72 41 6e 61 6c  .  */.  exprAnal
20a90 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
20aa0 20 70 57 43 29 3b 0a 20 20 69 66 28 20 64 62 2d   pWC);.  if( db-
20ab0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
20ac0 0a 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42  .    goto whereB
20ad0 65 67 69 6e 45 72 72 6f 72 3b 0a 20 20 7d 0a 0a  eginError;.  }..
20ae0 20 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62    /* Chose the b
20af0 65 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65  est index to use
20b00 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
20b10 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
20b20 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  se..  **.  ** Th
20b30 69 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e  is loop fills in
20b40 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
20b50 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ields:.  **.  **
20b60 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70     pWInfo->a[].p
20b70 49 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64  Idx      The ind
20b80 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  ex to use for th
20b90 69 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  is level of the 
20ba0 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49  loop..  **   pWI
20bb0 6e 66 6f 2d 3e 61 5b 5d 2e 77 73 46 6c 61 67 73  nfo->a[].wsFlags
20bc0 20 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61     WHERE_xxx fla
20bd0 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
20be0 74 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70  th pIdx.  **   p
20bf0 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20  WInfo->a[].nEq  
20c00 20 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20       The number 
20c10 6f 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e  of == and IN con
20c20 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20  straints.  **   
20c30 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f  pWInfo->a[].iFro
20c40 6d 20 20 20 20 20 57 68 69 63 68 20 74 65 72 6d  m     Which term
20c50 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
20c60 75 73 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64  use is being cod
20c70 65 64 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ed.  **   pWInfo
20c80 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20  ->a[].iTabCur   
20c90 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
20ca0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
20cb0 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57   table.  **   pW
20cc0 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75  Info->a[].iIdxCu
20cd0 72 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72  r   The VDBE cur
20ce0 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
20cf0 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
20d00 3e 61 5b 5d 2e 70 54 65 72 6d 20 20 20 20 20 57  >a[].pTerm     W
20d10 68 65 6e 20 77 73 46 6c 61 67 73 3d 3d 57 4f 5f  hen wsFlags==WO_
20d20 4f 52 2c 20 74 68 65 20 4f 52 2d 63 6c 61 75 73  OR, the OR-claus
20d30 65 20 74 65 72 6d 0a 20 20 2a 2a 0a 20 20 2a 2a  e term.  **.  **
20d40 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20   This loop also 
20d50 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65 20  figures out the 
20d60 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66  nesting order of
20d70 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
20d80 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e  ROM.  ** clause.
20d90 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
20da0 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
20db0 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
20dc0 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
20dd0 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
20de0 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b    andFlags = ~0;
20df0 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22  .  WHERETRACE(("
20e00 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74  *** Optimizer St
20e10 61 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20  art ***\n"));.  
20e20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70  for(i=iFrom=0, p
20e30 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
20e40 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
20e50 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
20e60 29 7b 0a 20 20 20 20 57 68 65 72 65 43 6f 73 74  ){.    WhereCost
20e70 20 62 65 73 74 50 6c 61 6e 3b 20 20 20 20 20 20   bestPlan;      
20e80 20 20 20 2f 2a 20 4d 6f 73 74 20 65 66 66 69 63     /* Most effic
20e90 69 65 6e 74 20 70 6c 61 6e 20 73 65 65 6e 20 73  ient plan seen s
20ea0 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 49 6e 64  o far */.    Ind
20eb0 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
20ec0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
20ed0 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
20ee0 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
20ef0 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20      int j;      
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
20f20 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20  ver FROM tables 
20f30 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a  */.    int bestJ
20f40 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
20f50 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
20f60 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d  of j */.    Bitm
20f70 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20  ask m;          
20f80 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
20f90 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f  sk value for j o
20fa0 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69  r bestJ */.    i
20fb0 6e 74 20 69 73 4f 70 74 69 6d 61 6c 3b 20 20 20  nt isOptimal;   
20fc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
20fd0 65 72 61 74 6f 72 20 66 6f 72 20 6f 70 74 69 6d  erator for optim
20fe0 61 6c 2f 6e 6f 6e 2d 6f 70 74 69 6d 61 6c 20 73  al/non-optimal s
20ff0 65 61 72 63 68 20 2a 2f 0a 0a 20 20 20 20 6d 65  earch */..    me
21000 6d 73 65 74 28 26 62 65 73 74 50 6c 61 6e 2c 20  mset(&bestPlan, 
21010 30 2c 20 73 69 7a 65 6f 66 28 62 65 73 74 50 6c  0, sizeof(bestPl
21020 61 6e 29 29 3b 0a 20 20 20 20 62 65 73 74 50 6c  an));.    bestPl
21030 61 6e 2e 72 43 6f 73 74 20 3d 20 53 51 4c 49 54  an.rCost = SQLIT
21040 45 5f 42 49 47 5f 44 42 4c 3b 0a 0a 20 20 20 20  E_BIG_DBL;..    
21050 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
21060 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 65 6e  the remaining en
21070 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 52 4f  tries in the FRO
21080 4d 20 63 6c 61 75 73 65 20 74 6f 20 66 69 6e 64  M clause to find
21090 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74   the.    ** next
210a0 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 20 54 68   nested loop. Th
210b0 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  e FROM clause en
210c0 74 72 69 65 73 20 6d 61 79 20 62 65 20 69 74 65  tries may be ite
210d0 72 61 74 65 64 20 74 68 72 6f 75 67 68 0a 20 20  rated through.  
210e0 20 20 2a 2a 20 65 69 74 68 65 72 20 6f 6e 63 65    ** either once
210f0 20 6f 72 20 74 77 69 63 65 2e 20 0a 20 20 20 20   or twice. .    
21100 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66 69  **.    ** The fi
21110 72 73 74 20 69 74 65 72 61 74 69 6f 6e 2c 20 77  rst iteration, w
21120 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 70  hich is always p
21130 65 72 66 6f 72 6d 65 64 2c 20 73 65 61 72 63 68  erformed, search
21140 65 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20 2a  es for the.    *
21150 2a 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e  * FROM clause en
21160 74 72 79 20 74 68 61 74 20 70 65 72 6d 69 74 73  try that permits
21170 20 74 68 65 20 6c 6f 77 65 73 74 2d 63 6f 73 74   the lowest-cost
21180 2c 20 22 6f 70 74 69 6d 61 6c 22 20 73 63 61 6e  , "optimal" scan
21190 2e 20 49 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  . In.    ** this
211a0 20 63 6f 6e 74 65 78 74 20 61 6e 20 6f 70 74 69   context an opti
211b0 6d 61 6c 20 73 63 61 6e 20 69 73 20 6f 6e 65 20  mal scan is one 
211c0 74 68 61 74 20 75 73 65 73 20 74 68 65 20 73 61  that uses the sa
211d0 6d 65 20 73 74 72 61 74 65 67 79 0a 20 20 20 20  me strategy.    
211e0 2a 2a 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ** for the given
211f0 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 65 6e 74   FROM clause ent
21200 72 79 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  ry as would be s
21210 65 6c 65 63 74 65 64 20 69 66 20 74 68 65 20 65  elected if the e
21220 6e 74 72 79 0a 20 20 20 20 2a 2a 20 77 65 72 65  ntry.    ** were
21230 20 75 73 65 64 20 61 73 20 74 68 65 20 69 6e 6e   used as the inn
21240 65 72 6d 6f 73 74 20 6e 65 73 74 65 64 20 6c 6f  ermost nested lo
21250 6f 70 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  op.  In other wo
21260 72 64 73 2c 20 61 20 74 61 62 6c 65 0a 20 20 20  rds, a table.   
21270 20 2a 2a 20 69 73 20 63 68 6f 73 65 6e 20 73 75   ** is chosen su
21280 63 68 20 74 68 61 74 20 74 68 65 20 63 6f 73 74  ch that the cost
21290 20 6f 66 20 72 75 6e 6e 69 6e 67 20 74 68 61 74   of running that
212a0 20 74 61 62 6c 65 20 63 61 6e 6e 6f 74 20 62 65   table cannot be
212b0 20 72 65 64 75 63 65 64 0a 20 20 20 20 2a 2a 20   reduced.    ** 
212c0 62 79 20 77 61 69 74 69 6e 67 20 66 6f 72 20 6f  by waiting for o
212d0 74 68 65 72 20 74 61 62 6c 65 73 20 74 6f 20 72  ther tables to r
212e0 75 6e 20 66 69 72 73 74 2e 0a 20 20 20 20 2a 2a  un first..    **
212f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 65 63 6f  .    ** The seco
21300 6e 64 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20  nd iteration is 
21310 6f 6e 6c 79 20 70 65 72 66 6f 72 6d 65 64 20 69  only performed i
21320 66 20 6e 6f 20 6f 70 74 69 6d 61 6c 20 73 63 61  f no optimal sca
21330 6e 20 73 74 72 61 74 65 67 69 65 73 0a 20 20 20  n strategies.   
21340 20 2a 2a 20 77 65 72 65 20 66 6f 75 6e 64 20 62   ** were found b
21350 79 20 74 68 65 20 66 69 72 73 74 2e 20 54 68 69  y the first. Thi
21360 73 20 69 74 65 72 61 74 69 6f 6e 20 69 73 20 75  s iteration is u
21370 73 65 64 20 74 6f 20 73 65 61 72 63 68 20 66 6f  sed to search fo
21380 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 77  r the.    ** low
21390 65 73 74 20 63 6f 73 74 20 73 63 61 6e 20 6f 76  est cost scan ov
213a0 65 72 61 6c 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  erall..    **.  
213b0 20 20 2a 2a 20 50 72 65 76 69 6f 75 73 20 76 65    ** Previous ve
213c0 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65  rsions of SQLite
213d0 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e 6c 79 20   performed only 
213e0 74 68 65 20 73 65 63 6f 6e 64 20 69 74 65 72 61  the second itera
213f0 74 69 6f 6e 20 2d 0a 20 20 20 20 2a 2a 20 74 68  tion -.    ** th
21400 65 20 6e 65 78 74 20 6f 75 74 65 72 6d 6f 73 74  e next outermost
21410 20 6c 6f 6f 70 20 77 61 73 20 61 6c 77 61 79 73   loop was always
21420 20 74 68 61 74 20 77 69 74 68 20 74 68 65 20 6c   that with the l
21430 6f 77 65 73 74 20 6f 76 65 72 61 6c 6c 0a 20 20  owest overall.  
21440 20 20 2a 2a 20 63 6f 73 74 2e 20 48 6f 77 65 76    ** cost. Howev
21450 65 72 2c 20 74 68 69 73 20 6d 65 61 6e 74 20 74  er, this meant t
21460 68 61 74 20 53 51 4c 69 74 65 20 63 6f 75 6c 64  hat SQLite could
21470 20 73 65 6c 65 63 74 20 74 68 65 20 77 72 6f 6e   select the wron
21480 67 20 70 6c 61 6e 0a 20 20 20 20 2a 2a 20 66 6f  g plan.    ** fo
21490 72 20 73 63 72 69 70 74 73 20 73 75 63 68 20 61  r scripts such a
214a0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  s the following:
214b0 0a 20 20 20 20 2a 2a 20 20 20 0a 20 20 20 20 2a  .    **   .    *
214c0 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45  *   CREATE TABLE
214d0 20 74 31 28 61 2c 20 62 29 3b 20 0a 20 20 20 20   t1(a, b); .    
214e0 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  **   CREATE TABL
214f0 45 20 74 32 28 63 2c 20 64 29 3b 0a 20 20 20 20  E t2(c, d);.    
21500 2a 2a 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52  **   SELECT * FR
21510 4f 4d 20 74 32 2c 20 74 31 20 57 48 45 52 45 20  OM t2, t1 WHERE 
21520 74 32 2e 72 6f 77 69 64 20 3d 20 74 31 2e 61 3b  t2.rowid = t1.a;
21530 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
21540 68 65 20 62 65 73 74 20 73 74 72 61 74 65 67 79  he best strategy
21550 20 69 73 20 74 6f 20 69 74 65 72 61 74 65 20 74   is to iterate t
21560 68 72 6f 75 67 68 20 74 61 62 6c 65 20 74 31 20  hrough table t1 
21570 66 69 72 73 74 2e 20 48 6f 77 65 76 65 72 20 69  first. However i
21580 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  t.    ** is not 
21590 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 74 65  possible to dete
215a0 72 6d 69 6e 65 20 74 68 69 73 20 77 69 74 68 20  rmine this with 
215b0 61 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20  a simple greedy 
215c0 61 6c 67 6f 72 69 74 68 6d 2e 0a 20 20 20 20 2a  algorithm..    *
215d0 2a 20 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  * However, since
215e0 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 6c   the cost of a l
215f0 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
21600 67 68 20 74 61 62 6c 65 20 74 32 20 69 73 20 74  gh table t2 is t
21610 68 65 20 73 61 6d 65 20 0a 20 20 20 20 2a 2a 20  he same .    ** 
21620 61 73 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61  as the cost of a
21630 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72   linear scan thr
21640 6f 75 67 68 20 74 61 62 6c 65 20 74 31 2c 20 61  ough table t1, a
21650 20 73 69 6d 70 6c 65 20 67 72 65 65 64 79 20 0a   simple greedy .
21660 20 20 20 20 2a 2a 20 61 6c 67 6f 72 69 74 68 6d      ** algorithm
21670 20 6d 61 79 20 63 68 6f 6f 73 65 20 74 6f 20 75   may choose to u
21680 73 65 20 74 32 20 66 6f 72 20 74 68 65 20 6f 75  se t2 for the ou
21690 74 65 72 20 6c 6f 6f 70 2c 20 77 68 69 63 68 20  ter loop, which 
216a0 69 73 20 61 20 6d 75 63 68 0a 20 20 20 20 2a 2a  is a much.    **
216b0 20 63 6f 73 74 6c 69 65 72 20 61 70 70 72 6f 61   costlier approa
216c0 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ch..    */.    f
216d0 6f 72 28 69 73 4f 70 74 69 6d 61 6c 3d 31 3b 20  or(isOptimal=1; 
216e0 69 73 4f 70 74 69 6d 61 6c 3e 3d 30 20 26 26 20  isOptimal>=0 && 
216f0 62 65 73 74 4a 3c 30 3b 20 69 73 4f 70 74 69 6d  bestJ<0; isOptim
21700 61 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 42 69 74  al--){.      Bit
21710 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 28 69 73 4f  mask mask = (isO
21720 70 74 69 6d 61 6c 20 3f 20 30 20 3a 20 6e 6f 74  ptimal ? 0 : not
21730 52 65 61 64 79 29 3b 0a 20 20 20 20 20 20 61 73  Ready);.      as
21740 73 65 72 74 28 20 28 70 54 61 62 4c 69 73 74 2d  sert( (pTabList-
21750 3e 6e 53 72 63 2d 69 46 72 6f 6d 29 3e 31 20 7c  >nSrc-iFrom)>1 |
21760 7c 20 69 73 4f 70 74 69 6d 61 6c 20 29 3b 0a 20  | isOptimal );. 
21770 20 20 20 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d       for(j=iFrom
21780 2c 20 70 54 61 62 49 74 65 6d 3d 26 70 54 61 62  , pTabItem=&pTab
21790 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54  List->a[j]; j<pT
217a0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b  abList->nSrc; j+
217b0 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a  +, pTabItem++){.
217c0 20 20 20 20 20 20 20 20 69 6e 74 20 64 6f 4e 6f          int doNo
217d0 74 52 65 6f 72 64 65 72 3b 20 20 20 20 2f 2a 20  tReorder;    /* 
217e0 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62  True if this tab
217f0 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  le should not be
21800 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20   reordered */.  
21810 20 20 20 20 20 20 57 68 65 72 65 43 6f 73 74 20        WhereCost 
21820 73 43 6f 73 74 3b 20 20 20 20 20 2f 2a 20 43 6f  sCost;     /* Co
21830 73 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  st information f
21840 72 6f 6d 20 62 65 73 74 5b 56 69 72 74 75 61 6c  rom best[Virtual
21850 5d 49 6e 64 65 78 28 29 20 2a 2f 0a 20 20 20 20  ]Index() */.    
21860 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f      ExprList *pO
21870 72 64 65 72 42 79 3b 20 20 2f 2a 20 4f 52 44 45  rderBy;  /* ORDE
21880 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20  R BY clause for 
21890 69 6e 64 65 78 20 74 6f 20 6f 70 74 69 6d 69 7a  index to optimiz
218a0 65 20 2a 2f 0a 20 20 0a 20 20 20 20 20 20 20 20  e */.  .        
218b0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20  doNotReorder =  
218c0 28 70 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74  (pTabItem->joint
218d0 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a  ype & (JT_LEFT|J
218e0 54 5f 43 52 4f 53 53 29 29 21 3d 30 3b 0a 20 20  T_CROSS))!=0;.  
218f0 20 20 20 20 20 20 69 66 28 20 6a 21 3d 69 46 72        if( j!=iFr
21900 6f 6d 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64  om && doNotReord
21910 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  er ) break;.    
21920 20 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28      m = getMask(
21930 70 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74  pMaskSet, pTabIt
21940 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20  em->iCursor);.  
21950 20 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 6e        if( (m & n
21960 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20  otReady)==0 ){. 
21970 20 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d           if( j==
21980 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
21990 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
219a0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
219b0 20 20 20 20 20 20 20 70 4f 72 64 65 72 42 79 20         pOrderBy 
219c0 3d 20 28 28 69 3d 3d 30 20 26 26 20 70 70 4f 72  = ((i==0 && ppOr
219d0 64 65 72 42 79 20 29 3f 2a 70 70 4f 72 64 65 72  derBy )?*ppOrder
219e0 42 79 3a 30 29 3b 0a 20 20 0a 20 20 20 20 20 20  By:0);.  .      
219f0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
21a00 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e  em->pTab );.#ifn
21a10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21a20 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
21a30 20 20 20 20 20 69 66 28 20 49 73 56 69 72 74 75       if( IsVirtu
21a40 61 6c 28 70 54 61 62 49 74 65 6d 2d 3e 70 54 61  al(pTabItem->pTa
21a50 62 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  b) ){.          
21a60 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
21a70 66 6f 20 2a 2a 70 70 20 3d 20 26 70 57 49 6e 66  fo **pp = &pWInf
21a80 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f  o->a[j].pIdxInfo
21a90 3b 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74  ;.          best
21aa0 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61  VirtualIndex(pPa
21ab0 72 73 65 2c 20 70 57 43 2c 20 70 54 61 62 49 74  rse, pWC, pTabIt
21ac0 65 6d 2c 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72  em, mask, pOrder
21ad0 42 79 2c 20 26 73 43 6f 73 74 2c 20 70 70 29 3b  By, &sCost, pp);
21ae0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 0a  .        }else .
21af0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7b  #endif.        {
21b00 0a 20 20 20 20 20 20 20 20 20 20 62 65 73 74 42  .          bestB
21b10 74 72 65 65 49 6e 64 65 78 28 70 50 61 72 73 65  treeIndex(pParse
21b20 2c 20 70 57 43 2c 20 70 54 61 62 49 74 65 6d 2c  , pWC, pTabItem,
21b30 20 6d 61 73 6b 2c 20 70 4f 72 64 65 72 42 79 2c   mask, pOrderBy,
21b40 20 26 73 43 6f 73 74 29 3b 0a 20 20 20 20 20 20   &sCost);.      
21b50 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
21b60 72 74 28 20 69 73 4f 70 74 69 6d 61 6c 20 7c 7c  rt( isOptimal ||
21b70 20 28 73 43 6f 73 74 2e 75 73 65 64 26 6e 6f 74   (sCost.used&not
21b80 52 65 61 64 79 29 3d 3d 30 20 29 3b 0a 0a 20 20  Ready)==0 );..  
21b90 20 20 20 20 20 20 69 66 28 20 28 73 43 6f 73 74        if( (sCost
21ba0 2e 75 73 65 64 26 6e 6f 74 52 65 61 64 79 29 3d  .used&notReady)=
21bb0 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  =0.         && (
21bc0 6a 3d 3d 69 46 72 6f 6d 20 7c 7c 20 73 43 6f 73  j==iFrom || sCos
21bd0 74 2e 72 43 6f 73 74 3c 62 65 73 74 50 6c 61 6e  t.rCost<bestPlan
21be0 2e 72 43 6f 73 74 29 20 0a 20 20 20 20 20 20 20  .rCost) .       
21bf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 65   ){.          be
21c00 73 74 50 6c 61 6e 20 3d 20 73 43 6f 73 74 3b 0a  stPlan = sCost;.
21c10 20 20 20 20 20 20 20 20 20 20 62 65 73 74 4a 20            bestJ 
21c20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = j;.        }. 
21c30 20 20 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74         if( doNot
21c40 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b  Reorder ) break;
21c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
21c60 20 20 20 61 73 73 65 72 74 28 20 62 65 73 74 4a     assert( bestJ
21c70 3e 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  >=0 );.    asser
21c80 74 28 20 6e 6f 74 52 65 61 64 79 20 26 20 67 65  t( notReady & ge
21c90 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20  tMask(pMaskSet, 
21ca0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
21cb0 4a 5d 2e 69 43 75 72 73 6f 72 29 20 29 3b 0a 20  J].iCursor) );. 
21cc0 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
21cd0 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 73 65  *** Optimizer se
21ce0 6c 65 63 74 73 20 74 61 62 6c 65 20 25 64 20 66  lects table %d f
21cf0 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62  or loop %d\n", b
21d00 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20  estJ,.          
21d10 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
21d20 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65  a));.    if( (be
21d30 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e 77 73 46 6c  stPlan.plan.wsFl
21d40 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
21d50 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
21d60 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
21d70 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
21d80 61 67 73 20 26 3d 20 62 65 73 74 50 6c 61 6e 2e  ags &= bestPlan.
21d90 70 6c 61 6e 2e 77 73 46 6c 61 67 73 3b 0a 20 20  plan.wsFlags;.  
21da0 20 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 20 3d    pLevel->plan =
21db0 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 3b 0a   bestPlan.plan;.
21dc0 20 20 20 20 69 66 28 20 62 65 73 74 50 6c 61 6e      if( bestPlan
21dd0 2e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  .plan.wsFlags & 
21de0 57 48 45 52 45 5f 49 4e 44 45 58 45 44 20 29 7b  WHERE_INDEXED ){
21df0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  .      pLevel->i
21e00 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d  IdxCur = pParse-
21e10 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c  >nTab++;.    }el
21e20 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
21e30 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a  ->iIdxCur = -1;.
21e40 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61      }.    notRea
21e50 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 70  dy &= ~getMask(p
21e60 4d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  MaskSet, pTabLis
21e70 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72  t->a[bestJ].iCur
21e80 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c  sor);.    pLevel
21e90 2d 3e 69 46 72 6f 6d 20 3d 20 28 75 38 29 62 65  ->iFrom = (u8)be
21ea0 73 74 4a 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  stJ;..    /* Che
21eb0 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 20 74  ck that if the t
21ec0 61 62 6c 65 20 73 63 61 6e 6e 65 64 20 62 79 20  able scanned by 
21ed0 74 68 69 73 20 6c 6f 6f 70 20 69 74 65 72 61 74  this loop iterat
21ee0 69 6f 6e 20 68 61 64 20 61 6e 0a 20 20 20 20 2a  ion had an.    *
21ef0 2a 20 49 4e 44 45 58 45 44 20 42 59 20 63 6c 61  * INDEXED BY cla
21f00 75 73 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  use attached to 
21f10 69 74 2c 20 74 68 61 74 20 74 68 65 20 6e 61 6d  it, that the nam
21f20 65 64 20 69 6e 64 65 78 20 69 73 20 62 65 69 6e  ed index is bein
21f30 67 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 66 6f  g.    ** used fo
21f40 72 20 74 68 65 20 73 63 61 6e 2e 20 49 66 20 6e  r the scan. If n
21f50 6f 74 2c 20 74 68 65 6e 20 71 75 65 72 79 20 63  ot, then query c
21f60 6f 6d 70 69 6c 61 74 69 6f 6e 20 68 61 73 20 66  ompilation has f
21f70 61 69 6c 65 64 2e 0a 20 20 20 20 2a 2a 20 52 65  ailed..    ** Re
21f80 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
21f90 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 20 3d     */.    pIdx =
21fa0 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73   pTabList->a[bes
21fb0 74 4a 5d 2e 70 49 6e 64 65 78 3b 0a 20 20 20 20  tJ].pIndex;.    
21fc0 69 66 28 20 70 49 64 78 20 29 7b 0a 20 20 20 20  if( pIdx ){.    
21fd0 20 20 69 66 28 20 28 62 65 73 74 50 6c 61 6e 2e    if( (bestPlan.
21fe0 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57  plan.wsFlags & W
21ff0 48 45 52 45 5f 49 4e 44 45 58 45 44 29 3d 3d 30  HERE_INDEXED)==0
22000 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22010 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
22020 73 65 2c 20 22 63 61 6e 6e 6f 74 20 75 73 65 20  se, "cannot use 
22030 69 6e 64 65 78 3a 20 25 73 22 2c 20 70 49 64 78  index: %s", pIdx
22040 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
22050 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
22060 6e 45 72 72 6f 72 3b 0a 20 20 20 20 20 20 7d 65  nError;.      }e
22070 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
22080 49 66 20 61 6e 20 49 4e 44 45 58 45 44 20 42 59  If an INDEXED BY
22090 20 63 6c 61 75 73 65 20 69 73 20 75 73 65 64 2c   clause is used,
220a0 20 74 68 65 20 62 65 73 74 49 6e 64 65 78 28 29   the bestIndex()
220b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20   function is.   
220c0 20 20 20 20 20 2a 2a 20 67 75 61 72 61 6e 74 65       ** guarante
220d0 65 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 69  ed to find the i
220e0 6e 64 65 78 20 73 70 65 63 69 66 69 65 64 20 69  ndex specified i
220f0 6e 20 74 68 65 20 49 4e 44 45 58 45 44 20 42 59  n the INDEXED BY
22100 20 63 6c 61 75 73 65 0a 20 20 20 20 20 20 20 20   clause.        
22110 2a 2a 20 69 66 20 69 74 20 66 69 6e 64 20 61 6e  ** if it find an
22120 20 69 6e 64 65 78 20 61 74 20 61 6c 6c 2e 20 2a   index at all. *
22130 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  /.        assert
22140 28 20 62 65 73 74 50 6c 61 6e 2e 70 6c 61 6e 2e  ( bestPlan.plan.
22150 75 2e 70 49 64 78 3d 3d 70 49 64 78 20 29 3b 0a  u.pIdx==pIdx );.
22160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
22170 7d 0a 20 20 57 48 45 52 45 54 52 41 43 45 28 28  }.  WHERETRACE((
22180 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46  "*** Optimizer F
22190 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29  inished ***\n"))
221a0 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
221b0 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
221c0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
221d0 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 45  goto whereBeginE
221e0 72 72 6f 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rror;.  }..  /* 
221f0 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75 65  If the total que
22200 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73 20  ry only selects 
22210 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74 68  a single row, th
22220 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  en the ORDER BY.
22230 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 69    ** clause is i
22240 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f 0a  rrelevant..  */.
22250 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73 20    if( (andFlags 
22260 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29 21  & WHERE_UNIQUE)!
22270 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 20  =0 && ppOrderBy 
22280 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72 42  ){.    *ppOrderB
22290 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  y = 0;.  }..  /*
222a0 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69   If the caller i
222b0 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44  s an UPDATE or D
222c0 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 20  ELETE statement 
222d0 74 68 61 74 20 69 73 20 72 65 71 75 65 73 74 69  that is requesti
222e0 6e 67 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  ng.  ** to use a
222f0 20 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69   one-pass algori
22300 74 68 6d 2c 20 64 65 74 65 72 6d 69 6e 65 20 69  thm, determine i
22310 66 20 74 68 69 73 20 69 73 20 61 70 70 72 6f 70  f this is approp
22320 72 69 61 74 65 2e 0a 20 20 2a 2a 20 54 68 65 20  riate..  ** The 
22330 6f 6e 65 2d 70 61 73 73 20 61 6c 67 6f 72 69 74  one-pass algorit
22340 68 6d 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 69 66  hm only works if
22350 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
22360 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20  e constraints.  
22370 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
22380 20 74 6f 20 75 70 64 61 74 65 20 61 20 73 69 6e   to update a sin
22390 67 6c 65 20 72 6f 77 2e 0a 20 20 2a 2f 0a 20 20  gle row..  */.  
223a0 61 73 73 65 72 74 28 20 28 77 63 74 72 6c 46 6c  assert( (wctrlFl
223b0 61 67 73 20 26 20 57 48 45 52 45 5f 4f 4e 45 50  ags & WHERE_ONEP
223c0 41 53 53 5f 44 45 53 49 52 45 44 29 3d 3d 30 20  ASS_DESIRED)==0 
223d0 7c 7c 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65  || pWInfo->nLeve
223e0 6c 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 28 77  l==1 );.  if( (w
223f0 63 74 72 6c 46 6c 61 67 73 20 26 20 57 48 45 52  ctrlFlags & WHER
22400 45 5f 4f 4e 45 50 41 53 53 5f 44 45 53 49 52 45  E_ONEPASS_DESIRE
22410 44 29 21 3d 30 20 26 26 20 28 61 6e 64 46 6c 61  D)!=0 && (andFla
22420 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55  gs & WHERE_UNIQU
22430 45 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 57 49  E)!=0 ){.    pWI
22440 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50 61 73 73 20 3d  nfo->okOnePass =
22450 20 31 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d 3e   1;.    pWInfo->
22460 61 5b 30 5d 2e 70 6c 61 6e 2e 77 73 46 6c 61 67  a[0].plan.wsFlag
22470 73 20 26 3d 20 7e 57 48 45 52 45 5f 49 44 58 5f  s &= ~WHERE_IDX_
22480 4f 4e 4c 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ONLY;.  }..  /* 
22490 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
224a0 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
224b0 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
224c0 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
224d0 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
224e0 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
224f0 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
22500 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
22510 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
22520 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
22530 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 66 6f  ier Goto */.  fo
22540 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
22550 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
22560 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
22570 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54  pLevel++){.    T
22580 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
22590 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65 6e  /* Table to open
225a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b   */.    int iDb;
225b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
225c0 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  x of database co
225d0 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69  ntaining table/i
225e0 6e 64 65 78 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ndex */..#ifndef
225f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
22600 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70 50 61  LAIN.    if( pPa
22610 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  rse->explain==2 
22620 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
22630 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72 75 63  Msg;.      struc
22640 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
22650 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  pItem = &pTabLis
22660 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
22670 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20  om];.      zMsg 
22680 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
22690 28 64 62 2c 20 22 54 41 42 4c 45 20 25 73 22 2c  (db, "TABLE %s",
226a0 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a   pItem->zName);.
226b0 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
226c0 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
226d0 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
226e0 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d  3MAppendf(db, zM
226f0 73 67 2c 20 22 25 73 20 41 53 20 25 73 22 2c 20  sg, "%s AS %s", 
22700 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c  zMsg, pItem->zAl
22710 69 61 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ias);.      }.  
22720 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
22730 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
22740 57 48 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d  WHERE_INDEXED)!=
22750 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73  0 ){.        zMs
22760 67 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65  g = sqlite3MAppe
22770 6e 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25  ndf(db, zMsg, "%
22780 73 20 57 49 54 48 20 49 4e 44 45 58 20 25 73 22  s WITH INDEX %s"
22790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 7a 4d 73  ,.           zMs
227a0 67 2c 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  g, pLevel->plan.
227b0 75 2e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a  u.pIdx->zName);.
227c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
227d0 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
227e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4d 55 4c  lags & WHERE_MUL
227f0 54 49 5f 4f 52 20 29 7b 0a 20 20 20 20 20 20 20  TI_OR ){.       
22800 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
22810 41 70 70 65 6e 64 66 28 64 62 2c 20 7a 4d 73 67  Appendf(db, zMsg
22820 2c 20 22 25 73 20 56 49 41 20 4d 55 4c 54 49 2d  , "%s VIA MULTI-
22830 49 4e 44 45 58 20 55 4e 49 4f 4e 22 2c 20 7a 4d  INDEX UNION", zM
22840 73 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sg);.      }else
22850 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
22860 6e 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45  n.wsFlags & (WHE
22870 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
22880 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
22890 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d  {.        zMsg =
228a0 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e 64 66   sqlite3MAppendf
228b0 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73 20 55  (db, zMsg, "%s U
228c0 53 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59  SING PRIMARY KEY
228d0 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20  ", zMsg);.      
228e0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
228f0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
22900 4c 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66  LE.      else if
22910 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e  ( (pLevel->plan.
22920 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  wsFlags & WHERE_
22930 56 49 52 54 55 41 4c 54 41 42 4c 45 29 21 3d 30  VIRTUALTABLE)!=0
22940 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
22950 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
22960 70 56 74 61 62 49 64 78 20 3d 20 70 4c 65 76 65  pVtabIdx = pLeve
22970 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 56 74 61 62 49  l->plan.u.pVtabI
22980 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67  dx;.        zMsg
22990 20 3d 20 73 71 6c 69 74 65 33 4d 41 70 70 65 6e   = sqlite3MAppen
229a0 64 66 28 64 62 2c 20 7a 4d 73 67 2c 20 22 25 73  df(db, zMsg, "%s
229b0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49   VIRTUAL TABLE I
229c0 4e 44 45 58 20 25 64 3a 25 73 22 2c 20 7a 4d 73  NDEX %d:%s", zMs
229d0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
229e0 20 20 20 20 20 20 20 70 56 74 61 62 49 64 78 2d         pVtabIdx-
229f0 3e 69 64 78 4e 75 6d 2c 20 70 56 74 61 62 49 64  >idxNum, pVtabId
22a00 78 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 20 20  x->idxStr);.    
22a10 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
22a20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61   if( pLevel->pla
22a30 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52  n.wsFlags & WHER
22a40 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20  E_ORDERBY ){.   
22a50 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
22a60 74 65 33 4d 41 70 70 65 6e 64 66 28 64 62 2c 20  te3MAppendf(db, 
22a70 7a 4d 73 67 2c 20 22 25 73 20 4f 52 44 45 52 20  zMsg, "%s ORDER 
22a80 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  BY", zMsg);.    
22a90 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
22aa0 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
22ab0 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c  P_Explain, i, pL
22ac0 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20  evel->iFrom, 0, 
22ad0 7a 4d 73 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43  zMsg, P4_DYNAMIC
22ae0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
22af0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  /* SQLITE_OMIT_E
22b00 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54  XPLAIN */.    pT
22b10 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
22b20 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
22b30 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d  rom];.    pTab =
22b40 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
22b50 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74  .    iDb = sqlit
22b60 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28  e3SchemaToIndex(
22b70 64 62 2c 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  db, pTab->pSchem
22b80 61 29 3b 0a 20 20 20 20 69 66 28 20 28 70 54 61  a);.    if( (pTa
22b90 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
22ba0 5f 45 70 68 65 6d 65 72 61 6c 29 21 3d 30 20 7c  _Ephemeral)!=0 |
22bb0 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
22bc0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
22bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22be0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
22bf0 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c   if( (pLevel->pl
22c00 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45  an.wsFlags & WHE
22c10 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  RE_VIRTUALTABLE)
22c20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  !=0 ){.      con
22c30 73 74 20 63 68 61 72 20 2a 70 56 54 61 62 20 3d  st char *pVTab =
22c40 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
22c50 71 6c 69 74 65 33 47 65 74 56 54 61 62 6c 65 28  qlite3GetVTable(
22c60 64 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20  db, pTab);.     
22c70 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
22c80 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
22c90 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
22ca0 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70  AddOp4(v, OP_VOp
22cb0 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 30 2c 20  en, iCur, 0, 0, 
22cc0 70 56 54 61 62 2c 20 50 34 5f 56 54 41 42 29 3b  pVTab, P4_VTAB);
22cd0 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
22ce0 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  f.    if( (pLeve
22cf0 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20  l->plan.wsFlags 
22d00 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  & WHERE_IDX_ONLY
22d10 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )==0.         &&
22d20 20 28 77 63 74 72 6c 46 6c 61 67 73 20 26 20 57   (wctrlFlags & W
22d30 48 45 52 45 5f 4f 4d 49 54 5f 4f 50 45 4e 29 3d  HERE_OMIT_OPEN)=
22d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
22d50 6f 70 20 3d 20 70 57 49 6e 66 6f 2d 3e 6f 6b 4f  op = pWInfo->okO
22d60 6e 65 50 61 73 73 20 3f 20 4f 50 5f 4f 70 65 6e  nePass ? OP_Open
22d70 57 72 69 74 65 20 3a 20 4f 50 5f 4f 70 65 6e 52  Write : OP_OpenR
22d80 65 61 64 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ead;.      sqlit
22d90 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50 61 72  e3OpenTable(pPar
22da0 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  se, pTabItem->iC
22db0 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54 61 62  ursor, iDb, pTab
22dc0 2c 20 6f 70 29 3b 0a 20 20 20 20 20 20 69 66 28  , op);.      if(
22dd0 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65 50   !pWInfo->okOneP
22de0 61 73 73 20 26 26 20 70 54 61 62 2d 3e 6e 43 6f  ass && pTab->nCo
22df0 6c 3c 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 20  l<BMS ){.       
22e00 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
22e10 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
22e20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
22e30 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
22e40 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
22e50 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
22e60 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 76  e3VdbeChangeP4(v
22e70 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
22e80 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 53  rentAddr(v)-1, S
22e90 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
22ea0 28 6e 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a  (n), P4_INT32);.
22eb0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
22ec0 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b  n<=pTab->nCol );
22ed0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
22ee0 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
22ef0 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73  3TableLock(pPars
22f00 65 2c 20 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e  e, iDb, pTab->tn
22f10 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61  um, 0, pTab->zNa
22f20 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
22f30 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d  Level->iTabCur =
22f40 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
22f50 6f 72 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65  or;.    if( (pLe
22f60 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67  vel->plan.wsFlag
22f70 73 20 26 20 57 48 45 52 45 5f 49 4e 44 45 58 45  s & WHERE_INDEXE
22f80 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 49  D)!=0 ){.      I
22f90 6e 64 65 78 20 2a 70 49 78 20 3d 20 70 4c 65 76  ndex *pIx = pLev
22fa0 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 3b  el->plan.u.pIdx;
22fb0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
22fc0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
22fd0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
22fe0 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 69  e, pIx);.      i
22ff0 6e 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65  nt iIdxCur = pLe
23000 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
23010 20 20 20 20 61 73 73 65 72 74 28 20 70 49 78 2d      assert( pIx-
23020 3e 70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e  >pSchema==pTab->
23030 70 53 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20  pSchema );.     
23040 20 61 73 73 65 72 74 28 20 69 49 64 78 43 75 72   assert( iIdxCur
23050 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  >=0 );.      sql
23060 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
23070 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
23080 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
23090 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230b0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
230c0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
230d0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
230e0 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
230f0 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
23100 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
23110 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
23120 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
23130 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
23140 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
23150 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
23160 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
23170 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
23180 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
23190 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
231a0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
231b0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
231c0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
231d0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
231e0 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
231f0 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
23200 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
23210 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
23220 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
23230 29 7b 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20  ){.    notReady 
23240 3d 20 63 6f 64 65 4f 6e 65 4c 6f 6f 70 53 74 61  = codeOneLoopSta
23250 72 74 28 70 57 49 6e 66 6f 2c 20 69 2c 20 77 63  rt(pWInfo, i, wc
23260 74 72 6c 46 6c 61 67 73 2c 20 6e 6f 74 52 65 61  trlFlags, notRea
23270 64 79 29 3b 0a 20 20 20 20 70 57 49 6e 66 6f 2d  dy);.    pWInfo-
23280 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 70 57 49  >iContinue = pWI
23290 6e 66 6f 2d 3e 61 5b 69 5d 2e 61 64 64 72 43 6f  nfo->a[i].addrCo
232a0 6e 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  nt;.  }..#ifdef 
232b0 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f 2a 20  SQLITE_TEST  /* 
232c0 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  For testing and 
232d0 64 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e  debugging use on
232e0 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72  ly */.  /* Recor
232f0 64 20 69 6e 20 74 68 65 20 71 75 65 72 79 20 70  d in the query p
23300 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  lan information 
23310 61 62 6f 75 74 20 74 68 65 20 63 75 72 72 65 6e  about the curren
23320 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64  t table.  ** and
23330 20 74 68 65 20 69 6e 64 65 78 20 75 73 65 64 20   the index used 
23340 74 6f 20 61 63 63 65 73 73 20 69 74 20 28 69 66  to access it (if
23350 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65 20 74   any).  If the t
23360 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a  able itself.  **
23370 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20 69 74   is not used, it
23380 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74 20 27  s name is just '
23390 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65  {}'.  If no inde
233a0 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 74  x is used.  ** t
233b0 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69 73 74  he index is list
233c0 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49 66 20  ed as "{}".  If 
233d0 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
233e0 69 73 20 75 73 65 64 20 74 68 65 0a 20 20 2a 2a  is used the.  **
233f0 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73 20 27   index name is '
23400 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  *'..  */.  for(i
23410 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
23420 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
23430 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74  char *z;.    int
23440 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d   n;.    pLevel =
23450 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a   &pWInfo->a[i];.
23460 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26      pTabItem = &
23470 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
23480 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
23490 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
234a0 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d  lias;.    if( z=
234b0 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49 74 65  =0 ) z = pTabIte
234c0 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a  m->pTab->zName;.
234d0 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53      n = sqlite3S
234e0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
234f0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
23500 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
23510 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
23520 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
23530 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
23540 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20   WHERE_IDX_ONLY 
23550 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
23560 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
23570 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
23580 7b 7d 22 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  {}", 2);.       
23590 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
235a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
235b0 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74     memcpy(&sqlit
235c0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
235d0 50 6c 61 6e 5d 2c 20 7a 2c 20 6e 29 3b 0a 20 20  Plan], z, n);.  
235e0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
235f0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
23600 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
23610 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20  lan[nQPlan++] = 
23620 27 20 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  ' ';.    }.    t
23630 65 73 74 63 61 73 65 28 20 70 4c 65 76 65 6c 2d  estcase( pLevel-
23640 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
23650 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 29  WHERE_ROWID_EQ )
23660 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
23670 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77 73 46  pLevel->plan.wsF
23680 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
23690 49 44 5f 52 41 4e 47 45 20 29 3b 0a 20 20 20 20  ID_RANGE );.    
236a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  if( pLevel->plan
236b0 2e 77 73 46 6c 61 67 73 20 26 20 28 57 48 45 52  .wsFlags & (WHER
236c0 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
236d0 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
236e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73  .      memcpy(&s
236f0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
23700 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 2c  n[nQPlan], "* ",
23710 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61   2);.      nQPla
23720 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  n += 2;.    }els
23730 65 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70  e if( (pLevel->p
23740 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
23750 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
23760 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c  ){.      n = sql
23770 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4c 65  ite3Strlen30(pLe
23780 76 65 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78  vel->plan.u.pIdx
23790 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
237a0 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
237b0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
237c0 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b 0a 20  ery_plan)-2 ){. 
237d0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73         memcpy(&s
237e0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
237f0 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65 76 65  n[nQPlan], pLeve
23800 6c 2d 3e 70 6c 61 6e 2e 75 2e 70 49 64 78 2d 3e  l->plan.u.pIdx->
23810 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20 20 20 20  zName, n);.     
23820 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
23830 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
23840 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
23850 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
23860 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
23870 20 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c       memcpy(&sql
23880 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
23890 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 20 22 2c 20  nQPlan], "{} ", 
238a0 33 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e  3);.      nQPlan
238b0 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 3;.    }.  }
238c0 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
238d0 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
238e0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
238f0 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
23900 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
23910 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
23920 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
23930 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
23940 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
23950 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
23960 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
23970 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
23980 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
23990 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
239a0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
239b0 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
239c0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
239d0 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
239e0 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
239f0 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
23a00 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
23a10 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
23a20 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
23a30 42 65 67 69 6e 45 72 72 6f 72 3a 0a 20 20 77 68  BeginError:.  wh
23a40 65 72 65 49 6e 66 6f 46 72 65 65 28 64 62 2c 20  ereInfoFree(db, 
23a50 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72  pWInfo);.  retur
23a60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n 0;.}../*.** Ge
23a70 6e 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f  nerate the end o
23a80 66 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70  f the WHERE loop
23a90 2e 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  .  See comments 
23aa0 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68  on .** sqlite3Wh
23ab0 65 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61  ereBegin() for a
23ac0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
23ad0 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ation..*/.void s
23ae0 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57  qlite3WhereEnd(W
23af0 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f  hereInfo *pWInfo
23b00 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  ){.  Parse *pPar
23b10 73 65 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61  se = pWInfo->pPa
23b20 72 73 65 3b 0a 20 20 56 64 62 65 20 2a 76 20 3d  rse;.  Vdbe *v =
23b30 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
23b40 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
23b50 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
23b60 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
23b70 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
23b80 62 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  bList;.  sqlite3
23b90 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
23ba0 62 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  b;..  /* Generat
23bb0 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69  e loop terminati
23bc0 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20  on code..  */.  
23bd0 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
23be0 43 6c 65 61 72 28 70 50 61 72 73 65 29 3b 0a 20  Clear(pParse);. 
23bf0 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d   for(i=pTabList-
23c00 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  >nSrc-1; i>=0; i
23c10 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20  --){.    pLevel 
23c20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b  = &pWInfo->a[i];
23c30 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
23c40 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23c50 70 4c 65 76 65 6c 2d 3e 61 64 64 72 43 6f 6e 74  pLevel->addrCont
23c60 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
23c70 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
23c80 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
23c90 64 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65  dbeAddOp2(v, pLe
23ca0 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d  vel->op, pLevel-
23cb0 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29  >p1, pLevel->p2)
23cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
23cd0 64 62 65 43 68 61 6e 67 65 50 35 28 76 2c 20 70  dbeChangeP5(v, p
23ce0 4c 65 76 65 6c 2d 3e 70 35 29 3b 0a 20 20 20 20  Level->p5);.    
23cf0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
23d00 2d 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26  ->plan.wsFlags &
23d10 20 57 48 45 52 45 5f 49 4e 5f 41 42 4c 45 20 26   WHERE_IN_ABLE &
23d20 26 20 70 4c 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e  & pLevel->u.in.n
23d30 49 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 74  In>0 ){.      st
23d40 72 75 63 74 20 49 6e 4c 6f 6f 70 20 2a 70 49 6e  ruct InLoop *pIn
23d50 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
23d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
23d70 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
23d80 70 4c 65 76 65 6c 2d 3e 61 64 64 72 4e 78 74 29  pLevel->addrNxt)
23d90 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c  ;.      for(j=pL
23da0 65 76 65 6c 2d 3e 75 2e 69 6e 2e 6e 49 6e 2c 20  evel->u.in.nIn, 
23db0 70 49 6e 3d 26 70 4c 65 76 65 6c 2d 3e 75 2e 69  pIn=&pLevel->u.i
23dc0 6e 2e 61 49 6e 4c 6f 6f 70 5b 6a 2d 31 5d 3b 20  n.aInLoop[j-1]; 
23dd0 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 49 6e 2d 2d 29  j>0; j--, pIn--)
23de0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
23df0 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c  3VdbeJumpHere(v,
23e00 20 70 49 6e 2d 3e 61 64 64 72 49 6e 54 6f 70 2b   pIn->addrInTop+
23e10 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
23e20 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
23e30 20 4f 50 5f 4e 65 78 74 2c 20 70 49 6e 2d 3e 69   OP_Next, pIn->i
23e40 43 75 72 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  Cur, pIn->addrIn
23e50 54 6f 70 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Top);.        sq
23e60 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
23e70 65 28 76 2c 20 70 49 6e 2d 3e 61 64 64 72 49 6e  e(v, pIn->addrIn
23e80 54 6f 70 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  Top-1);.      }.
23e90 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
23ea0 72 65 65 28 64 62 2c 20 70 4c 65 76 65 6c 2d 3e  ree(db, pLevel->
23eb0 75 2e 69 6e 2e 61 49 6e 4c 6f 6f 70 29 3b 0a 20  u.in.aInLoop);. 
23ec0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23ed0 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
23ee0 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 61 64 64 72  (v, pLevel->addr
23ef0 42 72 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Brk);.    if( pL
23f00 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
23f10 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  ){.      int add
23f20 72 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  r;.      addr = 
23f30 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
23f40 31 28 76 2c 20 4f 50 5f 49 66 50 6f 73 2c 20 70  1(v, OP_IfPos, p
23f50 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
23f60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
23f70 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
23f80 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69  _NullRow, pTabLi
23f90 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
23fa0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
23fb0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
23fc0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
23fd0 65 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20  e3VdbeAddOp1(v, 
23fe0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
23ff0 65 6c 2d 3e 69 49 64 78 43 75 72 29 3b 0a 20 20  el->iIdxCur);.  
24000 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
24010 70 4c 65 76 65 6c 2d 3e 6f 70 3d 3d 4f 50 5f 52  pLevel->op==OP_R
24020 65 74 75 72 6e 20 29 7b 0a 20 20 20 20 20 20 20  eturn ){.       
24030 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
24040 70 32 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20  p2(v, OP_Gosub, 
24050 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65 76  pLevel->p1, pLev
24060 65 6c 2d 3e 61 64 64 72 46 69 72 73 74 29 3b 0a  el->addrFirst);.
24070 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
24080 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
24090 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74  AddOp2(v, OP_Got
240a0 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 61 64  o, 0, pLevel->ad
240b0 64 72 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  drFirst);.      
240c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
240d0 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61  dbeJumpHere(v, a
240e0 64 64 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ddr);.    }.  }.
240f0 0a 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b  .  /* The "break
24100 22 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c  " point is here,
24110 20 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65   just past the e
24120 6e 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20  nd of the outer 
24130 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69  loop..  ** Set i
24140 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
24150 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
24160 6c 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  l(v, pWInfo->iBr
24170 65 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73  eak);..  /* Clos
24180 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72  e all of the cur
24190 73 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f  sors that were o
241a0 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
241b0 57 68 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f  WhereBegin..  */
241c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76  .  for(i=0, pLev
241d0 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c  el=pWInfo->a; i<
241e0 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pTabList->nSrc; 
241f0 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a  i++, pLevel++){.
24200 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
24210 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74 65  st_item *pTabIte
24220 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61  m = &pTabList->a
24230 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b  [pLevel->iFrom];
24240 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
24250 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61   = pTabItem->pTa
24260 62 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  b;.    assert( p
24270 54 61 62 21 3d 30 20 29 3b 0a 20 20 20 20 69 66  Tab!=0 );.    if
24280 28 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67  ( (pTab->tabFlag
24290 73 20 26 20 54 46 5f 45 70 68 65 6d 65 72 61 6c  s & TF_Ephemeral
242a0 29 21 3d 30 20 7c 7c 20 70 54 61 62 2d 3e 70 53  )!=0 || pTab->pS
242b0 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
242c0 3b 0a 20 20 20 20 69 66 28 20 28 70 57 49 6e 66  ;.    if( (pWInf
242d0 6f 2d 3e 77 63 74 72 6c 46 6c 61 67 73 20 26 20  o->wctrlFlags & 
242e0 57 48 45 52 45 5f 4f 4d 49 54 5f 43 4c 4f 53 45  WHERE_OMIT_CLOSE
242f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
24300 28 20 21 70 57 49 6e 66 6f 2d 3e 6f 6b 4f 6e 65  ( !pWInfo->okOne
24310 50 61 73 73 20 26 26 20 28 70 4c 65 76 65 6c 2d  Pass && (pLevel-
24320 3e 70 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20  >plan.wsFlags & 
24330 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
24340 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
24350 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
24360 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61  v, OP_Close, pTa
24370 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29 3b  bItem->iCursor);
24380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
24390 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  f( (pLevel->plan
243a0 2e 77 73 46 6c 61 67 73 20 26 20 57 48 45 52 45  .wsFlags & WHERE
243b0 5f 49 4e 44 45 58 45 44 29 21 3d 30 20 29 7b 0a  _INDEXED)!=0 ){.
243c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
243d0 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f  dbeAddOp1(v, OP_
243e0 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
243f0 49 64 78 43 75 72 29 3b 0a 20 20 20 20 20 20 7d  IdxCur);.      }
24400 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
24410 66 20 74 68 69 73 20 73 63 61 6e 20 75 73 65 73  f this scan uses
24420 20 61 6e 20 69 6e 64 65 78 2c 20 6d 61 6b 65 20   an index, make 
24430 63 6f 64 65 20 73 75 62 73 74 69 74 75 74 69 6f  code substitutio
24440 6e 73 20 74 6f 20 72 65 61 64 20 64 61 74 61 0a  ns to read data.
24450 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
24460 69 6e 64 65 78 20 69 6e 20 70 72 65 66 65 72 65  index in prefere
24470 6e 63 65 20 74 6f 20 74 68 65 20 74 61 62 6c 65  nce to the table
24480 2e 20 53 6f 6d 65 74 69 6d 65 73 2c 20 74 68 69  . Sometimes, thi
24490 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  s means.    ** t
244a0 68 65 20 74 61 62 6c 65 20 6e 65 65 64 20 6e 65  he table need ne
244b0 76 65 72 20 62 65 20 72 65 61 64 20 66 72 6f 6d  ver be read from
244c0 2e 20 54 68 69 73 20 69 73 20 61 20 70 65 72 66  . This is a perf
244d0 6f 72 6d 61 6e 63 65 20 62 6f 6f 73 74 2c 0a 20  ormance boost,. 
244e0 20 20 20 2a 2a 20 61 73 20 74 68 65 20 76 64 62     ** as the vdb
244f0 65 20 6c 65 76 65 6c 20 77 61 69 74 73 20 75 6e  e level waits un
24500 74 69 6c 20 74 68 65 20 74 61 62 6c 65 20 69 73  til the table is
24510 20 72 65 61 64 20 62 65 66 6f 72 65 20 61 63 74   read before act
24520 75 61 6c 6c 79 0a 20 20 20 20 2a 2a 20 73 65 65  ually.    ** see
24530 6b 69 6e 67 20 74 68 65 20 74 61 62 6c 65 20 63  king the table c
24540 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 65 63  ursor to the rec
24550 6f 72 64 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ord correspondin
24560 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
24570 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
24580 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   in the index.. 
24590 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 43 61     ** .    ** Ca
245a0 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f 64 65 20  lls to the code 
245b0 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 62 65 74  generator in bet
245c0 77 65 65 6e 20 73 71 6c 69 74 65 33 57 68 65 72  ween sqlite3Wher
245d0 65 42 65 67 69 6e 20 61 6e 64 0a 20 20 20 20 2a  eBegin and.    *
245e0 2a 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e  * sqlite3WhereEn
245f0 64 20 77 69 6c 6c 20 68 61 76 65 20 63 72 65 61  d will have crea
24600 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 72 65  ted code that re
24610 66 65 72 65 6e 63 65 73 20 74 68 65 20 74 61 62  ferences the tab
24620 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  le.    ** direct
24630 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f 70 20 73  ly.  This loop s
24640 63 61 6e 73 20 61 6c 6c 20 74 68 61 74 20 63 6f  cans all that co
24650 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f  de looking for o
24660 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a 20 74 68  pcodes.    ** th
24670 61 74 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  at reference the
24680 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6e 76 65   table and conve
24690 72 74 73 20 74 68 65 6d 20 69 6e 74 6f 20 6f 70  rts them into op
246a0 63 6f 64 65 73 20 74 68 61 74 0a 20 20 20 20 2a  codes that.    *
246b0 2a 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  * reference the 
246c0 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20  index..    */.  
246d0 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 70    if( (pLevel->p
246e0 6c 61 6e 2e 77 73 46 6c 61 67 73 20 26 20 57 48  lan.wsFlags & WH
246f0 45 52 45 5f 49 4e 44 45 58 45 44 29 21 3d 30 20  ERE_INDEXED)!=0 
24700 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  && !db->mallocFa
24710 69 6c 65 64 29 7b 0a 20 20 20 20 20 20 69 6e 74  iled){.      int
24720 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   k, j, last;.   
24730 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
24740 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
24750 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e  x = pLevel->plan
24760 2e 75 2e 70 49 64 78 3b 0a 20 20 20 20 20 20 69  .u.pIdx;.      i
24770 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20  nt useIndexOnly 
24780 3d 20 70 4c 65 76 65 6c 2d 3e 70 6c 61 6e 2e 77  = pLevel->plan.w
24790 73 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  sFlags & WHERE_I
247a0 44 58 5f 4f 4e 4c 59 3b 0a 0a 20 20 20 20 20 20  DX_ONLY;..      
247b0 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
247c0 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 73  );.      pOp = s
247d0 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
247e0 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29  v, pWInfo->iTop)
247f0 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d 20 73  ;.      last = s
24800 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
24810 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
24820 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54  for(k=pWInfo->iT
24830 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c  op; k<last; k++,
24840 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20   pOp++){.       
24850 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c   if( pOp->p1!=pL
24860 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20 29 20  evel->iTabCur ) 
24870 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
24880 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
24890 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  e==OP_Column ){.
248a0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
248b0 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  0; j<pIdx->nColu
248c0 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
248d0 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
248e0 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  2==pIdx->aiColum
248f0 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  n[j] ){.        
24900 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20        pOp->p2 = 
24910 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
24920 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
24930 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
24940 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
24950 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24960 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24970 20 20 20 20 20 61 73 73 65 72 74 28 21 75 73 65       assert(!use
24980 49 6e 64 65 78 4f 6e 6c 79 20 7c 7c 20 6a 3c 70  IndexOnly || j<p
24990 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 29 3b 0a 20  Idx->nColumn);. 
249a0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
249b0 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
249c0 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  _Rowid ){.      
249d0 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c      pOp->p1 = pL
249e0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20  evel->iIdxCur;. 
249f0 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70           pOp->op
24a00 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77  code = OP_IdxRow
24a10 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  id;.        }els
24a20 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
24a30 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 26 26  e==OP_NullRow &&
24a40 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79 20 29 7b   useIndexOnly ){
24a50 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  .          pOp->
24a60 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70  opcode = OP_Noop
24a70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24a80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
24a90 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75   /* Final cleanu
24aa0 70 0a 20 20 2a 2f 0a 20 20 77 68 65 72 65 49 6e  p.  */.  whereIn
24ab0 66 6f 46 72 65 65 28 64 62 2c 20 70 57 49 6e 66  foFree(db, pWInf
24ac0 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  o);.  return;.}.