/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact dc146152cd0eb3b3568e92e7fed55cd008ebb9b5:


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 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 39 34   where.c,v 1.294
0340: 20 32 30 30 38 2f 30 33 2f 32 38 20 31 39 3a 31   2008/03/28 19:1
0350: 36 3a 35 37 20 64 61 6e 69 65 6c 6b 31 39 37 37  6:57 danielk1977
0360: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0370: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
0390: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 61 20  er of bits in a 
03a0: 42 69 74 6d 61 73 6b 2e 20 20 22 42 4d 53 22 20  Bitmask.  "BMS" 
03b0: 6d 65 61 6e 73 20 22 42 69 74 4d 61 73 6b 20 53  means "BitMask S
03c0: 69 7a 65 22 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ize"..*/.#define
03d0: 20 42 4d 53 20 20 28 73 69 7a 65 6f 66 28 42 69   BMS  (sizeof(Bi
03e0: 74 6d 61 73 6b 29 2a 38 29 0a 0a 2f 2a 0a 2a 2a  tmask)*8)../*.**
03f0: 20 54 72 61 63 65 20 6f 75 74 70 75 74 20 6d 61   Trace output ma
0400: 63 72 6f 73 0a 2a 2f 0a 23 69 66 20 64 65 66 69  cros.*/.#if defi
0410: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
0420: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
0430: 54 45 5f 44 45 42 55 47 29 0a 69 6e 74 20 73 71  TE_DEBUG).int sq
0440: 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20  lite3WhereTrace 
0450: 3d 20 30 3b 0a 23 20 64 65 66 69 6e 65 20 57 48  = 0;.# define WH
0460: 45 52 45 54 52 41 43 45 28 58 29 20 20 69 66 28  ERETRACE(X)  if(
0470: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
0480: 65 29 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  e) sqlite3DebugP
0490: 72 69 6e 74 66 20 58 0a 23 65 6c 73 65 0a 23 20  rintf X.#else.# 
04a0: 64 65 66 69 6e 65 20 57 48 45 52 45 54 52 41 43  define WHERETRAC
04b0: 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  E(X).#endif../* 
04c0: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
04d0: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
04e0: 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65 20  uct WhereClause 
04f0: 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 74 79 70  WhereClause;.typ
0500: 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70 72  edef struct Expr
0510: 4d 61 73 6b 53 65 74 20 45 78 70 72 4d 61 73 6b  MaskSet ExprMask
0520: 53 65 74 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  Set;../*.** The 
0530: 71 75 65 72 79 20 67 65 6e 65 72 61 74 6f 72 20  query generator 
0540: 75 73 65 73 20 61 6e 20 61 72 72 61 79 20 6f 66  uses an array of
0550: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
0560: 69 73 20 73 74 72 75 63 74 75 72 65 20 74 6f 0a  is structure to.
0570: 2a 2a 20 68 65 6c 70 20 69 74 20 61 6e 61 6c 79  ** help it analy
0580: 7a 65 20 74 68 65 20 73 75 62 65 78 70 72 65 73  ze the subexpres
0590: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 57 48 45  sions of the WHE
05a0: 52 45 20 63 6c 61 75 73 65 2e 20 20 45 61 63 68  RE clause.  Each
05b0: 20 57 48 45 52 45 0a 2a 2a 20 63 6c 61 75 73 65   WHERE.** clause
05c0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69   subexpression i
05d0: 73 20 73 65 70 61 72 61 74 65 64 20 66 72 6f 6d  s separated from
05e0: 20 74 68 65 20 6f 74 68 65 72 73 20 62 79 20 61   the others by a
05f0: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a  n AND operator..
0600: 2a 2a 0a 2a 2a 20 41 6c 6c 20 57 68 65 72 65 54  **.** All WhereT
0610: 65 72 6d 73 20 61 72 65 20 63 6f 6c 6c 65 63 74  erms are collect
0620: 65 64 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ed into a single
0630: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
0640: 75 63 74 75 72 65 2e 20 20 0a 2a 2a 20 54 68 65  ucture.  .** The
0650: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e 74   following ident
0660: 69 74 79 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ity holds:.**.**
0670: 20 20 20 20 20 20 20 20 57 68 65 72 65 54 65 72          WhereTer
0680: 6d 2e 70 57 43 2d 3e 61 5b 57 68 65 72 65 54 65  m.pWC->a[WhereTe
0690: 72 6d 2e 69 64 78 5d 20 3d 3d 20 57 68 65 72 65  rm.idx] == Where
06a0: 54 65 72 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Term.**.** When 
06b0: 61 20 74 65 72 6d 20 69 73 20 6f 66 20 74 68 65  a term is of the
06c0: 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   form:.**.**    
06d0: 20 20 20 20 20 20 20 20 20 20 58 20 3c 6f 70 3e            X <op>
06e0: 20 3c 65 78 70 72 3e 0a 2a 2a 0a 2a 2a 20 77 68   <expr>.**.** wh
06f0: 65 72 65 20 58 20 69 73 20 61 20 63 6f 6c 75 6d  ere X is a colum
0700: 6e 20 6e 61 6d 65 20 61 6e 64 20 3c 6f 70 3e 20  n name and <op> 
0710: 69 73 20 6f 6e 65 20 6f 66 20 63 65 72 74 61 69  is one of certai
0720: 6e 20 6f 70 65 72 61 74 6f 72 73 2c 0a 2a 2a 20  n operators,.** 
0730: 74 68 65 6e 20 57 68 65 72 65 54 65 72 6d 2e 6c  then WhereTerm.l
0740: 65 66 74 43 75 72 73 6f 72 20 61 6e 64 20 57 68  eftCursor and Wh
0750: 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 6f 6c 75  ereTerm.leftColu
0760: 6d 6e 20 72 65 63 6f 72 64 20 74 68 65 0a 2a 2a  mn record the.**
0770: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 61   cursor number a
0780: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  nd column number
0790: 20 66 6f 72 20 58 2e 20 20 57 68 65 72 65 54 65   for X.  WhereTe
07a0: 72 6d 2e 6f 70 65 72 61 74 6f 72 20 72 65 63 6f  rm.operator reco
07b0: 72 64 73 0a 2a 2a 20 74 68 65 20 3c 6f 70 3e 20  rds.** the <op> 
07c0: 75 73 69 6e 67 20 61 20 62 69 74 6d 61 73 6b 20  using a bitmask 
07d0: 65 6e 63 6f 64 69 6e 67 20 64 65 66 69 6e 65 64  encoding defined
07e0: 20 62 79 20 57 4f 5f 78 78 78 20 62 65 6c 6f 77   by WO_xxx below
07f0: 2e 20 20 54 68 65 0a 2a 2a 20 75 73 65 20 6f 66  .  The.** use of
0800: 20 61 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64   a bitmask encod
0810: 69 6e 67 20 66 6f 72 20 74 68 65 20 6f 70 65 72  ing for the oper
0820: 61 74 6f 72 20 61 6c 6c 6f 77 73 20 75 73 20 74  ator allows us t
0830: 6f 20 73 65 61 72 63 68 0a 2a 2a 20 71 75 69 63  o search.** quic
0840: 6b 6c 79 20 66 6f 72 20 74 65 72 6d 73 20 74 68  kly for terms th
0850: 61 74 20 6d 61 74 63 68 20 61 6e 79 20 6f 66 20  at match any of 
0860: 73 65 76 65 72 61 6c 20 64 69 66 66 65 72 65 6e  several differen
0870: 74 20 6f 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  t operators..**.
0880: 2a 2a 20 70 72 65 72 65 71 52 69 67 68 74 20 61  ** prereqRight a
0890: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
08a0: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
08b0: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
08c0: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
08d0: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
08e0: 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74 20  gle ExprMaskSet 
08f0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c  structure transl
0900: 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e  ates.** cursor n
0910: 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20  umber into bits 
0920: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74  and the translat
0930: 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64  ed bit is stored
0940: 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a   in the prereq.*
0950: 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74  * fields.  The t
0960: 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73  ranslation is us
0970: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ed in order to m
0980: 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62  aximize the numb
0990: 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68  er of.** bits th
09a0: 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61  at will fit in a
09b0: 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56   Bitmask.  The V
09c0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
09d0: 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73  rs might be.** s
09e0: 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74  pread out over t
09f0: 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  he non-negative 
0a00: 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65  integers.  For e
0a10: 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73  xample, the curs
0a20: 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69  or.** numbers mi
0a30: 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20  ght be 3, 8, 9, 
0a40: 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20  10, 20, 23, 41, 
0a50: 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78 70  and 45.  The Exp
0a60: 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e  rMaskSet.** tran
0a70: 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61  slates these spa
0a80: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
0a90: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
0aa0: 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  ive integers.** 
0ab0: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
0ac0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
0ad0: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69  e the best possi
0ae0: 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61  ble use of the a
0af0: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73  vailable.** bits
0b00: 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e   in the Bitmask.
0b10: 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61    So, in the exa
0b20: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
0b30: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a  cursor numbers.*
0b40: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65  * would be mappe
0b50: 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20  d into integers 
0b60: 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2f 0a  0 through 7..*/.
0b70: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 57  typedef struct W
0b80: 68 65 72 65 54 65 72 6d 20 57 68 65 72 65 54 65  hereTerm WhereTe
0b90: 72 6d 3b 0a 73 74 72 75 63 74 20 57 68 65 72 65  rm;.struct Where
0ba0: 54 65 72 6d 20 7b 0a 20 20 45 78 70 72 20 2a 70  Term {.  Expr *p
0bb0: 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20 20  Expr;           
0bc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
0bd0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
0be0: 20 2a 2f 0a 20 20 69 31 36 20 69 50 61 72 65 6e   */.  i16 iParen
0bf0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
0c00: 20 44 69 73 61 62 6c 65 20 70 57 43 2d 3e 61 5b   Disable pWC->a[
0c10: 69 50 61 72 65 6e 74 5d 20 77 68 65 6e 20 74 68  iParent] when th
0c20: 69 73 20 74 65 72 6d 20 64 69 73 61 62 6c 65 64  is term disabled
0c30: 20 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 75   */.  i16 leftCu
0c40: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  rsor;         /*
0c50: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f   Cursor number o
0c60: 66 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c  f X in "X <op> <
0c70: 65 78 70 72 3e 22 20 2a 2f 0a 20 20 69 31 36 20  expr>" */.  i16 
0c80: 6c 65 66 74 43 6f 6c 75 6d 6e 3b 20 20 20 20 20  leftColumn;     
0c90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
0ca0: 6d 62 65 72 20 6f 66 20 58 20 69 6e 20 22 58 20  mber of X in "X 
0cb0: 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20 2a 2f 0a  <op> <expr>" */.
0cc0: 20 20 75 31 36 20 65 4f 70 65 72 61 74 6f 72 3b    u16 eOperator;
0cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 57            /* A W
0ce0: 4f 5f 78 78 20 76 61 6c 75 65 20 64 65 73 63 72  O_xx value descr
0cf0: 69 62 69 6e 67 20 3c 6f 70 3e 20 2a 2f 0a 20 20  ibing <op> */.  
0d00: 75 38 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  u8 flags;       
0d10: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 20 66          /* Bit f
0d20: 6c 61 67 73 2e 20 20 53 65 65 20 62 65 6c 6f 77  lags.  See below
0d30: 20 2a 2f 0a 20 20 75 38 20 6e 43 68 69 6c 64 3b   */.  u8 nChild;
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0d50: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 69 6c 64   Number of child
0d60: 72 65 6e 20 74 68 61 74 20 6d 75 73 74 20 64 69  ren that must di
0d70: 73 61 62 6c 65 20 75 73 20 2a 2f 0a 20 20 57 68  sable us */.  Wh
0d80: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 3b 20  ereClause *pWC; 
0d90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 61        /* The cla
0da0: 75 73 65 20 74 68 69 73 20 74 65 72 6d 20 69 73  use this term is
0db0: 20 70 61 72 74 20 6f 66 20 2a 2f 0a 20 20 42 69   part of */.  Bi
0dc0: 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67 68  tmask prereqRigh
0dd0: 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  t;    /* Bitmask
0de0: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
0df0: 62 79 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 42  by pRight */.  B
0e00: 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c  itmask prereqAll
0e10: 3b 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73  ;      /* Bitmas
0e20: 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65  k of tables refe
0e30: 72 65 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a 7d  renced by p */.}
0e40: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
0e50: 20 76 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65   values of Where
0e60: 54 65 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64  Term.flags.*/.#d
0e70: 65 66 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d  efine TERM_DYNAM
0e80: 49 43 20 20 20 20 30 78 30 31 20 20 20 2f 2a 20  IC    0x01   /* 
0e90: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
0ea0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0eb0: 45 78 70 72 29 20 2a 2f 0a 23 64 65 66 69 6e 65  Expr) */.#define
0ec0: 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 20 20 20   TERM_VIRTUAL   
0ed0: 20 30 78 30 32 20 20 20 2f 2a 20 41 64 64 65 64   0x02   /* Added
0ee0: 20 62 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65   by the optimize
0ef0: 72 2e 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20  r.  Do not code 
0f00: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0f10: 43 4f 44 45 44 20 20 20 20 20 20 30 78 30 34 20  CODED      0x04 
0f20: 20 20 2f 2a 20 54 68 69 73 20 74 65 72 6d 20 69    /* This term i
0f30: 73 20 61 6c 72 65 61 64 79 20 63 6f 64 65 64 20  s already coded 
0f40: 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f  */.#define TERM_
0f50: 43 4f 50 49 45 44 20 20 20 20 20 30 78 30 38 20  COPIED     0x08 
0f60: 20 20 2f 2a 20 48 61 73 20 61 20 63 68 69 6c 64    /* Has a child
0f70: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d   */.#define TERM
0f80: 5f 4f 52 5f 4f 4b 20 20 20 20 20 20 30 78 31 30  _OR_OK      0x10
0f90: 20 20 20 2f 2a 20 55 73 65 64 20 64 75 72 69 6e     /* Used durin
0fa0: 67 20 4f 52 2d 63 6c 61 75 73 65 20 70 72 6f 63  g OR-clause proc
0fb0: 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  essing */../*.**
0fc0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
0fd0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
0fe0: 72 75 63 74 75 72 65 20 68 6f 6c 64 73 20 61 6c  ructure holds al
0ff0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  l information ab
1000: 6f 75 74 20 61 0a 2a 2a 20 57 48 45 52 45 20 63  out a.** WHERE c
1010: 6c 61 75 73 65 2e 20 20 4d 6f 73 74 6c 79 20 74  lause.  Mostly t
1020: 68 69 73 20 69 73 20 61 20 63 6f 6e 74 61 69 6e  his is a contain
1030: 65 72 20 66 6f 72 20 6f 6e 65 20 6f 72 20 6d 6f  er for one or mo
1040: 72 65 20 57 68 65 72 65 54 65 72 6d 73 2e 0a 2a  re WhereTerms..*
1050: 2f 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c  /.struct WhereCl
1060: 61 75 73 65 20 7b 0a 20 20 50 61 72 73 65 20 2a  ause {.  Parse *
1070: 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20  pParse;         
1080: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
1090: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
10a0: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
10b0: 65 74 3b 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67  et;   /* Mapping
10c0: 20 6f 66 20 74 61 62 6c 65 20 69 6e 64 69 63 65   of table indice
10d0: 73 20 74 6f 20 62 69 74 6d 61 73 6b 73 20 2a 2f  s to bitmasks */
10e0: 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20  .  int nTerm;   
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1100: 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 2a  umber of terms *
1110: 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20  /.  int nSlot;  
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1130: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
1140: 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20 57 68  s in a[] */.  Wh
1150: 65 72 65 54 65 72 6d 20 2a 61 3b 20 20 20 20 20  ereTerm *a;     
1160: 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 61         /* Each a
1170: 5b 5d 20 64 65 73 63 72 69 62 65 73 20 61 20 74  [] describes a t
1180: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
1190: 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20 57 68 65   cluase */.  Whe
11a0: 72 65 54 65 72 6d 20 61 53 74 61 74 69 63 5b 31  reTerm aStatic[1
11b0: 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0];   /* Initial
11c0: 20 73 74 61 74 69 63 20 73 70 61 63 65 20 66 6f   static space fo
11d0: 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  r a[] */.};../*.
11e0: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
11f0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1200: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20  structure keeps 
1210: 74 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69  track of a mappi
1220: 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44  ng.** between VD
1230: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
1240: 73 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68  s and bits of th
1250: 65 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 57 68  e bitmasks in Wh
1260: 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a 2a 20 54  ereTerm..**.** T
1270: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
1280: 75 6d 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c  umbers are small
1290: 20 69 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69   integers contai
12a0: 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69  ned in .** SrcLi
12b0: 73 74 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20  st_item.iCursor 
12c0: 61 6e 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20  and Expr.iTable 
12d0: 66 69 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79  fields.  For any
12e0: 20 67 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a   given WHERE .**
12f0: 20 63 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72   clause, the cur
1300: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
1310: 74 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68  t not begin with
1320: 20 30 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68   0 and they migh
1330: 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70  t.** contain gap
1340: 73 20 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69  s in the numberi
1350: 6e 67 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75  ng sequence.  Bu
1360: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
1370: 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65  e maximum.** use
1380: 20 6f 66 20 74 68 65 20 62 69 74 73 20 69 6e 20   of the bits in 
1390: 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54  our bitmasks.  T
13a0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70 72  his structure pr
13b0: 6f 76 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67  ovides a mapping
13c0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61  .** from the spa
13d0: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
13e0: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
13f0: 69 76 65 20 69 6e 74 65 67 65 72 73 20 62 65 67  ive integers beg
1400: 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30  inning.** with 0
1410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78 70 72 4d  ..**.** If ExprM
1420: 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20  askSet.ix[A]==B 
1430: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68  it means that Th
1440: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1450: 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65  Bitmask.** corre
1460: 73 70 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73  sponds VDBE curs
1470: 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68  or number B.  Th
1480: 65 20 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20  e A-th bit of a 
1490: 62 69 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e  bitmask is 1<<A.
14a0: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70  .**.** For examp
14b0: 6c 65 2c 20 69 66 20 74 68 65 20 57 48 45 52 45  le, if the WHERE
14c0: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 69   clause expressi
14d0: 6f 6e 20 75 73 65 64 20 74 68 65 73 65 20 56 44  on used these VD
14e0: 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20  BE.** cursors:  
14f0: 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c  4, 5, 8, 29, 57,
1500: 20 37 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20   73.  Then the  
1510: 45 78 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75  ExprMaskSet stru
1520: 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d  cture.** would m
1530: 61 70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20  ap those cursor 
1540: 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74  numbers into bit
1550: 73 20 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a  s 0 through 5..*
1560: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
1570: 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
1580: 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72  t necessarily or
1590: 64 65 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65  dered.  In the e
15a0: 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c  xample.** above,
15b0: 20 74 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67   the mapping mig
15c0: 68 74 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a  ht go like this:
15d0: 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d    4->3, 5->1, 8-
15e0: 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37  >2, 29->0,.** 57
15f0: 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20  ->5, 73->4.  Or 
1600: 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72  one of 719 other
1610: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69   combinations mi
1620: 67 68 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a  ght be used. It.
1630: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c  ** does not real
1640: 6c 79 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74  ly matter.  What
1650: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73   is important is
1660: 20 74 68 61 74 20 73 70 61 72 73 65 20 63 75 72   that sparse cur
1670: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61  sor.** numbers a
1680: 6c 6c 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e  ll get mapped in
1690: 74 6f 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74  to bit numbers t
16a0: 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  hat begin with 0
16b0: 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   and contain.** 
16c0: 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 73 74 72 75  no gaps..*/.stru
16d0: 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74 20 7b  ct ExprMaskSet {
16e0: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 73   /* Number of as
1710: 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20 76 61  signed cursor va
1720: 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 78  lues */.  int ix
1730: 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29  [sizeof(Bitmask)
1740: 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75 72 73 6f  *8];    /* Curso
1750: 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61  r assigned to ea
1760: 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f  ch bit */.};.../
1770: 2a 0a 2a 2a 20 42 69 74 6d 61 73 6b 73 20 66 6f  *.** Bitmasks fo
1780: 72 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20  r the operators 
1790: 74 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65  that indices are
17a0: 20 61 62 6c 65 20 74 6f 20 65 78 70 6c 6f 69 74   able to exploit
17b0: 2e 20 20 41 6e 0a 2a 2a 20 4f 52 2d 65 64 20 63  .  An.** OR-ed c
17c0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68  ombination of th
17d0: 65 73 65 20 76 61 6c 75 65 73 20 63 61 6e 20 62  ese values can b
17e0: 65 20 75 73 65 64 20 77 68 65 6e 20 73 65 61 72  e used when sear
17f0: 63 68 69 6e 67 20 66 6f 72 0a 2a 2a 20 74 65 72  ching for.** ter
1800: 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72 65 20  ms in the where 
1810: 63 6c 61 75 73 65 2e 0a 2a 2f 0a 23 64 65 66 69  clause..*/.#defi
1820: 6e 65 20 57 4f 5f 49 4e 20 20 20 20 20 31 0a 23  ne WO_IN     1.#
1830: 64 65 66 69 6e 65 20 57 4f 5f 45 51 20 20 20 20  define WO_EQ    
1840: 20 32 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4c 54   2.#define WO_LT
1850: 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b       (WO_EQ<<(TK
1860: 5f 4c 54 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66  _LT-TK_EQ)).#def
1870: 69 6e 65 20 57 4f 5f 4c 45 20 20 20 20 20 28 57  ine WO_LE     (W
1880: 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 45 2d 54 4b 5f  O_EQ<<(TK_LE-TK_
1890: 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f  EQ)).#define WO_
18a0: 47 54 20 20 20 20 20 28 57 4f 5f 45 51 3c 3c 28  GT     (WO_EQ<<(
18b0: 54 4b 5f 47 54 2d 54 4b 5f 45 51 29 29 0a 23 64  TK_GT-TK_EQ)).#d
18c0: 65 66 69 6e 65 20 57 4f 5f 47 45 20 20 20 20 20  efine WO_GE     
18d0: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 45 2d 54  (WO_EQ<<(TK_GE-T
18e0: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
18f0: 4f 5f 4d 41 54 43 48 20 20 36 34 0a 23 64 65 66  O_MATCH  64.#def
1900: 69 6e 65 20 57 4f 5f 49 53 4e 55 4c 4c 20 31 32  ine WO_ISNULL 12
1910: 38 0a 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66  8../*.** Value f
1920: 6f 72 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  or flags returne
1930: 64 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29  d by bestIndex()
1940: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65  .  .**.** The le
1950: 61 73 74 20 73 69 67 6e 69 66 69 63 61 6e 74 20  ast significant 
1960: 62 79 74 65 20 69 73 20 72 65 73 65 72 76 65 64  byte is reserved
1970: 20 61 73 20 61 20 6d 61 73 6b 20 66 6f 72 20 57   as a mask for W
1980: 4f 5f 20 76 61 6c 75 65 73 20 61 62 6f 76 65 2e  O_ values above.
1990: 0a 2a 2a 20 54 68 65 20 57 68 65 72 65 4c 65 76  .** The WhereLev
19a0: 65 6c 2e 66 6c 61 67 73 20 66 69 65 6c 64 20 69  el.flags field i
19b0: 73 20 75 73 75 61 6c 6c 79 20 73 65 74 20 74 6f  s usually set to
19c0: 20 57 4f 5f 49 4e 7c 57 4f 5f 45 51 7c 57 4f 5f   WO_IN|WO_EQ|WO_
19d0: 49 53 4e 55 4c 4c 2e 0a 2a 2a 20 42 75 74 20 69  ISNULL..** But i
19e0: 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 74  f the table is t
19f0: 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f  he right table o
1a00: 66 20 61 20 6c 65 66 74 20 6a 6f 69 6e 2c 20 57  f a left join, W
1a10: 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61 67 73 0a  hereLevel.flags.
1a20: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 57 4f 5f  ** is set to WO_
1a30: 49 4e 7c 57 4f 5f 45 51 2e 20 20 54 68 65 20 57  IN|WO_EQ.  The W
1a40: 68 65 72 65 4c 65 76 65 6c 2e 66 6c 61 67 73 20  hereLevel.flags 
1a50: 66 69 65 6c 64 20 63 61 6e 20 74 68 65 6e 20 62  field can then b
1a60: 65 20 75 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  e used as.** the
1a70: 20 22 6f 70 22 20 70 61 72 61 6d 65 74 65 72 20   "op" parameter 
1a80: 74 6f 20 66 69 6e 64 54 65 72 6d 20 77 68 65 6e  to findTerm when
1a90: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
1aa0: 67 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  g equality const
1ab0: 72 61 69 6e 74 73 2e 0a 2a 2a 20 49 53 4e 55 4c  raints..** ISNUL
1ac0: 4c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 77 69  L constraints wi
1ad0: 6c 6c 20 74 68 65 6e 20 6e 6f 74 20 62 65 20 75  ll then not be u
1ae0: 73 65 64 20 6f 6e 20 74 68 65 20 72 69 67 68 74  sed on the right
1af0: 20 74 61 62 6c 65 20 6f 66 20 61 20 6c 65 66 74   table of a left
1b00: 0a 2a 2a 20 6a 6f 69 6e 2e 20 20 54 69 63 6b 65  .** join.  Ticke
1b10: 74 73 20 23 32 31 37 37 20 61 6e 64 20 23 32 31  ts #2177 and #21
1b20: 38 39 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57  89..*/.#define W
1b30: 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 20 20  HERE_ROWID_EQ   
1b40: 20 20 30 78 30 30 30 31 30 30 20 20 20 2f 2a 20    0x000100   /* 
1b50: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
1b60: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a  wid IN (...) */.
1b70: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 52 4f  #define WHERE_RO
1b80: 57 49 44 5f 52 41 4e 47 45 20 20 30 78 30 30 30  WID_RANGE  0x000
1b90: 32 30 30 20 20 20 2f 2a 20 72 6f 77 69 64 3c 45  200   /* rowid<E
1ba0: 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64  XPR and/or rowid
1bb0: 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65  >EXPR */.#define
1bc0: 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51   WHERE_COLUMN_EQ
1bd0: 20 20 20 20 30 78 30 30 31 30 30 30 20 20 20 2f      0x001000   /
1be0: 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20 49 4e  * x=EXPR or x IN
1bf0: 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e   (...) */.#defin
1c00: 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52  e WHERE_COLUMN_R
1c10: 41 4e 47 45 20 30 78 30 30 32 30 30 30 20 20 20  ANGE 0x002000   
1c20: 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72  /* x<EXPR and/or
1c30: 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69   x>EXPR */.#defi
1c40: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
1c50: 49 4e 20 20 20 20 30 78 30 30 34 30 30 30 20 20  IN    0x004000  
1c60: 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a   /* x IN (...) *
1c70: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
1c80: 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 30 78 30  TOP_LIMIT    0x0
1c90: 31 30 30 30 30 20 20 20 2f 2a 20 78 3c 45 58 50  10000   /* x<EXP
1ca0: 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e  R or x<=EXPR con
1cb0: 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69  straint */.#defi
1cc0: 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  ne WHERE_BTM_LIM
1cd0: 49 54 20 20 20 20 30 78 30 32 30 30 30 30 20 20  IT    0x020000  
1ce0: 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20 78 3e   /* x>EXPR or x>
1cf0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
1d00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1d10: 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20 20 30  E_IDX_ONLY     0
1d20: 78 30 38 30 30 30 30 20 20 20 2f 2a 20 55 73 65  x080000   /* Use
1d30: 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d   index only - om
1d40: 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66  it table */.#def
1d50: 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45 52 42  ine WHERE_ORDERB
1d60: 59 20 20 20 20 20 20 30 78 31 30 30 30 30 30 20  Y      0x100000 
1d70: 20 20 2f 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c    /* Output will
1d80: 20 61 70 70 65 61 72 20 69 6e 20 63 6f 72 72 65   appear in corre
1d90: 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66  ct order */.#def
1da0: 69 6e 65 20 57 48 45 52 45 5f 52 45 56 45 52 53  ine WHERE_REVERS
1db0: 45 20 20 20 20 20 20 30 78 32 30 30 30 30 30 20  E      0x200000 
1dc0: 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76    /* Scan in rev
1dd0: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64  erse order */.#d
1de0: 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e 49 51  efine WHERE_UNIQ
1df0: 55 45 20 20 20 20 20 20 20 30 78 34 30 30 30 30  UE       0x40000
1e00: 30 20 20 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e  0   /* Selects n
1e10: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
1e20: 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  row */.#define W
1e30: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
1e40: 45 20 30 78 38 30 30 30 30 30 20 20 20 2f 2a 20  E 0x800000   /* 
1e50: 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  Use virtual-tabl
1e60: 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a  e processing */.
1e70: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1e80: 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  e a preallocated
1e90: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1ea0: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
1eb0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
1ec0: 73 65 49 6e 69 74 28 0a 20 20 57 68 65 72 65 43  seInit(.  WhereC
1ed0: 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20  lause *pWC,     
1ee0: 20 20 20 2f 2a 20 54 68 65 20 57 68 65 72 65 43     /* The WhereC
1ef0: 6c 61 75 73 65 20 74 6f 20 62 65 20 69 6e 69 74  lause to be init
1f00: 69 61 6c 69 7a 65 64 20 2a 2f 0a 20 20 50 61 72  ialized */.  Par
1f10: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
1f20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
1f30: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1f40: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70    ExprMaskSet *p
1f50: 4d 61 73 6b 53 65 74 20 20 20 20 2f 2a 20 4d 61  MaskSet    /* Ma
1f60: 70 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65  pping from table
1f70: 20 69 6e 64 69 63 65 73 20 74 6f 20 62 69 74 6d   indices to bitm
1f80: 61 73 6b 73 20 2a 2f 0a 29 7b 0a 20 20 70 57 43  asks */.){.  pWC
1f90: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
1fa0: 65 3b 0a 20 20 70 57 43 2d 3e 70 4d 61 73 6b 53  e;.  pWC->pMaskS
1fb0: 65 74 20 3d 20 70 4d 61 73 6b 53 65 74 3b 0a 20  et = pMaskSet;. 
1fc0: 20 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b   pWC->nTerm = 0;
1fd0: 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20  .  pWC->nSlot = 
1fe0: 41 72 72 61 79 53 69 7a 65 28 70 57 43 2d 3e 61  ArraySize(pWC->a
1ff0: 53 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e  Static);.  pWC->
2000: 61 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63  a = pWC->aStatic
2010: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c  ;.}../*.** Deall
2020: 6f 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61  ocate a WhereCla
2030: 75 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  use structure.  
2040: 54 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20  The WhereClause 
2050: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73  structure.** its
2060: 65 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64  elf is not freed
2070: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2080: 69 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f  is the inverse o
2090: 66 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69  f whereClauseIni
20a0: 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  t()..*/.static v
20b0: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43  oid whereClauseC
20c0: 6c 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65  lear(WhereClause
20d0: 20 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b   *pWC){.  int i;
20e0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
20f0: 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54  .  for(i=pWC->nT
2100: 65 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b  erm-1, a=pWC->a;
2110: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29   i>=0; i--, a++)
2120: 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 66 6c 61  {.    if( a->fla
2130: 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49  gs & TERM_DYNAMI
2140: 43 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  C ){.      sqlit
2150: 65 33 45 78 70 72 44 65 6c 65 74 65 28 61 2d 3e  e3ExprDelete(a->
2160: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
2170: 7d 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d  }.  if( pWC->a!=
2180: 70 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a  pWC->aStatic ){.
2190: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21a0: 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a  (pWC->a);.  }.}.
21b0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
21c0: 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20   entries to the 
21d0: 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75  WhereClause stru
21e0: 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61 73 65  cture.  Increase
21f0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
2200: 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63 65 73  * space as neces
2210: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  sary..**.** If t
2220: 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
2230: 74 20 69 6e 63 6c 75 64 65 73 20 54 45 52 4d 5f  t includes TERM_
2240: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 72 65  DYNAMIC, then re
2250: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20  sponsibility.** 
2260: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20  for freeing the 
2270: 65 78 70 72 65 73 73 69 6f 6e 20 70 20 69 73 20  expression p is 
2280: 61 73 73 75 6d 65 64 20 62 79 20 74 68 65 20 57  assumed by the W
2290: 68 65 72 65 43 6c 61 75 73 65 20 6f 62 6a 65 63  hereClause objec
22a0: 74 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  t..**.** WARNING
22b0: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
22c0: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
22d0: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
22e0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
22f0: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
2300: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
2310: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
2320: 76 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a 2a  valided after.**
2330: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
2340: 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69  utine.  Such poi
2350: 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69  nters may be rei
2360: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65  nitialized by re
2370: 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65  ferencing.** the
2380: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e   pWC->a[] array.
2390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
23a0: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
23b0: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
23c0: 43 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  C, Expr *p, int 
23d0: 66 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  flags){.  WhereT
23e0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
23f0: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43  t idx;.  if( pWC
2400: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
2410: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
2420: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
2430: 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  ->a;.    pWC->a 
2440: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2450: 28 20 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b  ( sizeof(pWC->a[
2460: 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32  0])*pWC->nSlot*2
2470: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d   );.    if( pWC-
2480: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  >a==0 ){.      p
2490: 57 43 2d 3e 70 50 61 72 73 65 2d 3e 64 62 2d 3e  WC->pParse->db->
24a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
24b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  ;.      if( flag
24c0: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
24d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
24e0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 29  te3ExprDelete(p)
24f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2500: 70 57 43 2d 3e 61 20 3d 20 70 4f 6c 64 3b 0a 20  pWC->a = pOld;. 
2510: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2520: 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
2530: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
2540: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
2550: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
2560: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
2570: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
2580: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4f   sqlite3_free(pO
2590: 6c 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ld);.    }.    p
25a0: 57 43 2d 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a  WC->nSlot *= 2;.
25b0: 20 20 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70    }.  pTerm = &p
25c0: 57 43 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d  WC->a[idx = pWC-
25d0: 3e 6e 54 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e  >nTerm];.  pWC->
25e0: 6e 54 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d  nTerm++;.  pTerm
25f0: 2d 3e 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70  ->pExpr = p;.  p
2600: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c  Term->flags = fl
2610: 61 67 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57  ags;.  pTerm->pW
2620: 43 20 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d  C = pWC;.  pTerm
2630: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a  ->iParent = -1;.
2640: 20 20 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a    return idx;.}.
2650: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2660: 69 6e 65 20 69 64 65 6e 74 69 66 69 65 73 20 73  ine identifies s
2670: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
2680: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
2690: 65 20 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20  e where.** each 
26a0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
26b0: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 74 68   separated by th
26c0: 65 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f  e AND operator o
26d0: 72 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  r some other.** 
26e0: 6f 70 65 72 61 74 6f 72 20 73 70 65 63 69 66 69  operator specifi
26f0: 65 64 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72  ed in the op par
2700: 61 6d 65 74 65 72 2e 20 20 54 68 65 20 57 68 65  ameter.  The Whe
2710: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
2720: 72 65 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20  re.** is filled 
2730: 77 69 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f  with pointers to
2740: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e   subexpressions.
2750: 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a    For example:.*
2760: 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61  *.**    WHERE  a
2770: 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f  =='hello' AND co
2780: 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20  alesce(b,11)<10 
2790: 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20  AND (c+12!=d OR 
27a0: 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20  c==22).**       
27b0: 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20      \________/  
27c0: 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f     \____________
27d0: 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f  ___/     \______
27e0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20  __________/.**  
27f0: 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30            slot[0
2800: 5d 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f  ]            slo
2810: 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20 20 20  t[1]            
2820: 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a     slot[2].**.**
2830: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48   The original WH
2840: 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45  ERE clause in pE
2850: 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64  xpr is unaltered
2860: 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74  .  All this rout
2870: 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d  ine.** does is m
2880: 61 6b 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69  ake slot[] entri
2890: 65 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73  es point to subs
28a0: 74 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20  tructure within 
28b0: 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pExpr..**.** In 
28c0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e  the previous sen
28d0: 74 65 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65  tence and in the
28e0: 20 64 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b   diagram, "slot[
28f0: 5d 22 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20  ]" refers to.** 
2900: 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e  the WhereClause.
2910: 61 5b 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73  a[] array.  This
2920: 20 61 72 72 61 79 20 67 72 6f 77 73 20 61 73 20   array grows as 
2930: 6e 65 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69  needed to contai
2940: 6e 0a 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f  n.** all terms o
2950: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
2960: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
2970: 69 64 20 77 68 65 72 65 53 70 6c 69 74 28 57 68  id whereSplit(Wh
2980: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
2990: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
29a0: 20 6f 70 29 7b 0a 20 20 69 66 28 20 70 45 78 70   op){.  if( pExp
29b0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
29c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d   if( pExpr->op!=
29d0: 6f 70 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43  op ){.    whereC
29e0: 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c  lauseInsert(pWC,
29f0: 20 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65   pExpr, 0);.  }e
2a00: 6c 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70  lse{.    whereSp
2a10: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
2a20: 70 4c 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20  pLeft, op);.    
2a30: 77 68 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20  whereSplit(pWC, 
2a40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
2a50: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  p);.  }.}../*.**
2a60: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65   Initialize an e
2a70: 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
2a80: 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e  et.*/.#define in
2a90: 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65  itMaskSet(P)  me
2aa0: 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f  mset(P, 0, sizeo
2ab0: 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65  f(*P))../*.** Re
2ac0: 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b  turn the bitmask
2ad0: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
2ae0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52  ursor number.  R
2af0: 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43  eturn 0 if.** iC
2b00: 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20  ursor is not in 
2b10: 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74  the set..*/.stat
2b20: 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61  ic Bitmask getMa
2b30: 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  sk(ExprMaskSet *
2b40: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
2b50: 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b  ursor){.  int i;
2b60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d  .  for(i=0; i<pM
2b70: 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b  askSet->n; i++){
2b80: 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65  .    if( pMaskSe
2b90: 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f  t->ix[i]==iCurso
2ba0: 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  r ){.      retur
2bb0: 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  n ((Bitmask)1)<<
2bc0: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
2bd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2be0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d  * Create a new m
2bf0: 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69  ask for cursor i
2c00: 43 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  Cursor..**.** Th
2c10: 65 72 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f  ere is one curso
2c20: 72 20 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74  r per table in t
2c30: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20  he FROM clause. 
2c40: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   The number of.*
2c50: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
2c60: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c  FROM clause is l
2c70: 69 6d 69 74 65 64 20 62 79 20 61 20 74 65 73 74  imited by a test
2c80: 20 65 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a   early in the.**
2c90: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
2ca0: 69 6e 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53  in() routine.  S
2cb0: 6f 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  o we know that t
2cc0: 68 65 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b  he pMaskSet->ix[
2cd0: 5d 0a 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20  ].** array will 
2ce0: 6e 65 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a  never overflow..
2cf0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
2d00: 72 65 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61  reateMask(ExprMa
2d10: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2d20: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2d30: 20 61 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65   assert( pMaskSe
2d40: 74 2d 3e 6e 20 3c 20 41 72 72 61 79 53 69 7a 65  t->n < ArraySize
2d50: 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29  (pMaskSet->ix) )
2d60: 3b 0a 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78  ;.  pMaskSet->ix
2d70: 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20  [pMaskSet->n++] 
2d80: 3d 20 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a  = iCursor;.}../*
2d90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2da0: 20 77 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76   walks (recursiv
2db0: 65 6c 79 29 20 61 6e 20 65 78 70 72 65 73 73 69  ely) an expressi
2dc0: 6f 6e 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65  on tree and gene
2dd0: 72 61 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61  rates.** a bitma
2de0: 73 6b 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  sk indicating wh
2df0: 69 63 68 20 74 61 62 6c 65 73 20 61 72 65 20 75  ich tables are u
2e00: 73 65 64 20 69 6e 20 74 68 61 74 20 65 78 70 72  sed in that expr
2e10: 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a  ession.** tree..
2e20: 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66  **.** In order f
2e30: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
2e40: 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c  to work, the cal
2e50: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
2e60: 73 74 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  st have.** previ
2e70: 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71  ously invoked sq
2e80: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
2e90: 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65  Names() on the e
2ea0: 78 70 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a  xpression.  See.
2eb0: 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20 63 6f  ** the header co
2ec0: 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f  mment on that ro
2ed0: 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69  utine for additi
2ee0: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
2ef0: 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  ..** The sqlite3
2f00: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
2f10: 28 29 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b  () routines look
2f20: 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d  s for column nam
2f30: 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74  es and.** sets t
2f40: 68 65 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20  heir opcodes to 
2f50: 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68  TK_COLUMN and th
2f60: 65 69 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20  eir Expr.iTable 
2f70: 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65  fields to.** the
2f80: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
2f90: 62 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ber of the table
2fa0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2fb0: 6a 75 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74  just has to.** t
2fc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72  ranslate the cur
2fd0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
2fe0: 20 62 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20   bitmask values 
2ff0: 61 6e 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68  and OR all.** th
3000: 65 20 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74  e bitmasks toget
3010: 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  her..*/.static B
3020: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
3030: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
3040: 73 6b 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74  skSet*, ExprList
3050: 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61  *);.static Bitma
3060: 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  sk exprSelectTab
3070: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
3080: 53 65 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a  Set*, Select*);.
3090: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
30a0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 45 78  xprTableUsage(Ex
30b0: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
30c0: 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  Set, Expr *p){. 
30d0: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
30e0: 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
30f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
3100: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
3110: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67   ){.    mask = g
3120: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
3130: 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20   p->iTable);.   
3140: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20   return mask;.  
3150: 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54  }.  mask = exprT
3160: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3170: 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  et, p->pRight);.
3180: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
3190: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
31a0: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
31b0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
31c0: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
31d0: 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  Set, p->pList);.
31e0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65    mask |= exprSe
31f0: 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65 28 70  lectTableUsage(p
3200: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c  MaskSet, p->pSel
3210: 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  ect);.  return m
3220: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
3230: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
3240: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
3250: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
3260: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
3270: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
3280: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
3290: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
32a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
32b0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
32c0: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
32d0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
32e0: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
32f0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
3300: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
3310: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
3320: 74 6d 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74  tmask exprSelect
3330: 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d  TableUsage(ExprM
3340: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
3350: 2c 20 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20  , Select *pS){. 
3360: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
3370: 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 20 29  0;.  while( pS )
3380: 7b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78  {.    mask |= ex
3390: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
33a0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
33b0: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
33c0: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
33d0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
33e0: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
33f0: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3400: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3410: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
3420: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
3430: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
3440: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
3450: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
3460: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
3470: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
3480: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 20  S->pHaving);.   
3490: 20 70 53 20 3d 20 70 53 2d 3e 70 50 72 69 6f 72   pS = pS->pPrior
34a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
34b0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
34c0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
34d0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
34e0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
34f0: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
3500: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
3510: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
3520: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
3530: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
3540: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
3550: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
3560: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
3570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3580: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
3590: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
35a0: 47 54 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 47  GT>TK_EQ && TK_G
35b0: 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  T<TK_GE );.  ass
35c0: 65 72 74 28 20 54 4b 5f 4c 54 3e 54 4b 5f 45 51  ert( TK_LT>TK_EQ
35d0: 20 26 26 20 54 4b 5f 4c 54 3c 54 4b 5f 47 45 20   && TK_LT<TK_GE 
35e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  );.  assert( TK_
35f0: 4c 45 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c  LE>TK_EQ && TK_L
3600: 45 3c 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73  E<TK_GE );.  ass
3610: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 45  ert( TK_GE==TK_E
3620: 51 2b 34 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  Q+4 );.  return 
3630: 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70  op==TK_IN || (op
3640: 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54  >=TK_EQ && op<=T
3650: 4b 5f 47 45 29 20 7c 7c 20 6f 70 3d 3d 54 4b 5f  K_GE) || op==TK_
3660: 49 53 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ISNULL;.}../*.**
3670: 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74   Swap two object
3680: 73 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a 2f 0a  s of type T..*/.
3690: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
36a0: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
36b0: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
36c0: 0a 2a 2a 20 43 6f 6d 6d 75 74 65 20 61 20 63 6f  .** Commute a co
36d0: 6d 70 61 72 69 73 69 6f 6e 20 6f 70 65 72 61 74  mparision operat
36e0: 6f 72 2e 20 20 45 78 70 72 65 73 73 69 6f 6e 73  or.  Expressions
36f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
3700: 6f 70 20 59 22 0a 2a 2a 20 61 72 65 20 63 6f 6e  op Y".** are con
3710: 76 65 72 74 65 64 20 69 6e 74 6f 20 22 59 20 6f  verted into "Y o
3720: 70 20 58 22 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  p X"..**.** If a
3730: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
3740: 6e 63 65 20 69 73 20 61 73 73 6f 63 69 61 74 65  nce is associate
3750: 64 20 77 69 74 68 20 65 69 74 68 65 72 20 74 68  d with either th
3760: 65 20 6c 65 66 74 20 6f 72 20 72 69 67 68 74 0a  e left or right.
3770: 2a 2a 20 73 69 64 65 20 6f 66 20 74 68 65 20 63  ** side of the c
3780: 6f 6d 70 61 72 69 73 6f 6e 2c 20 69 74 20 72 65  omparison, it re
3790: 6d 61 69 6e 73 20 61 73 73 6f 63 69 61 74 65 64  mains associated
37a0: 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 73   with the same s
37b0: 69 64 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ide after.** the
37c0: 20 63 6f 6d 6d 75 74 61 74 69 6f 6e 2e 20 53 6f   commutation. So
37d0: 20 22 59 20 63 6f 6c 6c 61 74 65 20 4e 4f 43 41   "Y collate NOCA
37e0: 53 45 20 6f 70 20 58 22 20 62 65 63 6f 6d 65 73  SE op X" becomes
37f0: 20 0a 2a 2a 20 22 58 20 63 6f 6c 6c 61 74 65 20   .** "X collate 
3800: 4e 4f 43 41 53 45 20 6f 70 20 59 22 2e 20 54 68  NOCASE op Y". Th
3810: 69 73 20 69 73 20 62 65 63 61 75 73 65 20 61 6e  is is because an
3820: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
3830: 65 6e 63 65 20 6f 6e 0a 2a 2a 20 74 68 65 20 6c  ence on.** the l
3840: 65 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66  eft hand side of
3850: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 76   a comparison ov
3860: 65 72 72 69 64 65 73 20 61 6e 79 20 63 6f 6c 6c  errides any coll
3870: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 0a  ation sequence .
3880: 2a 2a 20 61 74 74 61 63 68 65 64 20 74 6f 20 74  ** attached to t
3890: 68 65 20 72 69 67 68 74 2e 20 46 6f 72 20 74 68  he right. For th
38a0: 65 20 73 61 6d 65 20 72 65 61 73 6f 6e 20 74 68  e same reason th
38b0: 65 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 20  e EP_ExpCollate 
38c0: 66 6c 61 67 0a 2a 2a 20 69 73 20 6e 6f 74 20 63  flag.** is not c
38d0: 6f 6d 6d 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  ommuted..*/.stat
38e0: 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f 6d 6d  ic void exprComm
38f0: 75 74 65 28 45 78 70 72 20 2a 70 45 78 70 72 29  ute(Expr *pExpr)
3900: 7b 0a 20 20 75 31 36 20 65 78 70 52 69 67 68 74  {.  u16 expRight
3910: 20 3d 20 28 70 45 78 70 72 2d 3e 70 52 69 67 68   = (pExpr->pRigh
3920: 74 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 45 78  t->flags & EP_Ex
3930: 70 43 6f 6c 6c 61 74 65 29 3b 0a 20 20 75 31 36  pCollate);.  u16
3940: 20 65 78 70 4c 65 66 74 20 3d 20 28 70 45 78 70   expLeft = (pExp
3950: 72 2d 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20  r->pLeft->flags 
3960: 26 20 45 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29  & EP_ExpCollate)
3970: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6c 6c 6f  ;.  assert( allo
3980: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
3990: 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   && pExpr->op!=T
39a0: 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50 28 43  K_IN );.  SWAP(C
39b0: 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d 3e 70  ollSeq*,pExpr->p
39c0: 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70 45 78  Right->pColl,pEx
39d0: 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c  pr->pLeft->pColl
39e0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
39f0: 68 74 2d 3e 66 6c 61 67 73 20 3d 20 28 70 45 78  ht->flags = (pEx
3a00: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 66 6c 61 67  pr->pRight->flag
3a10: 73 20 26 20 7e 45 50 5f 45 78 70 43 6f 6c 6c 61  s & ~EP_ExpColla
3a20: 74 65 29 20 7c 20 65 78 70 4c 65 66 74 3b 0a 20  te) | expLeft;. 
3a30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 66   pExpr->pLeft->f
3a40: 6c 61 67 73 20 3d 20 28 70 45 78 70 72 2d 3e 70  lags = (pExpr->p
3a50: 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20 7e 45  Left->flags & ~E
3a60: 50 5f 45 78 70 43 6f 6c 6c 61 74 65 29 20 7c 20  P_ExpCollate) | 
3a70: 65 78 70 52 69 67 68 74 3b 0a 20 20 53 57 41 50  expRight;.  SWAP
3a80: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3a90: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3aa0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3ab0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3ac0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3ad0: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3ae0: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3af0: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
3b00: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
3b10: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
3b20: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
3b30: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3b40: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
3b50: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
3b60: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
3b70: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
3b80: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3b90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3ba0: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3bb0: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3bc0: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3bd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72  .static int oper
3be0: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3bf0: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73  {.  int c;.  ass
3c00: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
3c10: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
3c20: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
3c30: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 20   WO_IN;.  }else 
3c40: 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  if( op==TK_ISNUL
3c50: 4c 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f  L ){.    c = WO_
3c60: 49 53 4e 55 4c 4c 3b 0a 20 20 7d 65 6c 73 65 7b  ISNULL;.  }else{
3c70: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c  .    c = WO_EQ<<
3c80: 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a  (op-TK_EQ);.  }.
3c90: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
3ca0: 5f 49 53 4e 55 4c 4c 20 7c 7c 20 63 3d 3d 57 4f  _ISNULL || c==WO
3cb0: 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73  _ISNULL );.  ass
3cc0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
3cd0: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
3ce0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
3cf0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
3d00: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3d10: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
3d20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3d30: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
3d40: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3d50: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3d60: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3d70: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3d80: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3d90: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
3da0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
3db0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
3dc0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
3dd0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
3de0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
3df0: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
3e00: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
3e10: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
3e20: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
3e30: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
3e40: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3e50: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
3e60: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
3e70: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
3e80: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
3e90: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
3ea0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
3eb0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
3ec0: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
3ed0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
3ee0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
3ef0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
3f00: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
3f10: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
3f20: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
3f30: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
3f40: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
3f50: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3f60: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
3f70: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
3f80: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
3f90: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
3fa0: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
3fb0: 20 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20   u16 op,        
3fc0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
3fd0: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
3fe0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
3ff0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
4000: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
4010: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
4020: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
4030: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
4040: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
4050: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
4060: 20 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   k;.  for(pTerm=
4070: 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
4080: 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54  Term; k; k--, pT
4090: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
40a0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
40b0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26  r==iCur.       &
40c0: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
40d0: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
40e0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
40f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
4100: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
4110: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
4120: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
4130: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
4140: 69 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20  iCur>=0 && pIdx 
4150: 26 26 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  && pTerm->eOpera
4160: 74 6f 72 21 3d 57 4f 5f 49 53 4e 55 4c 4c 20 29  tor!=WO_ISNULL )
4170: 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
4180: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
4190: 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  r;.        CollS
41a0: 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  eq *pColl;.     
41b0: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b 0a     char idxaff;.
41c0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
41d0: 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70 50         Parse *pP
41e0: 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61 72  arse = pWC->pPar
41f0: 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64 78  se;..        idx
4200: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
4210: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
4220: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
4230: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4240: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
4250: 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63 6f  pX, idxaff) ) co
4260: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 20  ntinue;..       
4270: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74   /* Figure out t
4280: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
4290: 75 65 6e 63 65 20 72 65 71 75 69 72 65 64 20 66  uence required f
42a0: 72 6f 6d 20 61 6e 20 69 6e 64 65 78 20 66 6f 72  rom an index for
42b0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 74  .        ** it t
42c0: 6f 20 62 65 20 75 73 65 66 75 6c 20 66 6f 72 20  o be useful for 
42d0: 6f 70 74 69 6d 69 73 69 6e 67 20 65 78 70 72 65  optimising expre
42e0: 73 73 69 6f 6e 20 70 58 2e 20 53 74 6f 72 65 20  ssion pX. Store 
42f0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  this.        ** 
4300: 76 61 6c 75 65 20 69 6e 20 76 61 72 69 61 62 6c  value in variabl
4310: 65 20 70 43 6f 6c 6c 2e 0a 20 20 20 20 20 20 20  e pColl..       
4320: 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
4330: 72 74 28 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20  rt(pX->pLeft);. 
4340: 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73         pColl = s
4350: 71 6c 69 74 65 33 42 69 6e 61 72 79 43 6f 6d 70  qlite3BinaryComp
4360: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
4370: 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c 20 70 58  e, pX->pLeft, pX
4380: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
4390: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b     if( !pColl ){
43a0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c  .          pColl
43b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
43c0: 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  DfltColl;.      
43d0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 6f 72    }..        for
43e0: 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43  (j=0; j<pIdx->nC
43f0: 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61  olumn && pIdx->a
4400: 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c  iColumn[j]!=iCol
4410: 75 6d 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20  umn; j++){}.    
4420: 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 70 49      assert( j<pI
4430: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20  dx->nColumn );. 
4440: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
4450: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d  e3StrICmp(pColl-
4460: 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a  >zName, pIdx->az
4470: 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69  Coll[j]) ) conti
4480: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
4490: 20 20 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b     return pTerm;
44a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
44b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  urn 0;.}../* For
44c0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
44d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78  /.static void ex
44e0: 70 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73  prAnalyze(SrcLis
44f0: 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65 2a  t*, WhereClause*
4500: 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43  , int);../*.** C
4510: 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65 20  all exprAnalyze 
4520: 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e 20  on all terms in 
4530: 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  a WHERE clause. 
4540: 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69   .**.**.*/.stati
4550: 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79  c void exprAnaly
4560: 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73 74  zeAll(.  SrcList
4570: 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 20   *pTabList,     
4580: 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c    /* the FROM cl
4590: 61 75 73 65 20 2a 2f 0a 20 20 57 68 65 72 65 43  ause */.  WhereC
45a0: 6c 61 75 73 65 20 2a 70 57 43 20 20 20 20 20 20  lause *pWC      
45b0: 20 20 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20     /* the WHERE 
45c0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61  clause to be ana
45d0: 6c 79 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  lyzed */.){.  in
45e0: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43  t i;.  for(i=pWC
45f0: 2d 3e 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b  ->nTerm-1; i>=0;
4600: 20 69 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41   i--){.    exprA
4610: 6e 61 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c  nalyze(pTabList,
4620: 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a   pWC, i);.  }.}.
4630: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4640: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
4650: 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 43 68 65  ZATION./*.** Che
4660: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
4670: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
4680: 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f 72 20 47  n is a LIKE or G
4690: 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20 74 68 61  LOB operator tha
46a0: 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f 70 74 69  t.** can be opti
46b0: 6d 69 7a 65 64 20 75 73 69 6e 67 20 69 6e 65 71  mized using ineq
46c0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
46d0: 74 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ts.  Return TRUE
46e0: 20 69 66 20 69 74 20 69 73 0a 2a 2a 20 73 6f 20   if it is.** so 
46f0: 61 6e 64 20 66 61 6c 73 65 20 69 66 20 6e 6f 74  and false if not
4700: 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72  ..**.** In order
4710: 20 66 6f 72 20 74 68 65 20 6f 70 65 72 61 74 6f   for the operato
4720: 72 20 74 6f 20 62 65 20 6f 70 74 69 6d 69 7a 69  r to be optimizi
4730: 62 6c 65 2c 20 74 68 65 20 52 48 53 20 6d 75 73  ble, the RHS mus
4740: 74 20 62 65 20 61 20 73 74 72 69 6e 67 0a 2a 2a  t be a string.**
4750: 20 6c 69 74 65 72 61 6c 20 74 68 61 74 20 64 6f   literal that do
4760: 65 73 20 6e 6f 74 20 62 65 67 69 6e 20 77 69 74  es not begin wit
4770: 68 20 61 20 77 69 6c 64 63 61 72 64 2e 20 20 0a  h a wildcard.  .
4780: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
4790: 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20 20 73 71  LikeOrGlob(.  sq
47a0: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
47b0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
47c0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
47d0: 2c 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20 74  ,      /* Test t
47e0: 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  his expression *
47f0: 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61 74 74 65  /.  int *pnPatte
4800: 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  rn,   /* Number 
4810: 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61 72 64 20  of non-wildcard 
4820: 70 72 65 66 69 78 20 63 68 61 72 61 63 74 65 72  prefix character
4830: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 73 43  s */.  int *pisC
4840: 6f 6d 70 6c 65 74 65 2c 20 2f 2a 20 54 72 75 65  omplete, /* True
4850: 20 69 66 20 74 68 65 20 6f 6e 6c 79 20 77 69 6c   if the only wil
4860: 64 63 61 72 64 20 69 73 20 25 20 69 6e 20 74 68  dcard is % in th
4870: 65 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72  e last character
4880: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 6f 43 61   */.  int *pnoCa
4890: 73 65 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  se      /* True 
48a0: 69 66 20 75 70 70 65 72 63 61 73 65 20 69 73 20  if uppercase is 
48b0: 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c 6f  equivalent to lo
48c0: 77 65 72 63 61 73 65 20 2a 2f 0a 29 7b 0a 20 20  wercase */.){.  
48d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
48e0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a   Expr *pRight, *
48f0: 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c 69 73  pLeft;.  ExprLis
4900: 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  t *pList;.  int 
4910: 63 2c 20 63 6e 74 3b 0a 20 20 63 68 61 72 20 77  c, cnt;.  char w
4920: 63 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  c[3];.  CollSeq 
4930: 2a 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21  *pColl;..  if( !
4940: 73 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e  sqlite3IsLikeFun
4950: 63 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c  ction(db, pExpr,
4960: 20 70 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b   pnoCase, wc) ){
4970: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4980: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
4990: 5f 45 42 43 44 49 43 0a 20 20 69 66 28 20 2a 70  _EBCDIC.  if( *p
49a0: 6e 6f 43 61 73 65 20 29 20 72 65 74 75 72 6e 20  noCase ) return 
49b0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 4c 69 73  0;.#endif.  pLis
49c0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
49d0: 3b 0a 20 20 70 52 69 67 68 74 20 3d 20 70 4c 69  ;.  pRight = pLi
49e0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
49f0: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
4a00: 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29 7b 0a 20  !=TK_STRING ){. 
4a10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4a20: 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c 69 73 74  .  pLeft = pList
4a30: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
4a40: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 21 3d 54  if( pLeft->op!=T
4a50: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
4a60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
4a70: 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74 2d 3e 70  pColl = pLeft->p
4a80: 43 6f 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Coll;.  assert( 
4a90: 70 43 6f 6c 6c 21 3d 30 20 7c 7c 20 70 4c 65 66  pColl!=0 || pLef
4aa0: 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29  t->iColumn==-1 )
4ab0: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
4ac0: 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 63 6f   ){.    /* No co
4ad0: 6c 6c 61 74 69 6f 6e 20 69 73 20 64 65 66 69 6e  llation is defin
4ae0: 65 64 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44  ed for the ROWID
4af0: 2e 20 20 55 73 65 20 74 68 65 20 64 65 66 61 75  .  Use the defau
4b00: 6c 74 2e 20 2a 2f 0a 20 20 20 20 70 43 6f 6c 6c  lt. */.    pColl
4b10: 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c   = db->pDfltColl
4b20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 43 6f  ;.  }.  if( (pCo
4b30: 6c 6c 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45  ll->type!=SQLITE
4b40: 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59 20 7c 7c 20  _COLL_BINARY || 
4b50: 2a 70 6e 6f 43 61 73 65 29 20 26 26 0a 20 20 20  *pnoCase) &&.   
4b60: 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21     (pColl->type!
4b70: 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f 43  =SQLITE_COLL_NOC
4b80: 41 53 45 20 7c 7c 20 21 2a 70 6e 6f 43 61 73 65  ASE || !*pnoCase
4b90: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4ba0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
4bb0: 44 65 71 75 6f 74 65 45 78 70 72 28 64 62 2c 20  DequoteExpr(db, 
4bc0: 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d 20 28  pRight);.  z = (
4bd0: 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d 3e 74  char *)pRight->t
4be0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 63 6e 74 20 3d 20  oken.z;.  cnt = 
4bf0: 30 3b 0a 20 20 69 66 28 20 7a 20 29 7b 0a 20 20  0;.  if( z ){.  
4c00: 20 20 77 68 69 6c 65 28 20 28 63 3d 7a 5b 63 6e    while( (c=z[cn
4c10: 74 5d 29 21 3d 30 20 26 26 20 63 21 3d 77 63 5b  t])!=0 && c!=wc[
4c20: 30 5d 20 26 26 20 63 21 3d 77 63 5b 31 5d 20 26  0] && c!=wc[1] &
4c30: 26 20 63 21 3d 77 63 5b 32 5d 20 29 7b 20 63 6e  & c!=wc[2] ){ cn
4c40: 74 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28  t++; }.  }.  if(
4c50: 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35 3d 3d   cnt==0 || 255==
4c60: 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a 20 20  (u8)z[cnt] ){.  
4c70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4c80: 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20 3d    *pisComplete =
4c90: 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d 20 26   z[cnt]==wc[0] &
4ca0: 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b 0a 20  & z[cnt+1]==0;. 
4cb0: 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20 63 6e   *pnPattern = cn
4cc0: 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  t;.  return 1;.}
4cd0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
4ce0: 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49  E_OMIT_LIKE_OPTI
4cf0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 0a 23 69  MIZATION */...#i
4d00: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
4d10: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f  T_VIRTUALTABLE./
4d20: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
4d30: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
4d40: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20  xpression is of 
4d50: 74 68 65 20 66 6f 72 6d 0a 2a 2a 0a 2a 2a 20 20  the form.**.**  
4d60: 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 4d 41         column MA
4d70: 54 43 48 20 65 78 70 72 0a 2a 2a 0a 2a 2a 20 49  TCH expr.**.** I
4d80: 66 20 69 74 20 69 73 20 74 68 65 6e 20 72 65 74  f it is then ret
4d90: 75 72 6e 20 54 52 55 45 2e 20 20 49 66 20 6e 6f  urn TRUE.  If no
4da0: 74 2c 20 72 65 74 75 72 6e 20 46 41 4c 53 45 2e  t, return FALSE.
4db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
4dc0: 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d 6e 28 0a  sMatchOfColumn(.
4dd0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
4de0: 20 20 20 2f 2a 20 54 65 73 74 20 74 68 69 73 20     /* Test this 
4df0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 29 7b  expression */.){
4e00: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
4e10: 73 74 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  st;..  if( pExpr
4e20: 2d 3e 6f 70 21 3d 54 4b 5f 46 55 4e 43 54 49 4f  ->op!=TK_FUNCTIO
4e30: 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  N ){.    return 
4e40: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 45 78  0;.  }.  if( pEx
4e50: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 35 20 7c  pr->token.n!=5 |
4e60: 7c 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  |.       sqlite3
4e70: 53 74 72 4e 49 43 6d 70 28 28 63 6f 6e 73 74 20  StrNICmp((const 
4e80: 63 68 61 72 2a 29 70 45 78 70 72 2d 3e 74 6f 6b  char*)pExpr->tok
4e90: 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29 21  en.z,"match",5)!
4ea0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
4eb0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74 20   0;.  }.  pList 
4ec0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
4ed0: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45 78    if( pList->nEx
4ee0: 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65 74  pr!=2 ){.    ret
4ef0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
4f00: 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78   pList->a[1].pEx
4f10: 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f 4c  pr->op != TK_COL
4f20: 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  UMN ){.    retur
4f30: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
4f40: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
4f50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
4f60: 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a  TUALTABLE */../*
4f70: 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73 65  .** If the pBase
4f80: 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69 67   expression orig
4f90: 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f 4e  inated in the ON
4fa0: 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65   or USING clause
4fb0: 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20 74   of.** a join, t
4fc0: 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65  hen transfer the
4fd0: 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61 72   appropriate mar
4fe0: 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64 65  kings over to de
4ff0: 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  rived..*/.static
5000: 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a 6f   void transferJo
5010: 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72 20  inMarkings(Expr 
5020: 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72 20  *pDerived, Expr 
5030: 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72 69  *pBase){.  pDeri
5040: 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70 42  ved->flags |= pB
5050: 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ase->flags & EP_
5060: 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65 72  FromJoin;.  pDer
5070: 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69 6e  ived->iRightJoin
5080: 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e 69  Table = pBase->i
5090: 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b 0a  RightJoinTable;.
50a0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
50b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f 4f  SQLITE_OMIT_OR_O
50c0: 50 54 49 4d 49 5a 41 54 49 4f 4e 29 20 26 26 20  PTIMIZATION) && 
50d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
50e0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a 2f  OMIT_SUBQUERY)./
50f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
5100: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 74 65   if the given te
5110: 72 6d 20 6f 66 20 61 6e 20 4f 52 20 63 6c 61 75  rm of an OR clau
5120: 73 65 20 63 61 6e 20 62 65 20 63 6f 6e 76 65 72  se can be conver
5130: 74 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 6e 20 49  ted.** into an I
5140: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 69  N clause.  The i
5150: 43 75 72 73 6f 72 20 61 6e 64 20 69 43 6f 6c 75  Cursor and iColu
5160: 6d 6e 20 64 65 66 69 6e 65 20 74 68 65 20 6c 65  mn define the le
5170: 66 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 64 65 20  ft-hand.** side 
5180: 6f 66 20 74 68 65 20 49 4e 20 63 6c 61 75 73 65  of the IN clause
5190: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 74  ..**.** The cont
51a0: 65 78 74 20 69 73 20 74 68 61 74 20 77 65 20 68  ext is that we h
51b0: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 4f 52 2d  ave multiple OR-
51c0: 63 6f 6e 6e 65 63 74 65 64 20 65 71 75 61 6c 69  connected equali
51d0: 74 79 20 74 65 72 6d 73 0a 2a 2a 20 6c 69 6b 65  ty terms.** like
51e0: 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
51f0: 20 20 20 20 20 20 20 61 3d 3c 65 78 70 72 31 3e         a=<expr1>
5200: 20 4f 52 20 20 61 3d 3c 65 78 70 72 32 3e 20 4f   OR  a=<expr2> O
5210: 52 20 62 3d 3c 65 78 70 72 33 3e 20 20 4f 52 20  R b=<expr3>  OR 
5220: 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 4f  ....**.** The pO
5230: 72 54 65 72 6d 20 69 6e 70 75 74 20 74 6f 20 74  rTerm input to t
5240: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 72 72  his routine corr
5250: 65 73 70 6f 6e 64 73 20 74 6f 20 61 20 73 69 6e  esponds to a sin
5260: 67 6c 65 20 74 65 72 6d 20 6f 66 0a 2a 2a 20 74  gle term of.** t
5270: 68 69 73 20 4f 52 20 63 6c 61 75 73 65 2e 20 20  his OR clause.  
5280: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
5290: 20 74 65 72 6d 20 74 6f 20 62 65 20 61 20 63 6f   term to be a co
52a0: 6e 64 69 64 61 74 65 20 66 6f 72 0a 2a 2a 20 63  ndidate for.** c
52b0: 6f 6e 76 65 72 73 69 6f 6e 20 74 6f 20 61 6e 20  onversion to an 
52c0: 49 4e 20 6f 70 65 72 61 74 6f 72 2c 20 74 68 65  IN operator, the
52d0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 73 74 20   following must 
52e0: 62 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  be true:.**.**  
52f0: 20 20 20 2a 20 20 54 68 65 20 6c 65 66 74 2d 68     *  The left-h
5300: 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20  and side of the 
5310: 74 65 72 6d 20 6d 75 73 74 20 62 65 20 74 68 65  term must be the
5320: 20 63 6f 6c 75 6d 6e 20 77 68 69 63 68 0a 2a 2a   column which.**
5330: 20 20 20 20 20 20 20 20 69 73 20 69 64 65 6e 74          is ident
5340: 69 66 69 65 64 20 62 79 20 69 43 75 72 73 6f 72  ified by iCursor
5350: 20 61 6e 64 20 69 43 6f 6c 75 6d 6e 2e 0a 2a 2a   and iColumn..**
5360: 0a 2a 2a 20 20 20 20 20 2a 20 20 49 66 20 74 68  .**     *  If th
5370: 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  e right-hand sid
5380: 65 20 69 73 20 61 6c 73 6f 20 61 20 63 6f 6c 75  e is also a colu
5390: 6d 6e 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66  mn, then the aff
53a0: 69 6e 69 74 69 65 73 0a 2a 2a 20 20 20 20 20 20  inities.**      
53b0: 20 20 6f 66 20 62 6f 74 68 20 72 69 67 68 74 20    of both right 
53c0: 61 6e 64 20 6c 65 66 74 20 73 69 64 65 73 20 6d  and left sides m
53d0: 75 73 74 20 62 65 20 73 75 63 68 20 74 68 61 74  ust be such that
53e0: 20 6e 6f 20 74 79 70 65 0a 2a 2a 20 20 20 20 20   no type.**     
53f0: 20 20 20 63 6f 6e 76 65 72 73 69 6f 6e 73 20 61     conversions a
5400: 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 74  re required on t
5410: 68 65 20 72 69 67 68 74 2e 20 20 28 54 69 63 6b  he right.  (Tick
5420: 65 74 20 23 32 32 34 39 29 0a 2a 2a 0a 2a 2a 20  et #2249).**.** 
5430: 49 66 20 62 6f 74 68 20 6f 66 20 74 68 65 73 65  If both of these
5440: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 72 65 20   conditions are 
5450: 74 72 75 65 2c 20 74 68 65 6e 20 72 65 74 75 72  true, then retur
5460: 6e 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69  n true.  Otherwi
5470: 73 65 0a 2a 2a 20 72 65 74 75 72 6e 20 66 61 6c  se.** return fal
5480: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5490: 74 20 6f 72 54 65 72 6d 49 73 4f 70 74 43 61 6e  t orTermIsOptCan
54a0: 64 69 64 61 74 65 28 57 68 65 72 65 54 65 72 6d  didate(WhereTerm
54b0: 20 2a 70 4f 72 54 65 72 6d 2c 20 69 6e 74 20 69   *pOrTerm, int i
54c0: 43 75 72 73 6f 72 2c 20 69 6e 74 20 69 43 6f 6c  Cursor, int iCol
54d0: 75 6d 6e 29 7b 0a 20 20 69 6e 74 20 61 66 66 4c  umn){.  int affL
54e0: 65 66 74 2c 20 61 66 66 52 69 67 68 74 3b 0a 20  eft, affRight;. 
54f0: 20 61 73 73 65 72 74 28 20 70 4f 72 54 65 72 6d   assert( pOrTerm
5500: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
5510: 45 51 20 29 3b 0a 20 20 69 66 28 20 70 4f 72 54  EQ );.  if( pOrT
5520: 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 21  erm->leftCursor!
5530: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
5540: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5550: 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66  if( pOrTerm->lef
5560: 74 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e  tColumn!=iColumn
5570: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
5580: 3b 0a 20 20 7d 0a 20 20 61 66 66 52 69 67 68 74  ;.  }.  affRight
5590: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
55a0: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
55b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
55c0: 20 20 69 66 28 20 61 66 66 52 69 67 68 74 3d 3d    if( affRight==
55d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
55e0: 31 3b 0a 20 20 7d 0a 20 20 61 66 66 4c 65 66 74  1;.  }.  affLeft
55f0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
5600: 66 69 6e 69 74 79 28 70 4f 72 54 65 72 6d 2d 3e  finity(pOrTerm->
5610: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5620: 20 69 66 28 20 61 66 66 52 69 67 68 74 21 3d 61   if( affRight!=a
5630: 66 66 4c 65 66 74 20 29 7b 0a 20 20 20 20 72 65  ffLeft ){.    re
5640: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
5650: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
5660: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
5670: 74 68 65 20 67 69 76 65 6e 20 74 65 72 6d 20 6f  the given term o
5680: 66 20 61 6e 20 4f 52 20 63 6c 61 75 73 65 20 63  f an OR clause c
5690: 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 20 64 75  an be ignored du
56a0: 72 69 6e 67 0a 2a 2a 20 61 20 63 68 65 63 6b 20  ring.** a check 
56b0: 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  to make sure all
56c0: 20 4f 52 20 74 65 72 6d 73 20 61 72 65 20 63 61   OR terms are ca
56d0: 6e 64 69 64 61 74 65 73 20 66 6f 72 20 6f 70 74  ndidates for opt
56e0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  imization..** In
56f0: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
5700: 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 20 63  turn true if a c
5710: 61 6c 6c 20 74 6f 20 74 68 65 20 6f 72 54 65 72  all to the orTer
5720: 6d 49 73 4f 70 74 43 61 6e 64 69 64 61 74 65 28  mIsOptCandidate(
5730: 29 0a 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72  ).** above retur
5740: 6e 65 64 20 66 61 6c 73 65 20 62 75 74 20 69 74  ned false but it
5750: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
5760: 79 20 74 6f 20 64 69 73 71 75 61 6c 69 66 79 20  y to disqualify 
5770: 74 68 65 0a 2a 2a 20 6f 70 74 69 6d 69 7a 61 74  the.** optimizat
5780: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  ion..**.** Suppo
5790: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  se the original 
57a0: 4f 52 20 70 68 72 61 73 65 20 77 61 73 20 74 68  OR phrase was th
57b0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
57c0: 20 20 20 20 61 3d 34 20 20 4f 52 20 20 61 3d 31      a=4  OR  a=1
57d0: 31 20 20 4f 52 20 20 61 3d 62 0a 2a 2a 0a 2a 2a  1  OR  a=b.**.**
57e0: 20 44 75 72 69 6e 67 20 61 6e 61 6c 79 73 69 73   During analysis
57f0: 2c 20 74 68 65 20 74 68 69 72 64 20 74 65 72 6d  , the third term
5800: 20 67 65 74 73 20 66 6c 69 70 70 65 64 20 61 72   gets flipped ar
5810: 6f 75 6e 64 20 61 6e 64 20 64 75 70 6c 69 63 61  ound and duplica
5820: 74 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 77 65  te.** so that we
5830: 20 61 72 65 20 6c 65 66 74 20 77 69 74 68 20 74   are left with t
5840: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
5850: 20 20 20 20 20 61 3d 34 20 20 4f 52 20 20 61 3d       a=4  OR  a=
5860: 31 31 20 20 4f 52 20 20 61 3d 62 20 20 4f 52 20  11  OR  a=b  OR 
5870: 20 62 3d 61 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65   b=a.**.** Since
5880: 20 74 68 65 20 6c 61 73 74 20 74 77 6f 20 74 65   the last two te
5890: 72 6d 73 20 61 72 65 20 64 75 70 6c 69 63 61 74  rms are duplicat
58a0: 65 73 2c 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66 20  es, only one of 
58b0: 74 68 65 6d 0a 2a 2a 20 68 61 73 20 74 6f 20 71  them.** has to q
58c0: 75 61 6c 69 66 79 20 69 6e 20 6f 72 64 65 72 20  ualify in order 
58d0: 66 6f 72 20 74 68 65 20 77 68 6f 6c 65 20 70 68  for the whole ph
58e0: 72 61 73 65 20 74 6f 20 71 75 61 6c 69 66 79 2e  rase to qualify.
58f0: 20 20 57 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72    When.** this r
5900: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5910: 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 70  , we know that p
5920: 4f 72 54 65 72 6d 20 64 69 64 20 6e 6f 74 20 71  OrTerm did not q
5930: 75 61 6c 69 66 79 2e 0a 2a 2a 20 54 68 69 73 20  ualify..** This 
5940: 72 6f 75 74 69 6e 65 20 6d 65 72 65 6c 79 20 63  routine merely c
5950: 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
5960: 70 4f 72 54 65 72 6d 20 68 61 73 20 61 20 64 75  pOrTerm has a du
5970: 70 6c 69 63 61 74 65 20 74 68 61 74 0a 2a 2a 20  plicate that.** 
5980: 6d 69 67 68 74 20 71 75 61 6c 69 66 79 2e 20 20  might qualify.  
5990: 49 66 20 74 68 65 72 65 20 69 73 20 61 20 64 75  If there is a du
59a0: 70 6c 69 63 61 74 65 20 74 68 61 74 20 68 61 73  plicate that has
59b0: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a   not yet been.**
59c0: 20 64 69 73 71 75 61 6c 69 66 69 65 64 2c 20 74   disqualified, t
59d0: 68 65 6e 20 72 65 74 75 72 6e 20 74 72 75 65 2e  hen return true.
59e0: 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e    If there are n
59f0: 6f 20 64 75 70 6c 69 63 61 74 65 73 2c 20 6f 72  o duplicates, or
5a00: 0a 2a 2a 20 74 68 65 20 64 75 70 6c 69 63 61 74  .** the duplicat
5a10: 65 20 68 61 73 20 61 6c 73 6f 20 62 65 65 6e 20  e has also been 
5a20: 64 69 73 71 75 61 6c 69 66 65 64 2c 20 72 65 74  disqualifed, ret
5a30: 75 72 6e 20 66 61 6c 73 65 2e 0a 2a 2f 0a 73 74  urn false..*/.st
5a40: 61 74 69 63 20 69 6e 74 20 6f 72 54 65 72 6d 48  atic int orTermH
5a50: 61 73 4f 6b 44 75 70 6c 69 63 61 74 65 28 57 68  asOkDuplicate(Wh
5a60: 65 72 65 43 6c 61 75 73 65 20 2a 70 4f 72 2c 20  ereClause *pOr, 
5a70: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 72 54 65  WhereTerm *pOrTe
5a80: 72 6d 29 7b 0a 20 20 69 66 28 20 70 4f 72 54 65  rm){.  if( pOrTe
5a90: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5aa0: 5f 43 4f 50 49 45 44 20 29 7b 0a 20 20 20 20 2f  _COPIED ){.    /
5ab0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6f 72  * This is the or
5ac0: 69 67 69 6e 61 6c 20 74 65 72 6d 2e 20 20 54 68  iginal term.  Th
5ad0: 65 20 64 75 70 6c 69 63 61 74 65 20 69 73 20 74  e duplicate is t
5ae0: 6f 20 74 68 65 20 6c 65 66 74 20 68 61 64 0a 20  o the left had. 
5af0: 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 79 65     ** has not ye
5b00: 74 20 62 65 65 6e 20 61 6e 61 6c 79 7a 65 64 20  t been analyzed 
5b10: 61 6e 64 20 74 68 75 73 20 68 61 73 20 6e 6f 74  and thus has not
5b20: 20 79 65 74 20 62 65 65 6e 20 64 69 73 71 75 61   yet been disqua
5b30: 6c 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 72  lified. */.    r
5b40: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
5b50: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  f( (pOrTerm->fla
5b60: 67 73 20 26 20 54 45 52 4d 5f 56 49 52 54 55 41  gs & TERM_VIRTUA
5b70: 4c 29 21 3d 30 0a 20 20 20 20 20 26 26 20 28 70  L)!=0.     && (p
5b80: 4f 72 2d 3e 61 5b 70 4f 72 54 65 72 6d 2d 3e 69  Or->a[pOrTerm->i
5b90: 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73 20 26 20  Parent].flags & 
5ba0: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d 30 20 29  TERM_OR_OK)!=0 )
5bb0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73  {.    /* This is
5bc0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 74 65 72   a duplicate ter
5bd0: 6d 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  m.  The original
5be0: 20 71 75 61 6c 69 66 69 65 64 20 73 6f 20 74 68   qualified so th
5bf0: 69 73 20 6f 6e 65 0a 20 20 20 20 2a 2a 20 64 6f  is one.    ** do
5c00: 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 2e 20  es not have to. 
5c10: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  */.    return 1;
5c20: 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 69 73 20 69  .  }.  /* This i
5c30: 73 20 65 69 74 68 65 72 20 61 20 73 69 6e 67 6c  s either a singl
5c40: 65 74 6f 6e 20 74 65 72 6d 20 6f 72 20 65 6c 73  eton term or els
5c50: 65 20 69 74 20 69 73 20 61 20 64 75 70 6c 69 63  e it is a duplic
5c60: 61 74 65 20 66 6f 72 0a 20 20 2a 2a 20 77 68 69  ate for.  ** whi
5c70: 63 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ch the original 
5c80: 64 69 64 20 6e 6f 74 20 71 75 61 6c 69 66 79 2e  did not qualify.
5c90: 20 20 45 69 74 68 65 72 20 77 61 79 20 77 65 20    Either way we 
5ca0: 61 72 65 20 64 6f 6e 65 20 66 6f 72 2e 20 2a 2f  are done for. */
5cb0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
5cc0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
5cd0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
5ce0: 41 54 49 4f 4e 20 26 26 20 21 53 51 4c 49 54 45  ATION && !SQLITE
5cf0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a  _OMIT_SUBQUERY *
5d00: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  /../*.** The inp
5d10: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
5d20: 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65 54 65  ne is an WhereTe
5d30: 72 6d 20 73 74 72 75 63 74 75 72 65 20 77 69 74  rm structure wit
5d40: 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70  h only the.** "p
5d50: 45 78 70 72 22 20 66 69 65 6c 64 20 66 69 6c 6c  Expr" field fill
5d60: 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f 62 20  ed in.  The job 
5d70: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
5d80: 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74 68  is to analyze th
5d90: 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69  e.** subexpressi
5da0: 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 20  on and populate 
5db0: 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20 66 69  all the other fi
5dc0: 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68 65 72  elds of the Wher
5dd0: 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63 74 75  eTerm.** structu
5de0: 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  re..**.** If the
5df0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
5e00: 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65 78 70  f the form "<exp
5e10: 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20 67 65  r> <op> X" it ge
5e20: 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74  ts commuted.** t
5e30: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 66  o the standard f
5e40: 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e 20 3c  orm of "X <op> <
5e50: 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68 65 20  expr>".  If the 
5e60: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f 66  expression is of
5e70: 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22 58 20  .** the form "X 
5e80: 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20 62 6f  <op> Y" where bo
5e90: 74 68 20 58 20 61 6e 64 20 59 20 61 72 65 20 63  th X and Y are c
5ea0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74 68 65  olumns, then the
5eb0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65 78 70   original.** exp
5ec0: 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63 68 61  ression is uncha
5ed0: 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77 20 76  nged and a new v
5ee0: 69 72 74 75 61 6c 20 65 78 70 72 65 73 73 69 6f  irtual expressio
5ef0: 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  n of the form.**
5f00: 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73 20 61   "Y <op> X" is a
5f10: 64 64 65 64 20 74 6f 20 74 68 65 20 57 48 45 52  dded to the WHER
5f20: 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61 6e 61  E clause and ana
5f30: 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65 6c 79  lyzed separately
5f40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5f50: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a 20 20   exprAnalyze(.  
5f60: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 20  SrcList *pSrc,  
5f70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65            /* the
5f80: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
5f90: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
5fa0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
5fb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5fc0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5fe0: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
5ff0: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
6000: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
6010: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 45  Term *pTerm;.  E
6020: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
6030: 6b 53 65 74 3b 0a 20 20 45 78 70 72 20 2a 70 45  kSet;.  Expr *pE
6040: 78 70 72 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70  xpr;.  Bitmask p
6050: 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 42 69 74  rereqLeft;.  Bit
6060: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 0a  mask prereqAll;.
6070: 20 20 69 6e 74 20 6e 50 61 74 74 65 72 6e 3b 0a    int nPattern;.
6080: 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65    int isComplete
6090: 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65 3b 0a  ;.  int noCase;.
60a0: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 50 61 72 73    int op;.  Pars
60b0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43 2d  e *pParse = pWC-
60c0: 3e 70 50 61 72 73 65 3b 0a 20 20 73 71 6c 69 74  >pParse;.  sqlit
60d0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
60e0: 3e 64 62 3b 0a 0a 20 20 69 66 28 20 64 62 2d 3e  >db;..  if( db->
60f0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
6100: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6110: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
6120: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 70 4d  a[idxTerm];.  pM
6130: 61 73 6b 53 65 74 20 3d 20 70 57 43 2d 3e 70 4d  askSet = pWC->pM
6140: 61 73 6b 53 65 74 3b 0a 20 20 70 45 78 70 72 20  askSet;.  pExpr 
6150: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a  = pTerm->pExpr;.
6160: 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65    prereqLeft = e
6170: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
6180: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
6190: 4c 65 66 74 29 3b 0a 20 20 6f 70 20 3d 20 70 45  Left);.  op = pE
61a0: 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66 28 20 6f  xpr->op;.  if( o
61b0: 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p==TK_IN ){.    
61c0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
61d0: 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20  Right==0 );.    
61e0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
61f0: 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61 62  ht = exprListTab
6200: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
6210: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 0a  , pExpr->pList).
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6230: 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70 72            | expr
6240: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
6250: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
6260: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 65  ->pSelect);.  }e
6270: 6c 73 65 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49  lse if( op==TK_I
6280: 53 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 70 54 65  SNULL ){.    pTe
6290: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
62a0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
62b0: 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52    pTerm->prereqR
62c0: 69 67 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65  ight = exprTable
62d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
62e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
62f0: 20 20 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20    }.  prereqAll 
6300: 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65  = exprTableUsage
6310: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
6320: 29 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  );.  if( ExprHas
6330: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6340: 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a  EP_FromJoin) ){.
6350: 20 20 20 20 42 69 74 6d 61 73 6b 20 78 20 3d 20      Bitmask x = 
6360: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
6370: 2c 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a  , pExpr->iRightJ
6380: 6f 69 6e 54 61 62 6c 65 29 3b 0a 20 20 20 20 70  oinTable);.    p
6390: 72 65 72 65 71 41 6c 6c 20 7c 3d 20 78 3b 0a 20  rereqAll |= x;. 
63a0: 20 20 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71     pTerm->prereq
63b0: 52 69 67 68 74 20 7c 3d 20 78 2d 31 3b 20 2f 2a  Right |= x-1; /*
63c0: 20 4f 4e 20 63 6c 61 75 73 65 20 74 65 72 6d 73   ON clause terms
63d0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
63e0: 20 77 69 74 68 20 61 6e 20 69 6e 64 65 78 0a 20   with an index. 
63f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
6410: 20 6f 6e 20 6c 65 66 74 20 74 61 62 6c 65 20 6f   on left table o
6420: 66 20 61 20 4c 45 46 54 20 4a 4f 49 4e 2e 20 20  f a LEFT JOIN.  
6430: 54 69 63 6b 65 74 20 23 33 30 31 35 20 2a 2f 0a  Ticket #3015 */.
6440: 20 20 7d 0a 20 20 70 54 65 72 6d 2d 3e 70 72 65    }.  pTerm->pre
6450: 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65 71 41  reqAll = prereqA
6460: 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d 3e 6c 65 66  ll;.  pTerm->lef
6470: 74 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20  tCursor = -1;.  
6480: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 20 3d  pTerm->iParent =
6490: 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d 3e 65 4f   -1;.  pTerm->eO
64a0: 70 65 72 61 74 6f 72 20 3d 20 30 3b 0a 20 20 69  perator = 0;.  i
64b0: 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29  f( allowedOp(op)
64c0: 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72   && (pTerm->prer
64d0: 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65 71  eqRight & prereq
64e0: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
64f0: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
6500: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
6510: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
6520: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
6530: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
6540: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
6550: 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43      pTerm->leftC
6560: 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69  ursor = pLeft->i
6570: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54 65  Table;.      pTe
6580: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d  rm->leftColumn =
6590: 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b   pLeft->iColumn;
65a0: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65 4f  .      pTerm->eO
65b0: 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74  perator = operat
65c0: 6f 72 4d 61 73 6b 28 6f 70 29 3b 0a 20 20 20 20  orMask(op);.    
65d0: 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67 68 74  }.    if( pRight
65e0: 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d   && pRight->op==
65f0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
6600: 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e     WhereTerm *pN
6610: 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  ew;.      Expr *
6620: 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20  pDup;.      if( 
6630: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
6640: 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  r>=0 ){.        
6650: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
6660: 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74      pDup = sqlit
6670: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 45  e3ExprDup(db, pE
6680: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
6690: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
66a0: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
66b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
66c0: 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  e(pDup);.       
66d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
66e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 64 78     }.        idx
66f0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
6700: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75  eInsert(pWC, pDu
6710: 70 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  p, TERM_VIRTUAL|
6720: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
6730: 20 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65         if( idxNe
6740: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  w==0 ) return;. 
6750: 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70         pNew = &p
6760: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20  WC->a[idxNew];. 
6770: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61         pNew->iPa
6780: 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a  rent = idxTerm;.
6790: 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20          pTerm = 
67a0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
67b0: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
67c0: 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20  >nChild = 1;.   
67d0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67       pTerm->flag
67e0: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44  s |= TERM_COPIED
67f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6800: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
6810: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  xpr;.        pNe
6820: 77 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20  w = pTerm;.     
6830: 20 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d   }.      exprCom
6840: 6d 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20  mute(pDup);.    
6850: 20 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e    pLeft = pDup->
6860: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65  pLeft;.      pNe
6870: 77 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20  w->leftCursor = 
6880: 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20  pLeft->iTable;. 
6890: 20 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43       pNew->leftC
68a0: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
68b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
68c0: 65 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  ew->prereqRight 
68d0: 3d 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  = prereqLeft;.  
68e0: 20 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71      pNew->prereq
68f0: 41 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b  All = prereqAll;
6900: 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70  .      pNew->eOp
6910: 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f  erator = operato
6920: 72 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b  rMask(pDup->op);
6930: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
6940: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6950: 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41  BETWEEN_OPTIMIZA
6960: 54 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74  TION.  /* If a t
6970: 65 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45  erm is the BETWE
6980: 45 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65  EN operator, cre
6990: 61 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74  ate two new virt
69a0: 75 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74  ual terms.  ** t
69b0: 68 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72  hat define the r
69c0: 61 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45  ange that the BE
69d0: 54 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73  TWEEN implements
69e0: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66  ..  */.  else if
69f0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
6a00: 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45  BETWEEN ){.    E
6a10: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6a20: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
6a30: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74     int i;.    st
6a40: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70  atic const u8 op
6a50: 73 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b  s[] = {TK_GE, TK
6a60: 5f 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74  _LE};.    assert
6a70: 28 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20  ( pList!=0 );.  
6a80: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
6a90: 3e 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20  >nExpr==2 );.   
6aa0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69   for(i=0; i<2; i
6ab0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
6ac0: 2a 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20  *pNewExpr;.     
6ad0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
6ae0: 20 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71     pNewExpr = sq
6af0: 6c 69 74 65 33 45 78 70 72 28 64 62 2c 20 6f 70  lite3Expr(db, op
6b00: 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78 70  s[i], sqlite3Exp
6b10: 72 44 75 70 28 64 62 2c 20 70 45 78 70 72 2d 3e  rDup(db, pExpr->
6b20: 70 4c 65 66 74 29 2c 0a 20 20 20 20 20 20 20 20  pLeft),.        
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
6b50: 44 75 70 28 64 62 2c 20 70 4c 69 73 74 2d 3e 61  Dup(db, pList->a
6b60: 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30 29 3b 0a  [i].pExpr), 0);.
6b70: 20 20 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77        idxNew = w
6b80: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
6b90: 28 70 57 43 2c 20 70 4e 65 77 45 78 70 72 2c 20  (pWC, pNewExpr, 
6ba0: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
6bb0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
6bc0: 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53    exprAnalyze(pS
6bd0: 72 63 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29  rc, pWC, idxNew)
6be0: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
6bf0: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
6c00: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
6c10: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
6c20: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a   idxTerm;.    }.
6c30: 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c      pTerm->nChil
6c40: 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 2;.  }.#endi
6c50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
6c60: 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a  _BETWEEN_OPTIMIZ
6c70: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64  ATION */..#if !d
6c80: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6c90: 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49  IT_OR_OPTIMIZATI
6ca0: 4f 4e 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ON) && !defined(
6cb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
6cc0: 55 45 52 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d  UERY).  /* Attem
6cd0: 70 74 20 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52  pt to convert OR
6ce0: 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65 72 6d 73  -connected terms
6cf0: 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72   into an IN oper
6d00: 61 74 6f 72 20 73 6f 20 74 68 61 74 0a 20 20 2a  ator so that.  *
6d10: 2a 20 74 68 65 79 20 63 61 6e 20 6d 61 6b 65 20  * they can make 
6d20: 75 73 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20  use of indices. 
6d30: 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20   Example:.  **. 
6d40: 20 2a 2a 20 20 20 20 20 20 78 20 3d 20 65 78 70   **      x = exp
6d50: 72 31 20 20 4f 52 20 20 65 78 70 72 32 20 3d 20  r1  OR  expr2 = 
6d60: 78 20 20 4f 52 20 20 78 20 3d 20 65 78 70 72 33  x  OR  x = expr3
6d70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f  .  **.  ** is co
6d80: 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a  nverted into.  *
6d90: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 49 4e  *.  **      x IN
6da0: 20 28 65 78 70 72 31 2c 65 78 70 72 32 2c 65 78   (expr1,expr2,ex
6db0: 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  pr3).  **.  ** T
6dc0: 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
6dd0: 20 6d 75 73 74 20 62 65 20 6f 6d 69 74 74 65 64   must be omitted
6de0: 20 69 66 20 4f 4d 49 54 5f 53 55 42 51 55 45 52   if OMIT_SUBQUER
6df0: 59 20 69 73 20 64 65 66 69 6e 65 64 20 62 65 63  Y is defined bec
6e00: 61 75 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ause.  ** the co
6e10: 6d 70 69 6c 65 72 20 66 6f 72 20 74 68 65 20 74  mpiler for the t
6e20: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69  he IN operator i
6e30: 73 20 70 61 72 74 20 6f 66 20 73 75 62 2d 71 75  s part of sub-qu
6e40: 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c  eries..  */.  el
6e50: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
6e60: 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69  ==TK_OR ){.    i
6e70: 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69  nt ok;.    int i
6e80: 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f  , j;.    int iCo
6e90: 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20  lumn, iCursor;. 
6ea0: 20 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 73     WhereClause s
6eb0: 4f 72 3b 0a 20 20 20 20 57 68 65 72 65 54 65 72  Or;.    WhereTer
6ec0: 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20  m *pOrTerm;..   
6ed0: 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
6ee0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
6ef0: 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20  NAMIC)==0 );.   
6f00: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
6f10: 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72  (&sOr, pWC->pPar
6f20: 73 65 2c 20 70 4d 61 73 6b 53 65 74 29 3b 0a 20  se, pMaskSet);. 
6f30: 20 20 20 77 68 65 72 65 53 70 6c 69 74 28 26 73     whereSplit(&s
6f40: 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b 5f 4f 52  Or, pExpr, TK_OR
6f50: 29 3b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c 79  );.    exprAnaly
6f60: 7a 65 41 6c 6c 28 70 53 72 63 2c 20 26 73 4f 72  zeAll(pSrc, &sOr
6f70: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
6f80: 4f 72 2e 6e 54 65 72 6d 3e 3d 32 20 29 3b 0a 20  Or.nTerm>=2 );. 
6f90: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 69 66     j = 0;.    if
6fa0: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
6fb0: 65 64 20 29 20 67 6f 74 6f 20 6f 72 5f 6e 6f 74  ed ) goto or_not
6fc0: 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20 20 64  _possible;.    d
6fd0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
6fe0: 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b 0a   j<sOr.nTerm );.
6ff0: 20 20 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20        iColumn = 
7000: 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c  sOr.a[j].leftCol
7010: 75 6d 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73  umn;.      iCurs
7020: 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65  or = sOr.a[j].le
7030: 66 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ftCursor;.      
7040: 6f 6b 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b  ok = iCursor>=0;
7050: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72  .      for(i=sOr
7060: 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72  .nTerm-1, pOrTer
7070: 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26  m=sOr.a; i>=0 &&
7080: 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72   ok; i--, pOrTer
7090: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
70a0: 28 20 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72  ( pOrTerm->eOper
70b0: 61 74 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20  ator!=WO_EQ ){. 
70c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72           goto or
70d0: 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20  _not_possible;. 
70e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
70f0: 20 69 66 28 20 6f 72 54 65 72 6d 49 73 4f 70 74   if( orTermIsOpt
7100: 43 61 6e 64 69 64 61 74 65 28 70 4f 72 54 65 72  Candidate(pOrTer
7110: 6d 2c 20 69 43 75 72 73 6f 72 2c 20 69 43 6f 6c  m, iCursor, iCol
7120: 75 6d 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  umn) ){.        
7130: 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73    pOrTerm->flags
7140: 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a   |= TERM_OR_OK;.
7150: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7160: 28 20 6f 72 54 65 72 6d 48 61 73 4f 6b 44 75 70  ( orTermHasOkDup
7170: 6c 69 63 61 74 65 28 26 73 4f 72 2c 20 70 4f 72  licate(&sOr, pOr
7180: 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 20  Term) ){.       
7190: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
71a0: 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b  s &= ~TERM_OR_OK
71b0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
71c0: 0a 20 20 20 20 20 20 20 20 20 20 6f 6b 20 3d 20  .          ok = 
71d0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
71e0: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
71f0: 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a   !ok && (sOr.a[j
7200: 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54 45 52 4d  ++].flags & TERM
7210: 5f 43 4f 50 49 45 44 29 21 3d 30 20 26 26 20 6a  _COPIED)!=0 && j
7220: 3c 32 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 6b  <2 );.    if( ok
7230: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   ){.      ExprLi
7240: 73 74 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  st *pList = 0;. 
7250: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 2c       Expr *pNew,
7260: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 45 78   *pDup;.      Ex
7270: 70 72 20 2a 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr *pLeft = 0;. 
7280: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
7290: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
72a0: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
72b0: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
72c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
72d0: 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20  (pOrTerm->flags 
72e0: 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30  & TERM_OR_OK)==0
72f0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7300: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
7330: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
7340: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
7350: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 57  xprListAppend(pW
7360: 43 2d 3e 70 50 61 72 73 65 2c 20 70 4c 69 73 74  C->pParse, pList
7370: 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20 20 20 20  , pDup, 0);.    
7380: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 4f 72 54      pLeft = pOrT
7390: 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70 4c 65 66  erm->pExpr->pLef
73a0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
73b0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d   assert( pLeft!=
73c0: 30 20 29 3b 0a 20 20 20 20 20 20 70 44 75 70 20  0 );.      pDup 
73d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
73e0: 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  (db, pLeft);.   
73f0: 20 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65     pNew = sqlite
7400: 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 2c  3Expr(db, TK_IN,
7410: 20 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20   pDup, 0, 0);.  
7420: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
7430: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
7440: 65 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e  ew;.        tran
7450: 73 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73  sferJoinMarkings
7460: 28 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20  (pNew, pExpr);. 
7470: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69         pNew->pLi
7480: 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  st = pList;.    
7490: 20 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65      idxNew = whe
74a0: 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70  reClauseInsert(p
74b0: 57 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56  WC, pNew, TERM_V
74c0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
74d0: 4d 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78  MIC);.        ex
74e0: 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20  prAnalyze(pSrc, 
74f0: 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20 20  pWC, idxNew);.  
7500: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70        pTerm = &p
7510: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
7520: 20 20 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69          pWC->a[i
7530: 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d  dxNew].iParent =
7540: 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20   idxTerm;.      
7550: 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20    pTerm->nChild 
7560: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
7570: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7580: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
7590: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pList);.      }.
75a0: 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f 70 6f 73      }.or_not_pos
75b0: 73 69 62 6c 65 3a 0a 20 20 20 20 77 68 65 72 65  sible:.    where
75c0: 43 6c 61 75 73 65 43 6c 65 61 72 28 26 73 4f 72  ClauseClear(&sOr
75d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
75e0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4f 52 5f   SQLITE_OMIT_OR_
75f0: 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a  OPTIMIZATION */.
7600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
7610: 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49  OMIT_LIKE_OPTIMI
7620: 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41 64 64 20  ZATION.  /* Add 
7630: 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 72  constraints to r
7640: 65 64 75 63 65 20 74 68 65 20 73 65 61 72 63 68  educe the search
7650: 20 73 70 61 63 65 20 6f 6e 20 61 20 4c 49 4b 45   space on a LIKE
7660: 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a 20 6f 70   or GLOB.  ** op
7670: 65 72 61 74 6f 72 2e 0a 20 20 2a 2a 0a 20 20 2a  erator..  **.  *
7680: 2a 20 41 20 6c 69 6b 65 20 70 61 74 74 65 72 6e  * A like pattern
7690: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 78 20   of the form "x 
76a0: 4c 49 4b 45 20 27 61 62 63 25 27 22 20 69 73 20  LIKE 'abc%'" is 
76b0: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 63 6f 6e  changed into con
76c0: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 0a 20 20  straints.  **.  
76d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 78 3e 3d 27  **          x>='
76e0: 61 62 63 27 20 41 4e 44 20 78 3c 27 61 62 64 27  abc' AND x<'abd'
76f0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 61 62 63   AND x LIKE 'abc
7700: 25 27 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  %'.  **.  ** The
7710: 20 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20   last character 
7720: 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 22 61  of the prefix "a
7730: 62 63 22 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  bc" is increment
7740: 65 64 20 74 6f 20 66 6f 72 6d 20 74 68 65 0a 20  ed to form the. 
7750: 20 2a 2a 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   ** termination 
7760: 63 6f 6e 64 69 64 74 69 6f 6e 20 22 61 62 64 22  condidtion "abd"
7770: 2e 20 20 54 68 69 73 20 74 72 69 63 6b 20 6f 66  .  This trick of
7780: 20 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68   incrementing th
7790: 65 20 6c 61 73 74 0a 20 20 2a 2a 20 69 73 20 6e  e last.  ** is n
77a0: 6f 74 20 32 35 35 20 61 6e 64 20 69 66 20 74 68  ot 255 and if th
77b0: 65 20 63 68 61 72 61 63 74 65 72 20 73 65 74 20  e character set 
77c0: 69 73 20 6e 6f 74 20 45 42 43 44 49 43 2e 20 20  is not EBCDIC.  
77d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
77e0: 6b 65 4f 72 47 6c 6f 62 28 64 62 2c 20 70 45 78  keOrGlob(db, pEx
77f0: 70 72 2c 20 26 6e 50 61 74 74 65 72 6e 2c 20 26  pr, &nPattern, &
7800: 69 73 43 6f 6d 70 6c 65 74 65 2c 20 26 6e 6f 43  isComplete, &noC
7810: 61 73 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72  ase) ){.    Expr
7820: 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74   *pLeft, *pRight
7830: 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 53 74 72  ;.    Expr *pStr
7840: 31 2c 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45  1, *pStr2;.    E
7850: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20  xpr *pNewExpr1, 
7860: 2a 70 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20  *pNewExpr2;.    
7870: 69 6e 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78  int idxNew1, idx
7880: 4e 65 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74  New2;..    pLeft
7890: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
78a0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
78b0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
78c0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
78d0: 70 72 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20  pr;.    pStr1 = 
78e0: 73 71 6c 69 74 65 33 50 45 78 70 72 28 70 50 61  sqlite3PExpr(pPa
78f0: 72 73 65 2c 20 54 4b 5f 53 54 52 49 4e 47 2c 20  rse, TK_STRING, 
7900: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
7910: 28 20 70 53 74 72 31 20 29 7b 0a 20 20 20 20 20  ( pStr1 ){.     
7920: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
7930: 79 28 64 62 2c 20 26 70 53 74 72 31 2d 3e 74 6f  y(db, &pStr1->to
7940: 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74 6f  ken, &pRight->to
7950: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74 72  ken);.      pStr
7960: 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50 61  1->token.n = nPa
7970: 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 70 53 74  ttern;.      pSt
7980: 72 31 2d 3e 66 6c 61 67 73 20 3d 20 45 50 5f 44  r1->flags = EP_D
7990: 65 71 75 6f 74 65 64 3b 0a 20 20 20 20 7d 0a 20  equoted;.    }. 
79a0: 20 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74     pStr2 = sqlit
79b0: 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70 53  e3ExprDup(db, pS
79c0: 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 21 64  tr1);.    if( !d
79d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
79e0: 29 7b 0a 20 20 20 20 20 20 75 38 20 63 2c 20 2a  ){.      u8 c, *
79f0: 70 43 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pC;.      assert
7a00: 28 20 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64  ( pStr2->token.d
7a10: 79 6e 20 29 3b 0a 20 20 20 20 20 20 70 43 20 3d  yn );.      pC =
7a20: 20 28 75 38 2a 29 26 70 53 74 72 32 2d 3e 74 6f   (u8*)&pStr2->to
7a30: 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e 2d 31  ken.z[nPattern-1
7a40: 5d 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 70 43  ];.      c = *pC
7a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 6f 43 61  ;.      if( noCa
7a60: 73 65 20 29 20 63 20 3d 20 73 71 6c 69 74 65 33  se ) c = sqlite3
7a70: 55 70 70 65 72 54 6f 4c 6f 77 65 72 5b 63 5d 3b  UpperToLower[c];
7a80: 0a 20 20 20 20 20 20 2a 70 43 20 3d 20 63 20 2b  .      *pC = c +
7a90: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e   1;.    }.    pN
7aa0: 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74 65  ewExpr1 = sqlite
7ab0: 33 50 45 78 70 72 28 70 50 61 72 73 65 2c 20 54  3PExpr(pParse, T
7ac0: 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45 78 70  K_GE, sqlite3Exp
7ad0: 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29 2c 20  rDup(db,pLeft), 
7ae0: 70 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69  pStr1, 0);.    i
7af0: 64 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c  dxNew1 = whereCl
7b00: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
7b10: 70 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f  pNewExpr1, TERM_
7b20: 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e  VIRTUAL|TERM_DYN
7b30: 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41  AMIC);.    exprA
7b40: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 57 43  nalyze(pSrc, pWC
7b50: 2c 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20  , idxNew1);.    
7b60: 70 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69  pNewExpr2 = sqli
7b70: 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
7b80: 20 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45   TK_LT, sqlite3E
7b90: 78 70 72 44 75 70 28 64 62 2c 70 4c 65 66 74 29  xprDup(db,pLeft)
7ba0: 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a 20 20 20  , pStr2, 0);.   
7bb0: 20 69 64 78 4e 65 77 32 20 3d 20 77 68 65 72 65   idxNew2 = where
7bc0: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
7bd0: 2c 20 70 4e 65 77 45 78 70 72 32 2c 20 54 45 52  , pNewExpr2, TER
7be0: 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44  M_VIRTUAL|TERM_D
7bf0: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 65 78 70  YNAMIC);.    exp
7c00: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
7c10: 57 43 2c 20 69 64 78 4e 65 77 32 29 3b 0a 20 20  WC, idxNew2);.  
7c20: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
7c30: 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20  a[idxTerm];.    
7c40: 69 66 28 20 69 73 43 6f 6d 70 6c 65 74 65 20 29  if( isComplete )
7c50: 7b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  {.      pWC->a[i
7c60: 64 78 4e 65 77 31 5d 2e 69 50 61 72 65 6e 74 20  dxNew1].iParent 
7c70: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
7c80: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d   pWC->a[idxNew2]
7c90: 2e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65  .iParent = idxTe
7ca0: 72 6d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d  rm;.      pTerm-
7cb0: 3e 6e 43 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20  >nChild = 2;.   
7cc0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   }.  }.#endif /*
7cd0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
7ce0: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a  E_OPTIMIZATION *
7cf0: 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
7d00: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
7d10: 42 4c 45 0a 20 20 2f 2a 20 41 64 64 20 61 20 57  BLE.  /* Add a W
7d20: 4f 5f 4d 41 54 43 48 20 61 75 78 69 6c 69 61 72  O_MATCH auxiliar
7d30: 79 20 74 65 72 6d 20 74 6f 20 74 68 65 20 63 6f  y term to the co
7d40: 6e 73 74 72 61 69 6e 74 20 73 65 74 20 69 66 20  nstraint set if 
7d50: 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65 6e 74  the.  ** current
7d60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6f   expression is o
7d70: 66 20 74 68 65 20 66 6f 72 6d 3a 20 20 63 6f 6c  f the form:  col
7d80: 75 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 2e 0a  umn MATCH expr..
7d90: 20 20 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d    ** This inform
7da0: 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 79  ation is used by
7db0: 20 74 68 65 20 78 42 65 73 74 49 6e 64 65 78 20   the xBestIndex 
7dc0: 6d 65 74 68 6f 64 73 20 6f 66 0a 20 20 2a 2a 20  methods of.  ** 
7dd0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 2e 20  virtual tables. 
7de0: 20 54 68 65 20 6e 61 74 69 76 65 20 71 75 65 72   The native quer
7df0: 79 20 6f 70 74 69 6d 69 7a 65 72 20 64 6f 65 73  y optimizer does
7e00: 20 6e 6f 74 20 61 74 74 65 6d 70 74 0a 20 20 2a   not attempt.  *
7e10: 2a 20 74 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67  * to do anything
7e20: 20 77 69 74 68 20 4d 41 54 43 48 20 66 75 6e 63   with MATCH func
7e30: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
7e40: 28 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c 75 6d  ( isMatchOfColum
7e50: 6e 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  n(pExpr) ){.    
7e60: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
7e70: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 2a 70  Expr *pRight, *p
7e80: 4c 65 66 74 3b 0a 20 20 20 20 57 68 65 72 65 54  Left;.    WhereT
7e90: 65 72 6d 20 2a 70 4e 65 77 54 65 72 6d 3b 0a 20  erm *pNewTerm;. 
7ea0: 20 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65     Bitmask prere
7eb0: 71 43 6f 6c 75 6d 6e 2c 20 70 72 65 72 65 71 45  qColumn, prereqE
7ec0: 78 70 72 3b 0a 0a 20 20 20 20 70 52 69 67 68 74  xpr;..    pRight
7ed0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
7ee0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
7ef0: 20 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e   pLeft = pExpr->
7f00: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
7f10: 72 3b 0a 20 20 20 20 70 72 65 72 65 71 45 78 70  r;.    prereqExp
7f20: 72 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  r = exprTableUsa
7f30: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 52 69  ge(pMaskSet, pRi
7f40: 67 68 74 29 3b 0a 20 20 20 20 70 72 65 72 65 71  ght);.    prereq
7f50: 43 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 54 61 62  Column = exprTab
7f60: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
7f70: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66  , pLeft);.    if
7f80: 28 20 28 70 72 65 72 65 71 45 78 70 72 20 26 20  ( (prereqExpr & 
7f90: 70 72 65 72 65 71 43 6f 6c 75 6d 6e 29 3d 3d 30  prereqColumn)==0
7fa0: 20 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   ){.      Expr *
7fb0: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
7fc0: 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c 69 74  pNewExpr = sqlit
7fd0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 4d 41  e3Expr(db, TK_MA
7fe0: 54 43 48 2c 20 30 2c 20 73 71 6c 69 74 65 33 45  TCH, 0, sqlite3E
7ff0: 78 70 72 44 75 70 28 64 62 2c 20 70 52 69 67 68  xprDup(db, pRigh
8000: 74 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64  t), 0);.      id
8010: 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75  xNew = whereClau
8020: 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e  seInsert(pWC, pN
8030: 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52  ewExpr, TERM_VIR
8040: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
8050: 43 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65  C);.      pNewTe
8060: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
8070: 4e 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  New];.      pNew
8080: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
8090: 74 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a  t = prereqExpr;.
80a0: 20 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e        pNewTerm->
80b0: 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65  leftCursor = pLe
80c0: 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  ft->iTable;.    
80d0: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74    pNewTerm->left
80e0: 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e  Column = pLeft->
80f0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70  iColumn;.      p
8100: 4e 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  NewTerm->eOperat
8110: 6f 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20  or = WO_MATCH;. 
8120: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69       pNewTerm->i
8130: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
8140: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20  ;.      pTerm = 
8150: 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d  &pWC->a[idxTerm]
8160: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e  ;.      pTerm->n
8170: 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Child = 1;.     
8180: 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
8190: 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20   TERM_COPIED;.  
81a0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72      pNewTerm->pr
81b0: 65 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d  ereqAll = pTerm-
81c0: 3e 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20  >prereqAll;.    
81d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
81e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
81f0: 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f  UALTABLE */.}../
8200: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
8210: 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 65   if any of the e
8220: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 70 4c  xpressions in pL
8230: 69 73 74 2d 3e 61 5b 69 46 69 72 73 74 2e 2e 2e  ist->a[iFirst...
8240: 5d 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 20 72  ] contain.** a r
8250: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6e 79 20  eference to any 
8260: 74 61 62 6c 65 20 6f 74 68 65 72 20 74 68 61 6e  table other than
8270: 20 74 68 65 20 69 42 61 73 65 20 74 61 62 6c 65   the iBase table
8280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8290: 72 65 66 65 72 65 6e 63 65 73 4f 74 68 65 72 54  referencesOtherT
82a0: 61 62 6c 65 73 28 0a 20 20 45 78 70 72 4c 69 73  ables(.  ExprLis
82b0: 74 20 2a 70 4c 69 73 74 2c 20 20 20 20 20 20 20  t *pList,       
82c0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 65 78 70     /* Search exp
82d0: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 73 20  ressions in ths 
82e0: 6c 69 73 74 20 2a 2f 0a 20 20 45 78 70 72 4d 61  list */.  ExprMa
82f0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
8300: 20 20 20 20 2f 2a 20 4d 61 70 70 69 6e 67 20 66      /* Mapping f
8310: 72 6f 6d 20 74 61 62 6c 65 73 20 74 6f 20 62 69  rom tables to bi
8320: 74 6d 61 70 73 20 2a 2f 0a 20 20 69 6e 74 20 69  tmaps */.  int i
8330: 46 69 72 73 74 2c 20 20 20 20 20 20 20 20 20 20  First,          
8340: 20 20 20 20 20 2f 2a 20 42 65 20 73 65 61 72 63       /* Be searc
8350: 68 69 6e 67 20 77 69 74 68 20 74 68 65 20 69 46  hing with the iF
8360: 69 72 73 74 2d 74 68 20 65 78 70 72 65 73 73 69  irst-th expressi
8370: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 42 61 73  on */.  int iBas
8380: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
8390: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 72 65 66 65    /* Ignore refe
83a0: 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20 74  rences to this t
83b0: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 42 69 74  able */.){.  Bit
83c0: 6d 61 73 6b 20 61 6c 6c 6f 77 65 64 20 3d 20 7e  mask allowed = ~
83d0: 67 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74  getMask(pMaskSet
83e0: 2c 20 69 42 61 73 65 29 3b 0a 20 20 77 68 69 6c  , iBase);.  whil
83f0: 65 28 20 69 46 69 72 73 74 3c 70 4c 69 73 74 2d  e( iFirst<pList-
8400: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 69 66  >nExpr ){.    if
8410: 28 20 28 65 78 70 72 54 61 62 6c 65 55 73 61 67  ( (exprTableUsag
8420: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
8430: 74 2d 3e 61 5b 69 46 69 72 73 74 2b 2b 5d 2e 70  t->a[iFirst++].p
8440: 45 78 70 72 29 26 61 6c 6c 6f 77 65 64 29 21 3d  Expr)&allowed)!=
8450: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
8460: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
8470: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
8480: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8490: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
84a0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
84b0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
84c0: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
84d0: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
84e0: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
84f0: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
8500: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
8510: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
8520: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8530: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
8540: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
8550: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
8560: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8570: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
8580: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
8590: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
85a0: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
85b0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
85c0: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
85d0: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
85e0: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
85f0: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
8600: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
8610: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
8620: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
8630: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
8640: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
8650: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
8660: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
8670: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
8680: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
8690: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
86a0: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
86b0: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
86c0: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
86d0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
86e0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
86f0: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
8700: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
8710: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
8720: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
8730: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
8740: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
8750: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
8760: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
8770: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
8780: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
8790: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
87a0: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
87b0: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
87c0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
87d0: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
87e0: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
87f0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8800: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
8810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
8820: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
8830: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8840: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
8850: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
8860: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
8870: 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70 70 69 6e  kSet,  /* Mappin
8880: 67 20 66 72 6f 6d 20 74 61 62 6c 65 20 69 6e 64  g from table ind
8890: 69 63 65 73 20 74 6f 20 62 69 74 6d 61 70 73 20  ices to bitmaps 
88a0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
88b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
88c0: 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72 65  The index we are
88d0: 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   testing */.  in
88e0: 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20 20  t base,         
88f0: 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
8900: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
8910: 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65  able to be sorte
8920: 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  d */.  ExprList 
8930: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f  *pOrderBy,     /
8940: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
8950: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lause */.  int n
8960: 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  EqCol,          
8970: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8980: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69  index columns wi
8990: 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74  th == constraint
89a0: 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65  s */.  int *pbRe
89b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  v              /
89c0: 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52  * Set to 1 if OR
89d0: 44 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a  DER BY is DESC *
89e0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  /.){.  int i, j;
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a00: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
8a10: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
8a20: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20   sortOrder = 0; 
8a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a40: 58 4f 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64  XOR of index and
8a50: 20 4f 52 44 45 52 20 42 59 20 73 6f 72 74 20 64   ORDER BY sort d
8a60: 69 72 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  irection */.  in
8a70: 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8a90: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52   Number of ORDER
8aa0: 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73   BY terms */.  s
8ab0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
8ac0: 74 65 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f  tem *pTerm;    /
8ad0: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
8ae0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8af0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
8b00: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
8b10: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
8b20: 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d  By!=0 );.  nTerm
8b30: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
8b40: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  pr;.  assert( nT
8b50: 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  erm>0 );..  /* M
8b60: 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
8b70: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
8b80: 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
8b90: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
8ba0: 64 65 78 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e  dex..  **.  ** N
8bb0: 6f 74 65 20 74 68 61 74 20 69 6e 64 69 63 65 73  ote that indices
8bc0: 20 68 61 76 65 20 70 49 64 78 2d 3e 6e 43 6f 6c   have pIdx->nCol
8bd0: 75 6d 6e 20 72 65 67 75 6c 61 72 20 63 6f 6c 75  umn regular colu
8be0: 6d 6e 73 20 70 6c 75 73 0a 20 20 2a 2a 20 6f 6e  mns plus.  ** on
8bf0: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 63 6f 6c  e additional col
8c00: 75 6d 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  umn containing t
8c10: 68 65 20 72 6f 77 69 64 2e 20 20 54 68 65 20 72  he rowid.  The r
8c20: 6f 77 69 64 20 63 6f 6c 75 6d 6e 0a 20 20 2a 2a  owid column.  **
8c30: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
8c40: 20 61 6c 73 6f 20 61 6c 6c 6f 77 65 64 20 74 6f   also allowed to
8c50: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
8c60: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a  he ORDER BY.  **
8c70: 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20   clause..  */.  
8c80: 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
8c90: 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 6a 3c  =pOrderBy->a; j<
8ca0: 6e 54 65 72 6d 20 26 26 20 69 3c 3d 70 49 64 78  nTerm && i<=pIdx
8cb0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
8cc0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
8cd0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65  ;       /* The e
8ce0: 78 70 72 65 73 73 69 6f 6e 20 6f 66 20 74 68 65  xpression of the
8cf0: 20 4f 52 44 45 52 20 42 59 20 70 54 65 72 6d 20   ORDER BY pTerm 
8d00: 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  */.    CollSeq *
8d10: 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a 20 54 68 65  pColl;    /* The
8d20: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
8d30: 6e 63 65 20 6f 66 20 70 45 78 70 72 20 2a 2f 0a  nce of pExpr */.
8d40: 20 20 20 20 69 6e 74 20 74 65 72 6d 53 6f 72 74      int termSort
8d50: 4f 72 64 65 72 3b 20 2f 2a 20 53 6f 72 74 20 6f  Order; /* Sort o
8d60: 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 74 65  rder for this te
8d70: 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43  rm */.    int iC
8d80: 6f 6c 75 6d 6e 3b 20 20 20 20 20 20 20 2f 2a 20  olumn;       /* 
8d90: 54 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 20  The i-th column 
8da0: 6f 66 20 74 68 65 20 69 6e 64 65 78 2e 20 20 2d  of the index.  -
8db0: 31 20 66 6f 72 20 72 6f 77 69 64 20 2a 2f 0a 20  1 for rowid */. 
8dc0: 20 20 20 69 6e 74 20 69 53 6f 72 74 4f 72 64 65     int iSortOrde
8dd0: 72 3b 20 20 20 20 2f 2a 20 31 20 66 6f 72 20 44  r;    /* 1 for D
8de0: 45 53 43 2c 20 30 20 66 6f 72 20 41 53 43 20 6f  ESC, 0 for ASC o
8df0: 6e 20 74 68 65 20 69 2d 74 68 20 69 6e 64 65 78  n the i-th index
8e00: 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 63 6f 6e   term */.    con
8e10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 3b 20  st char *zColl; 
8e20: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
8e30: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
8e40: 65 20 66 6f 72 20 69 2d 74 68 20 69 6e 64 65 78  e for i-th index
8e50: 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70 45   term */..    pE
8e60: 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  xpr = pTerm->pEx
8e70: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  pr;.    if( pExp
8e80: 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  r->op!=TK_COLUMN
8e90: 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c   || pExpr->iTabl
8ea0: 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20  e!=base ){.     
8eb0: 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20   /* Can not use 
8ec0: 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e  an index sort on
8ed0: 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69   anything that i
8ee0: 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69  s not a column i
8ef0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c  n the.      ** l
8f00: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f  eft-most table o
8f10: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
8f20: 65 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  e */.      break
8f30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c  ;.    }.    pCol
8f40: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
8f50: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
8f60: 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21  Expr);.    if( !
8f70: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70  pColl ){.      p
8f80: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
8f90: 43 6f 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Coll;.    }.    
8fa0: 69 66 28 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c  if( i<pIdx->nCol
8fb0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 69 43 6f  umn ){.      iCo
8fc0: 6c 75 6d 6e 20 3d 20 70 49 64 78 2d 3e 61 69 43  lumn = pIdx->aiC
8fd0: 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20 20  olumn[i];.      
8fe0: 69 66 28 20 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64  if( iColumn==pId
8ff0: 78 2d 3e 70 54 61 62 6c 65 2d 3e 69 50 4b 65 79  x->pTable->iPKey
9000: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c   ){.        iCol
9010: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  umn = -1;.      
9020: 7d 0a 20 20 20 20 20 20 69 53 6f 72 74 4f 72 64  }.      iSortOrd
9030: 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f 72 74  er = pIdx->aSort
9040: 4f 72 64 65 72 5b 69 5d 3b 0a 20 20 20 20 20 20  Order[i];.      
9050: 7a 43 6f 6c 6c 20 3d 20 70 49 64 78 2d 3e 61 7a  zColl = pIdx->az
9060: 43 6f 6c 6c 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  Coll[i];.    }el
9070: 73 65 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  se{.      iColum
9080: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 53  n = -1;.      iS
9090: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 20 20  ortOrder = 0;.  
90a0: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c      zColl = pCol
90b0: 6c 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 7d 0a  l->zName;.    }.
90c0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
90d0: 43 6f 6c 75 6d 6e 21 3d 69 43 6f 6c 75 6d 6e 20  Column!=iColumn 
90e0: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
90f0: 70 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20  p(pColl->zName, 
9100: 7a 43 6f 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  zColl) ){.      
9110: 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65  /* Term j of the
9120: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
9130: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9140: 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20  column i of the 
9150: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
9160: 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i<nEqCol ){. 
9170: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
9180: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
9190: 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
91a0: 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20   by == fails to 
91b0: 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20  match an.       
91c0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
91d0: 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20  m, that is OK.  
91e0: 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74  Just ignore that
91f0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
9200: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ndex.        */.
9210: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
9220: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9230: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
9240: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69  index column fai
9250: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20  ls to match and 
9260: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  is not constrain
9270: 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20  ed by ==.       
9280: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64   ** then the ind
9290: 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  ex cannot satisf
92a0: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
92b0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20  onstraint..     
92c0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
92d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
92e0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
92f0: 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
9300: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  er!=0 );.    ass
9310: 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74  ert( pTerm->sort
9320: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72  Order==0 || pTer
9330: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  m->sortOrder==1 
9340: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
9350: 53 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20  SortOrder==0 || 
9360: 69 53 6f 72 74 4f 72 64 65 72 3d 3d 31 20 29 3b  iSortOrder==1 );
9370: 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f 72 64  .    termSortOrd
9380: 65 72 20 3d 20 69 53 6f 72 74 4f 72 64 65 72 20  er = iSortOrder 
9390: 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ^ pTerm->sortOrd
93a0: 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45  er;.    if( i>nE
93b0: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  qCol ){.      if
93c0: 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
93d0: 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
93e0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73        /* Indices
93f0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
9400: 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  d if all ORDER B
9410: 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  Y terms past the
9420: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61  .        ** equa
9430: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
9440: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
9450: 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a  DESC or ASC. */.
9460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
9470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
9480: 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f  lse{.      sortO
9490: 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f  rder = termSortO
94a0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
94b0: 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b  j++;.    pTerm++
94c0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 75 6d  ;.    if( iColum
94d0: 6e 3c 30 20 26 26 20 21 72 65 66 65 72 65 6e 63  n<0 && !referenc
94e0: 65 73 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f  esOtherTables(pO
94f0: 72 64 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74  rderBy, pMaskSet
9500: 2c 20 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20  , j, base) ){.  
9510: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 6e      /* If the in
9520: 64 65 78 65 64 20 63 6f 6c 75 6d 6e 20 69 73 20  dexed column is 
9530: 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65 79 20  the primary key 
9540: 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20 6d  and everything m
9550: 61 74 63 68 65 73 0a 20 20 20 20 20 20 2a 2a 20  atches.      ** 
9560: 73 6f 20 66 61 72 20 61 6e 64 20 6e 6f 6e 65 20  so far and none 
9570: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
9580: 74 65 72 6d 73 20 74 6f 20 74 68 65 20 72 69 67  terms to the rig
9590: 68 74 20 72 65 66 65 72 65 6e 63 65 20 6f 74 68  ht reference oth
95a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  er.      ** tabl
95b0: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
95c0: 74 68 65 6e 20 77 65 20 61 72 65 20 61 73 73 75  then we are assu
95d0: 72 65 64 20 74 68 61 74 20 74 68 65 20 69 6e 64  red that the ind
95e0: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 0a  ex can be used .
95f0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 73 6f 72 74        ** to sort
9600: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 72 69   because the pri
9610: 6d 61 72 79 20 6b 65 79 20 69 73 20 75 6e 69 71  mary key is uniq
9620: 75 65 20 61 6e 64 20 73 6f 20 6e 6f 6e 65 20 6f  ue and so none o
9630: 66 20 74 68 65 20 6f 74 68 65 72 0a 20 20 20 20  f the other.    
9640: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 77 69 6c    ** columns wil
9650: 6c 20 6d 61 6b 65 20 61 6e 79 20 64 69 66 66 65  l make any diffe
9660: 72 65 6e 63 65 0a 20 20 20 20 20 20 2a 2f 0a 20  rence.      */. 
9670: 20 20 20 20 20 6a 20 3d 20 6e 54 65 72 6d 3b 0a       j = nTerm;.
9680: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 62      }.  }..  *pb
9690: 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21  Rev = sortOrder!
96a0: 3d 30 3b 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65  =0;.  if( j>=nTe
96b0: 72 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  rm ){.    /* All
96c0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
96d0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 72  DER BY clause ar
96e0: 65 20 63 6f 76 65 72 65 64 20 62 79 20 74 68 69  e covered by thi
96f0: 73 20 69 6e 64 65 78 20 73 6f 0a 20 20 20 20 2a  s index so.    *
9700: 2a 20 74 68 69 73 20 69 6e 64 65 78 20 63 61 6e  * this index can
9710: 20 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72   be used for sor
9720: 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 65 74  ting. */.    ret
9730: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 1;.  }.  if(
9740: 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d   pIdx->onError!=
9750: 4f 45 5f 4e 6f 6e 65 20 26 26 20 69 3d 3d 70 49  OE_None && i==pI
9760: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 0a 20 20 20 20  dx->nColumn.    
9770: 20 20 26 26 20 21 72 65 66 65 72 65 6e 63 65 73    && !references
9780: 4f 74 68 65 72 54 61 62 6c 65 73 28 70 4f 72 64  OtherTables(pOrd
9790: 65 72 42 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20  erBy, pMaskSet, 
97a0: 6a 2c 20 62 61 73 65 29 20 29 7b 0a 20 20 20 20  j, base) ){.    
97b0: 2f 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20  /* All terms of 
97c0: 74 68 69 73 20 69 6e 64 65 78 20 6d 61 74 63 68  this index match
97d0: 20 73 6f 6d 65 20 70 72 65 66 69 78 20 6f 66 20   some prefix of 
97e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
97f0: 75 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 74  use.    ** and t
9800: 68 65 20 69 6e 64 65 78 20 69 73 20 55 4e 49 51  he index is UNIQ
9810: 55 45 20 61 6e 64 20 6e 6f 20 74 65 72 6d 73 20  UE and no terms 
9820: 6f 6e 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  on the tail of t
9830: 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  he ORDER BY.    
9840: 2a 2a 20 63 6c 61 75 73 65 20 72 65 66 65 72 65  ** clause refere
9850: 6e 63 65 20 6f 74 68 65 72 20 74 61 62 6c 65 73  nce other tables
9860: 20 69 6e 20 61 20 6a 6f 69 6e 2e 20 20 49 66 20   in a join.  If 
9870: 74 68 69 73 20 69 73 20 61 6c 6c 20 74 72 75 65  this is all true
9880: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65   then.    ** the
9890: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
98a0: 20 69 73 20 73 75 70 65 72 66 6c 75 6f 75 73 2e   is superfluous.
98b0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 31   */.    return 1
98c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
98d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
98e0: 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66   table to see if
98f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
9900: 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79  ause in pOrderBy
9910: 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
9920: 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20  d.** by sorting 
9930: 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49  in order of ROWI
9940: 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  D.  Return true 
9950: 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70  if so and set *p
9960: 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72  bRev to be.** tr
9970: 75 65 20 66 6f 72 20 72 65 76 65 72 73 65 20 52  ue for reverse R
9980: 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66  OWID and false f
9990: 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44  or forward ROWID
99a0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
99b0: 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79  c int sortableBy
99c0: 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73  Rowid(.  int bas
99d0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
99e0: 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65   /* Cursor numbe
99f0: 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62  r for table to b
9a00: 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78  e sorted */.  Ex
9a10: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
9a20: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  ,     /* The ORD
9a30: 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  ER BY clause */.
9a40: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70    ExprMaskSet *p
9a50: 4d 61 73 6b 53 65 74 2c 20 20 2f 2a 20 4d 61 70  MaskSet,  /* Map
9a60: 70 69 6e 67 20 66 72 6f 6d 20 74 61 62 6c 65 73  ping from tables
9a70: 20 74 6f 20 62 69 74 6d 61 70 73 20 2a 2f 0a 20   to bitmaps */. 
9a80: 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20   int *pbRev     
9a90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
9aa0: 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59  to 1 if ORDER BY
9ab0: 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20   is DESC */.){. 
9ac0: 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73   Expr *p;..  ass
9ad0: 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30  ert( pOrderBy!=0
9ae0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f   );.  assert( pO
9af0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20  rderBy->nExpr>0 
9b00: 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42  );.  p = pOrderB
9b10: 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  y->a[0].pExpr;. 
9b20: 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43   if( p->op==TK_C
9b30: 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62  OLUMN && p->iTab
9b40: 6c 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69  le==base && p->i
9b50: 43 6f 6c 75 6d 6e 3d 3d 2d 31 0a 20 20 20 20 26  Column==-1.    &
9b60: 26 20 21 72 65 66 65 72 65 6e 63 65 73 4f 74 68  & !referencesOth
9b70: 65 72 54 61 62 6c 65 73 28 70 4f 72 64 65 72 42  erTables(pOrderB
9b80: 79 2c 20 70 4d 61 73 6b 53 65 74 2c 20 31 2c 20  y, pMaskSet, 1, 
9b90: 62 61 73 65 29 20 29 7b 0a 20 20 20 20 2a 70 62  base) ){.    *pb
9ba0: 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  Rev = pOrderBy->
9bb0: 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[0].sortOrder;.
9bc0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
9bd0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9be0: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
9bf0: 20 63 72 75 64 65 20 65 73 74 69 6d 61 74 65 20   crude estimate 
9c00: 6f 66 20 74 68 65 20 6c 6f 67 61 72 69 74 68 6d  of the logarithm
9c10: 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 76 61   of the input va
9c20: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75  lue..** The resu
9c30: 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20 62 65 20  lts need not be 
9c40: 65 78 61 63 74 2e 20 20 54 68 69 73 20 69 73 20  exact.  This is 
9c50: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 65 73  only used for es
9c60: 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  timating.** the 
9c70: 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66 20 70 65  total cost of pe
9c80: 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72 61 74 69  rforming operati
9c90: 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f 67 4e 29  ngs with O(logN)
9ca0: 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a 2a 2a 20   or O(NlogN).** 
9cb0: 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20 42 65 63  complexity.  Bec
9cc0: 61 75 73 65 20 4e 20 69 73 20 6a 75 73 74 20 61  ause N is just a
9cd0: 20 67 75 65 73 73 2c 20 69 74 20 69 73 20 6e 6f   guess, it is no
9ce0: 20 67 72 65 61 74 20 74 72 61 67 65 64 79 20 69   great tragedy i
9cf0: 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20 61 20 6c  f.** logN is a l
9d00: 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f 0a 73 74  ittle off..*/.st
9d10: 61 74 69 63 20 64 6f 75 62 6c 65 20 65 73 74 4c  atic double estL
9d20: 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b 0a 20 20  og(double N){.  
9d30: 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d 20 31 3b  double logN = 1;
9d40: 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d 20 31 30  .  double x = 10
9d50: 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e 78 20 29  ;.  while( N>x )
9d60: 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d 20 31 3b  {.    logN += 1;
9d70: 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b 0a 20 20  .    x *= 10;.  
9d80: 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f 67 4e 3b  }.  return logN;
9d90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 72 6f  .}../*.** Two ro
9da0: 75 74 69 6e 65 73 20 66 6f 72 20 70 72 69 6e 74  utines for print
9db0: 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ing the content 
9dc0: 6f 66 20 61 6e 20 73 71 6c 69 74 65 33 5f 69 6e  of an sqlite3_in
9dd0: 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20 73 74 72 75  dex_info.** stru
9de0: 63 74 75 72 65 2e 20 20 55 73 65 64 20 66 6f 72  cture.  Used for
9df0: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
9e00: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 20 20 49 66  ugging only.  If
9e10: 20 6e 65 69 74 68 65 72 0a 2a 2a 20 53 51 4c 49   neither.** SQLI
9e20: 54 45 5f 54 45 53 54 20 6f 72 20 53 51 4c 49 54  TE_TEST or SQLIT
9e30: 45 5f 44 45 42 55 47 20 61 72 65 20 64 65 66 69  E_DEBUG are defi
9e40: 6e 65 64 2c 20 74 68 65 6e 20 74 68 65 73 65 20  ned, then these 
9e50: 72 6f 75 74 69 6e 65 73 0a 2a 2a 20 61 72 65 20  routines.** are 
9e60: 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23 69 66 20 21  no-ops..*/.#if !
9e70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9e80: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
9e90: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
9ea0: 49 54 45 5f 44 45 42 55 47 29 0a 73 74 61 74 69  ITE_DEBUG).stati
9eb0: 63 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58  c void TRACE_IDX
9ec0: 5f 49 4e 50 55 54 53 28 73 71 6c 69 74 65 33 5f  _INPUTS(sqlite3_
9ed0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
9ee0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
9ef0: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
9f00: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
9f10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
9f20: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
9f30: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
9f40: 72 69 6e 74 66 28 22 20 20 63 6f 6e 73 74 72 61  rintf("  constra
9f50: 69 6e 74 5b 25 64 5d 3a 20 63 6f 6c 3d 25 64 20  int[%d]: col=%d 
9f60: 74 65 72 6d 69 64 3d 25 64 20 6f 70 3d 25 64 20  termid=%d op=%d 
9f70: 75 73 61 62 6c 65 64 3d 25 64 5c 6e 22 2c 0a 20  usabled=%d\n",. 
9f80: 20 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20        i,.       
9f90: 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  p->aConstraint[i
9fa0: 5d 2e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ].iColumn,.     
9fb0: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
9fc0: 5b 69 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 2c  [i].iTermOffset,
9fd0: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
9fe0: 74 72 61 69 6e 74 5b 69 5d 2e 6f 70 2c 0a 20 20  traint[i].op,.  
9ff0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
a000: 69 6e 74 5b 69 5d 2e 75 73 61 62 6c 65 29 3b 0a  int[i].usable);.
a010: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
a020: 3c 70 2d 3e 6e 4f 72 64 65 72 42 79 3b 20 69 2b  <p->nOrderBy; i+
a030: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
a040: 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f 72  ebugPrintf("  or
a050: 64 65 72 62 79 5b 25 64 5d 3a 20 63 6f 6c 3d 25  derby[%d]: col=%
a060: 64 20 64 65 73 63 3d 25 64 5c 6e 22 2c 0a 20 20  d desc=%d\n",.  
a070: 20 20 20 20 20 69 2c 0a 20 20 20 20 20 20 20 70       i,.       p
a080: 2d 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  ->aOrderBy[i].iC
a090: 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d  olumn,.       p-
a0a0: 3e 61 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  >aOrderBy[i].des
a0b0: 63 29 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63  c);.  }.}.static
a0c0: 20 76 6f 69 64 20 54 52 41 43 45 5f 49 44 58 5f   void TRACE_IDX_
a0d0: 4f 55 54 50 55 54 53 28 73 71 6c 69 74 65 33 5f  OUTPUTS(sqlite3_
a0e0: 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 29 7b 0a  index_info *p){.
a0f0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 21    int i;.  if( !
a100: 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
a110: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  e ) return;.  fo
a120: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e  r(i=0; i<p->nCon
a130: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20  straint; i++){. 
a140: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
a150: 72 69 6e 74 66 28 22 20 20 75 73 61 67 65 5b 25  rintf("  usage[%
a160: 64 5d 3a 20 61 72 67 76 49 64 78 3d 25 64 20 6f  d]: argvIdx=%d o
a170: 6d 69 74 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  mit=%d\n",.     
a180: 20 20 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61    i,.       p->a
a190: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 5b  ConstraintUsage[
a1a0: 69 5d 2e 61 72 67 76 49 6e 64 65 78 2c 0a 20 20  i].argvIndex,.  
a1b0: 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61       p->aConstra
a1c0: 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
a1d0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
a1e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 69  DebugPrintf("  i
a1f0: 64 78 4e 75 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e  dxNum=%d\n", p->
a200: 69 64 78 4e 75 6d 29 3b 0a 20 20 73 71 6c 69 74  idxNum);.  sqlit
a210: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 20  e3DebugPrintf(" 
a220: 20 69 64 78 53 74 72 3d 25 73 5c 6e 22 2c 20 70   idxStr=%s\n", p
a230: 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20 73 71 6c  ->idxStr);.  sql
a240: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
a250: 22 20 20 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d  "  orderByConsum
a260: 65 64 3d 25 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64  ed=%d\n", p->ord
a270: 65 72 42 79 43 6f 6e 73 75 6d 65 64 29 3b 0a 20  erByConsumed);. 
a280: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
a290: 6e 74 66 28 22 20 20 65 73 74 69 6d 61 74 65 64  ntf("  estimated
a2a0: 43 6f 73 74 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65  Cost=%g\n", p->e
a2b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 29 3b 0a 7d  stimatedCost);.}
a2c0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54  .#else.#define T
a2d0: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
a2e0: 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  A).#define TRACE
a2f0: 5f 49 44 58 5f 4f 55 54 50 55 54 53 28 41 29 0a  _IDX_OUTPUTS(A).
a300: 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
a310: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
a320: 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43  UALTABLE./*.** C
a330: 6f 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20  ompute the best 
a340: 69 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74  index for a virt
a350: 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ual table..**.**
a360: 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
a370: 69 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  is computed by t
a380: 68 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65  he xBestIndex me
a390: 74 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74  thod of the virt
a3a0: 75 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64  ual.** table mod
a3b0: 75 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ule.  This routi
a3c0: 6e 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  ne is really jus
a3d0: 74 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74  t a wrapper that
a3e0: 20 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20   sets up.** the 
a3f0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a400: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
a410: 74 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d  t is used to com
a420: 6d 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a  municate with.**
a430: 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a   xBestIndex..**.
a440: 2a 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68  ** In a join, th
a450: 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
a460: 20 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69   be called multi
a470: 70 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68  ple times for th
a480: 65 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61  e.** same virtua
a490: 6c 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71  l table.  The sq
a4a0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
a4b0: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
a4c0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69  eated.** and ini
a4d0: 74 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20  tialized on the 
a4e0: 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e  first invocation
a4f0: 20 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61   and reused on a
a500: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a  ll subsequent.**
a510: 20 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54   invocations.  T
a520: 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  he sqlite3_index
a530: 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  _info structure 
a540: 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
a550: 6e 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e  n.** code is gen
a560: 65 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73  erated to access
a570: 20 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62   the virtual tab
a580: 6c 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e  le.  The whereIn
a590: 66 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72  foDelete() .** r
a5a0: 6f 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72  outine takes car
a5b0: 65 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65  e of freeing the
a5c0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
a5d0: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66  nfo structure af
a5e0: 74 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79  ter.** everybody
a5f0: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69   has finished wi
a600: 74 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  th it..*/.static
a610: 20 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74   double bestVirt
a620: 75 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73  ualIndex(.  Pars
a630: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
a640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
a650: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
a660: 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  t */.  WhereClau
a670: 73 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20  se *pWC,        
a680: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45        /* The WHE
a690: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  RE clause */.  s
a6a0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
a6b0: 65 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a  em *pSrc,     /*
a6c0: 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   The FROM clause
a6d0: 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20   term to search 
a6e0: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74  */.  Bitmask not
a6f0: 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20  Ready,          
a700: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
a710: 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20  ursors that are 
a720: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  not available */
a730: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
a740: 64 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20  derBy,          
a750: 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62    /* The order b
a760: 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e  y clause */.  in
a770: 74 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c  t orderByUsable,
a780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a790: 54 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70  True if we can p
a7a0: 6f 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f  otential sort */
a7b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  .  sqlite3_index
a7c0: 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66  _info **ppIdxInf
a7d0: 6f 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72  o /* Index infor
a7e0: 6d 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f  mation passed to
a7f0: 20 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29   xBestIndex */.)
a800: 7b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  {.  Table *pTab 
a810: 3d 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20  = pSrc->pTab;.  
a820: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a830: 66 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20  fo *pIdxInfo;.  
a840: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
a850: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
a860: 2a 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72  *pIdxCons;.  str
a870: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
a880: 78 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f  x_orderby *pIdxO
a890: 72 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74  rderBy;.  struct
a8a0: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
a8b0: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20  onstraint_usage 
a8c0: 2a 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65  *pUsage;.  Where
a8d0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69  Term *pTerm;.  i
a8e0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e  nt i, j;.  int n
a8f0: 4f 72 64 65 72 42 79 3b 0a 20 20 69 6e 74 20 72  OrderBy;.  int r
a900: 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  c;..  /* If the 
a910: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
a920: 66 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73  fo structure has
a930: 20 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f   not been previo
a940: 75 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61  usly.  ** alloca
a950: 74 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ted and initiali
a960: 7a 65 64 20 66 6f 72 20 74 68 69 73 20 76 69 72  zed for this vir
a970: 74 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e  tual table, then
a980: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61   allocate.  ** a
a990: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  nd initialize it
a9a0: 20 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78   now.  */.  pIdx
a9b0: 49 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66  Info = *ppIdxInf
a9c0: 6f 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66  o;.  if( pIdxInf
a9d0: 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 57 68 65 72  o==0 ){.    Wher
a9e0: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20  eTerm *pTerm;.  
a9f0: 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
aa00: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 52 65   WHERETRACE(("Re
aa10: 63 6f 6d 70 75 74 69 6e 67 20 69 6e 64 65 78 20  computing index 
aa20: 69 6e 66 6f 20 66 6f 72 20 25 73 2e 2e 2e 5c 6e  info for %s...\n
aa30: 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 29  ", pTab->zName))
aa40: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
aa50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
aa60: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
aa70: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
aa80: 72 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a  referring.    **
aa90: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
aaa0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f   table */.    fo
aab0: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
aac0: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
aad0: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
aae0: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
aaf0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
ab00: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
ab10: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
ab20: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
ab30: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
ab40: 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  IN ) continue;. 
ab50: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
ab60: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53  eOperator==WO_IS
ab70: 4e 55 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  NULL ) continue;
ab80: 0a 20 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a  .      nTerm++;.
ab90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
aba0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
abb0: 61 75 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e  ause contains on
abc0: 6c 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ly columns in th
abd0: 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a  e current .    *
abe0: 2a 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  * virtual table 
abf0: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70  then allocate sp
ac00: 61 63 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64  ace for the aOrd
ac10: 65 72 42 79 20 70 61 72 74 20 6f 66 0a 20 20 20  erBy part of.   
ac20: 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f   ** the sqlite3_
ac30: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
ac40: 74 75 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ture..    */.   
ac50: 20 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20   nOrderBy = 0;. 
ac60: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
ac70: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
ac80: 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45  ; i<pOrderBy->nE
ac90: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
aca0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
acb0: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
acc0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69  pExpr;.        i
acd0: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  f( pExpr->op!=TK
ace0: 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72  _COLUMN || pExpr
acf0: 2d 3e 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e  ->iTable!=pSrc->
ad00: 69 43 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b  iCursor ) break;
ad10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ad20: 66 28 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e  f( i==pOrderBy->
ad30: 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20  nExpr ){.       
ad40: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64   nOrderBy = pOrd
ad50: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  erBy->nExpr;.   
ad60: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ad70: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
ad80: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
ad90: 66 6f 20 73 74 72 75 63 74 75 72 65 0a 20 20 20  fo structure.   
ada0: 20 2a 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f   */.    pIdxInfo
adb0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
adc0: 6f 63 5a 65 72 6f 28 70 50 61 72 73 65 2d 3e 64  ocZero(pParse->d
add0: 62 2c 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 49  b, sizeof(*pIdxI
ade0: 6e 66 6f 29 0a 20 20 20 20 20 20 20 20 20 20 20  nfo).           
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a 70 49 64    + (sizeof(*pId
ae10: 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65 6f 66 28  xCons) + sizeof(
ae20: 2a 70 55 73 61 67 65 29 29 2a 6e 54 65 72 6d 0a  *pUsage))*nTerm.
ae30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
ae50: 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72 64 65 72  izeof(*pIdxOrder
ae60: 42 79 29 2a 6e 4f 72 64 65 72 42 79 20 29 3b 0a  By)*nOrderBy );.
ae70: 20 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f      if( pIdxInfo
ae80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
ae90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
aea0: 72 73 65 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  rse, "out of mem
aeb0: 6f 72 79 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ory");.      ret
aec0: 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d 0a 20  urn 0.0;.    }. 
aed0: 20 20 20 2a 70 70 49 64 78 49 6e 66 6f 20 3d 20     *ppIdxInfo = 
aee0: 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f  pIdxInfo;..    /
aef0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
af00: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
af10: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69   sqlite3_index_i
af20: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 63 6f  nfo structure co
af30: 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a 20 6d 61  ntains.    ** ma
af40: 6e 79 20 66 69 65 6c 64 73 20 74 68 61 74 20 61  ny fields that a
af50: 72 65 20 64 65 63 6c 61 72 65 64 20 22 63 6f 6e  re declared "con
af60: 73 74 22 20 74 6f 20 70 72 65 76 65 6e 74 20 78  st" to prevent x
af70: 42 65 73 74 49 6e 64 65 78 20 66 72 6f 6d 0a 20  BestIndex from. 
af80: 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e 67 20 74     ** changing t
af90: 68 65 6d 2e 20 20 57 65 20 68 61 76 65 20 74 6f  hem.  We have to
afa0: 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b 79 20 63   do some funky c
afb0: 61 73 74 69 6e 67 20 69 6e 20 6f 72 64 65 72 20  asting in order 
afc0: 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  to.    ** initia
afd0: 6c 69 7a 65 20 74 68 6f 73 65 20 66 69 65 6c 64  lize those field
afe0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
aff0: 64 78 43 6f 6e 73 20 3d 20 28 73 74 72 75 63 74  dxCons = (struct
b000: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
b010: 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70 49 64 78  onstraint*)&pIdx
b020: 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20 70 49 64  Info[1];.    pId
b030: 78 4f 72 64 65 72 42 79 20 3d 20 28 73 74 72 75  xOrderBy = (stru
b040: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
b050: 5f 6f 72 64 65 72 62 79 2a 29 26 70 49 64 78 43  _orderby*)&pIdxC
b060: 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20 20 20 20  ons[nTerm];.    
b070: 70 55 73 61 67 65 20 3d 20 28 73 74 72 75 63 74  pUsage = (struct
b080: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
b090: 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a  onstraint_usage*
b0a0: 29 26 70 49 64 78 4f 72 64 65 72 42 79 5b 6e 4f  )&pIdxOrderBy[nO
b0b0: 72 64 65 72 42 79 5d 3b 0a 20 20 20 20 2a 28 69  rderBy];.    *(i
b0c0: 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e  nt*)&pIdxInfo->n
b0d0: 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 6e 54 65  Constraint = nTe
b0e0: 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29 26  rm;.    *(int*)&
b0f0: 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72  pIdxInfo->nOrder
b100: 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20  By = nOrderBy;. 
b110: 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69     *(struct sqli
b120: 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72  te3_index_constr
b130: 61 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f  aint**)&pIdxInfo
b140: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->aConstraint = 
b150: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20 20 2a 28  pIdxCons;.    *(
b160: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
b170: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 2a 29 26  ndex_orderby**)&
b180: 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72 64 65 72  pIdxInfo->aOrder
b190: 42 79 20 3d 20 70 49 64 78 4f 72 64 65 72 42 79  By = pIdxOrderBy
b1a0: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
b1b0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
b1c0: 73 74 72 61 69 6e 74 5f 75 73 61 67 65 2a 2a 29  straint_usage**)
b1d0: 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73  &pIdxInfo->aCons
b1e0: 74 72 61 69 6e 74 55 73 61 67 65 20 3d 0a 20 20  traintUsage =.  
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 70 55 73 61 67 65 3b 0a 0a 20 20 20 20     pUsage;..    
b240: 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54 65 72 6d  for(i=j=0, pTerm
b250: 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e  =pWC->a; i<pWC->
b260: 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54 65 72  nTerm; i++, pTer
b270: 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  m++){.      if( 
b280: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
b290: 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75 72 73  r != pSrc->iCurs
b2a0: 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  or ) continue;. 
b2b0: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
b2c0: 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e  eOperator==WO_IN
b2d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
b2e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
b2f0: 70 65 72 61 74 6f 72 3d 3d 57 4f 5f 49 53 4e 55  perator==WO_ISNU
b300: 4c 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  LL ) continue;. 
b310: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
b320: 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72 6d  .iColumn = pTerm
b330: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20 20  ->leftColumn;.  
b340: 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e      pIdxCons[j].
b350: 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69 3b  iTermOffset = i;
b360: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
b370: 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e 65  j].op = pTerm->e
b380: 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20 20  Operator;.      
b390: 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61 73  /* The direct as
b3a0: 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65 20  signment in the 
b3b0: 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69 73  previous line is
b3c0: 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20 62   possible only b
b3d0: 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20  ecause.      ** 
b3e0: 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c 49  the WO_ and SQLI
b3f0: 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41  TE_INDEX_CONSTRA
b400: 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20 69  INT_ codes are i
b410: 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a 20  dentical.  The. 
b420: 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e       ** followin
b430: 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66 79  g asserts verify
b440: 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
b450: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
b460: 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  EQ==SQLITE_INDEX
b470: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20 29  _CONSTRAINT_EQ )
b480: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b490: 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LT==SQLITE_IN
b4a0: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
b4b0: 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
b4c0: 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45  t( WO_LE==SQLITE
b4d0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
b4e0: 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61 73  T_LE );.      as
b4f0: 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c  sert( WO_GT==SQL
b500: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
b510: 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20 20  AINT_GT );.     
b520: 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d   assert( WO_GE==
b530: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
b540: 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20  STRAINT_GE );.  
b550: 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4d      assert( WO_M
b560: 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e 44  ATCH==SQLITE_IND
b570: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d 41  EX_CONSTRAINT_MA
b580: 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  TCH );.      ass
b590: 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65  ert( pTerm->eOpe
b5a0: 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c 57  rator & (WO_EQ|W
b5b0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
b5c0: 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48 29  |WO_GE|WO_MATCH)
b5d0: 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20   );.      j++;. 
b5e0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
b5f0: 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69 2b  ; i<nOrderBy; i+
b600: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
b610: 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79  pExpr = pOrderBy
b620: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
b630: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
b640: 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78  i].iColumn = pEx
b650: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
b660: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b 69     pIdxOrderBy[i
b670: 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72 42  ].desc = pOrderB
b680: 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  y->a[i].sortOrde
b690: 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
b6a0: 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
b6b0: 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  , the sqlite3_in
b6c0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
b6d0: 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66 6f  re that pIdxInfo
b6e0: 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f 20   points.  ** to 
b6f0: 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 69  will have been i
b700: 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74 68  nitialized, eith
b710: 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  er during the cu
b720: 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e  rrent invocation
b730: 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20   or.  ** during 
b740: 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f 63  some prior invoc
b750: 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20 6a  ation.  Now we j
b760: 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73 74  ust have to cust
b770: 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20 64  omize the.  ** d
b780: 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49 6e  etails of pIdxIn
b790: 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  fo for the curre
b7a0: 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e  nt invocation an
b7b0: 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20 2a  d pass it to.  *
b7c0: 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20 20  * xBestIndex..  
b7d0: 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f 64  */..  /* The mod
b7e0: 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  ule name must be
b7f0: 20 64 65 66 69 6e 65 64 2e 20 41 6c 73 6f 2c 20   defined. Also, 
b800: 62 79 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  by this point th
b810: 65 72 65 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ere must.  ** be
b820: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
b830: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 73 74   sqlite3_vtab st
b840: 72 75 63 74 75 72 65 2e 20 4f 74 68 65 72 77 69  ructure. Otherwi
b850: 73 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 56  se.  ** sqlite3V
b860: 69 65 77 47 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  iewGetColumnName
b870: 73 28 29 20 77 6f 75 6c 64 20 68 61 76 65 20 70  s() would have p
b880: 69 63 6b 65 64 20 75 70 20 74 68 65 20 65 72 72  icked up the err
b890: 6f 72 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65  or. .  */.  asse
b8a0: 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75  rt( pTab->azModu
b8b0: 6c 65 41 72 67 20 26 26 20 70 54 61 62 2d 3e 61  leArg && pTab->a
b8c0: 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 20 29 3b  zModuleArg[0] );
b8d0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
b8e0: 3e 70 56 74 61 62 20 29 3b 0a 23 69 66 20 30 0a  >pVtab );.#if 0.
b8f0: 20 20 69 66 28 20 70 54 61 62 2d 3e 70 56 74 61    if( pTab->pVta
b900: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
b910: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b920: 73 65 2c 20 22 75 6e 64 65 66 69 6e 65 64 20 6d  se, "undefined m
b930: 6f 64 75 6c 65 20 25 73 20 66 6f 72 20 74 61 62  odule %s for tab
b940: 6c 65 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20  le %s",.        
b950: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
b960: 67 5b 30 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  g[0], pTab->zNam
b970: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  e);.    return 0
b980: 2e 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  .0;.  }.#endif..
b990: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
b9a0: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
b9b0: 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
b9c0: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
b9d0: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
b9e0: 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
b9f0: 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
ba00: 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
ba10: 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
ba20: 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
ba30: 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
ba40: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
ba50: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
ba60: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
ba70: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
ba80: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
ba90: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
baa0: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
bab0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
bac0: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
bad0: 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
bae0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
baf0: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
bb00: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
bb10: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
bb20: 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
bb30: 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
bb40: 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
bb50: 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
bb60: 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
bb70: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
bb80: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
bb90: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
bba0: 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
bbb0: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
bbc0: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
bbd0: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
bbe0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
bbf0: 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
bc00: 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
bc10: 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
bc20: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
bc30: 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
bc40: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
bc50: 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
bc60: 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
bc70: 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
bc80: 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
bc90: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
bca0: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
bcb0: 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
bcc0: 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
bcd0: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
bce0: 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
bcf0: 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
bd00: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
bd10: 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
bd20: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
bd30: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
bd40: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
bd50: 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
bd60: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
bd70: 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
bd80: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
bd90: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
bda0: 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
bdb0: 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
bdc0: 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
bdd0: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
bde0: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
bdf0: 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d  usable =  (pTerm
be00: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
be10: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20  notReady)==0;.  
be20: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
be30: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
be40: 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
be50: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
be60: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
be70: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
be80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
be90: 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
bea0: 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
beb0: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
bec0: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
bed0: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
bee0: 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
bef0: 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
bf00: 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
bf10: 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
bf20: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
bf30: 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
bf40: 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b  E_BIG_DBL / 2.0;
bf50: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
bf60: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
bf70: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
bf80: 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f  ->nOrderBy && !o
bf90: 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a  rderByUsable ){.
bfa0: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
bfb0: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
bfc0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 28 76 6f 69 64   0;.  }..  (void
bfd0: 29 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 66  )sqlite3SafetyOf
bfe0: 66 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20  f(pParse->db);. 
bff0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 78 42   WHERETRACE(("xB
c000: 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25 73 5c  estIndex for %s\
c010: 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  n", pTab->zName)
c020: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 49  );.  TRACE_IDX_I
c030: 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b  NPUTS(pIdxInfo);
c040: 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e 70 56  .  rc = pTab->pV
c050: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
c060: 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70  estIndex(pTab->p
c070: 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  Vtab, pIdxInfo);
c080: 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f 55 54  .  TRACE_IDX_OUT
c090: 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29 3b 0a  PUTS(pIdxInfo);.
c0a0: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53    (void)sqlite3S
c0b0: 61 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e  afetyOn(pParse->
c0c0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  db);..  for(i=0;
c0d0: 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   i<pIdxInfo->nCo
c0e0: 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29 7b 0a  nstraint; i++){.
c0f0: 20 20 20 20 69 66 28 20 21 70 49 64 78 49 6e 66      if( !pIdxInf
c100: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69  o->aConstraint[i
c110: 5d 2e 75 73 61 62 6c 65 20 26 26 20 70 55 73 61  ].usable && pUsa
c120: 67 65 5b 69 5d 2e 61 72 67 76 49 6e 64 65 78 3e  ge[i].argvIndex>
c130: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
c140: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
c150: 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 74  e, .          "t
c160: 61 62 6c 65 20 25 73 3a 20 78 42 65 73 74 49 6e  able %s: xBestIn
c170: 64 65 78 20 72 65 74 75 72 6e 65 64 20 61 6e 20  dex returned an 
c180: 69 6e 76 61 6c 69 64 20 70 6c 61 6e 22 2c 20 70  invalid plan", p
c190: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
c1a0: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
c1b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
c1c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c1d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c1e0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
c1f0: 20 20 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d     pParse->db->m
c200: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
c210: 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20 20  .    }else {.   
c220: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
c230: 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22 2c  sg(pParse, "%s",
c240: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
c250: 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  c));.    }.  }. 
c260: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
c270: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f  o->nOrderBy = nO
c280: 72 64 65 72 42 79 3b 0a 0a 20 20 72 65 74 75 72  rderBy;..  retur
c290: 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  n pIdxInfo->esti
c2a0: 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e  matedCost;.}.#en
c2b0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
c2c0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
c2d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  */../*.** Find t
c2e0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
c2f0: 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
c300: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
c310: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
c320: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65  r.** to the inde
c330: 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65  x, flags that de
c340: 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69  scribe how the i
c350: 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75  ndex should be u
c360: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  sed, the.** numb
c370: 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
c380: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20  onstraints, and 
c390: 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74  the "cost" for t
c3a0: 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  his index..**.**
c3b0: 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
c3c0: 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68   index wins.  Th
c3d0: 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
c3e0: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
c3f0: 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
c400: 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20  d disk I/O need 
c410: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
c420: 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65  equest using the
c430: 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e   selected index.
c440: 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74  .** Factors that
c450: 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20   influence cost 
c460: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
c470: 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74    *  The estimat
c480: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
c490: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
c4a0: 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a  etrieved.  (The.
c4b0: 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74  **       fewer t
c4c0: 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a  he better.).**.*
c4d0: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
c4e0: 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d  or not sorting m
c4f0: 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  ust occur..**.**
c500: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
c510: 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74  r not there must
c520: 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f   be separate loo
c530: 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  kups in the.**  
c540: 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69       index and i
c550: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
c560: 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64  ..**.*/.static d
c570: 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28  ouble bestIndex(
c580: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c590: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c5a0: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
c5b0: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
c5c0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
c5d0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
c5e0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
c5f0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
c600: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
c610: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
c620: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
c630: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
c640: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
c650: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
c660: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
c670: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
c680: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
c690: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
c6a0: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
c6b0: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70   */.  Index **pp
c6c0: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
c6d0: 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64    /* Make *ppInd
c6e0: 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ex point to the 
c6f0: 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  best index */.  
c700: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
c710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c720: 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62  ut flags describ
c730: 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20  ing this choice 
c740: 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20  in *pFlags */.  
c750: 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20  int *pnEq       
c760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c770: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
c780: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
c790: 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  aints here */.){
c7a0: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
c7b0: 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65  erm;.  Index *be
c7c0: 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  stIdx = 0;      
c7d0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
c7e0: 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73   gives the lowes
c7f0: 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62  t cost */.  doub
c800: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
c810: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
c820: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73  ost of using bes
c830: 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65  tIdx */.  int be
c840: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
c850: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
c860: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62  ssociated with b
c870: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
c880: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
c890: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
c8a0: 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f  value for nEq */
c8b0: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
c8c0: 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
c8d0: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
c8e0: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
c8f0: 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
c900: 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
c910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
c920: 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
c930: 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  luating */.  int
c940: 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
c950: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
c960: 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
c970: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  rse order */.  i
c980: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
c990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
c9a0: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
c9b0: 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ith pProbe */.  
c9c0: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
c9e0: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
c9f0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
ca00: 0a 20 20 69 6e 74 20 65 71 54 65 72 6d 4d 61 73  .  int eqTermMas
ca10: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
ca20: 2a 20 4d 61 73 6b 20 6f 66 20 76 61 6c 69 64 20  * Mask of valid 
ca30: 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
ca40: 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63  rs */.  double c
ca50: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ost;            
ca60: 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75      /* Cost of u
ca70: 73 69 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a  sing pProbe */..
ca80: 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62    WHERETRACE(("b
ca90: 65 73 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73  estIndex: tbl=%s
caa0: 20 6e 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c   notReady=%x\n",
cab0: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61   pSrc->pTab->zNa
cac0: 6d 65 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a  me, notReady));.
cad0: 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53    lowestCost = S
cae0: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20  QLITE_BIG_DBL;. 
caf0: 20 70 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e   pProbe = pSrc->
cb00: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20  pTab->pIndex;.. 
cb10: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
cb20: 20 68 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20   has no indices 
cb30: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
cb40: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68   terms in the wh
cb50: 65 72 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20  ere.  ** clause 
cb60: 74 68 61 74 20 72 65 66 65 72 20 74 6f 20 74 68  that refer to th
cb70: 65 20 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65  e ROWID, then we
cb80: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61   will never be a
cb90: 62 6c 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61  ble to do.  ** a
cba0: 6e 79 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68  nything other th
cbb0: 61 6e 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20  an a full table 
cbc0: 73 63 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62  scan on this tab
cbd0: 6c 65 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73  le.  We might as
cbe0: 0a 20 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69  .  ** well put i
cbf0: 74 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a  t first in the j
cc00: 6f 69 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74  oin order.  That
cc10: 20 77 61 79 2c 20 70 65 72 68 61 70 73 20 69 74   way, perhaps it
cc20: 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66   can be.  ** ref
cc30: 65 72 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72  erenced by other
cc40: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a   tables in the j
cc50: 6f 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  oin..  */.  if( 
cc60: 70 50 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20  pProbe==0 &&.   
cc70: 20 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20    findTerm(pWC, 
cc80: 69 43 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f  iCur, -1, 0, WO_
cc90: 45 51 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57  EQ|WO_IN|WO_LT|W
cca0: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
ccb0: 2c 30 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28  ,0)==0 &&.     (
ccc0: 70 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21  pOrderBy==0 || !
ccd0: 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28  sortableByRowid(
cce0: 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20  iCur, pOrderBy, 
ccf0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 20 26  pWC->pMaskSet, &
cd00: 72 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70 46  rev)) ){.    *pF
cd10: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a 70  lags = 0;.    *p
cd20: 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20  pIndex = 0;.    
cd30: 2a 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 72  *pnEq = 0;.    r
cd40: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a  eturn 0.0;.  }..
cd50: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61    /* Check for a
cd60: 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72   rowid=EXPR or r
cd70: 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f  owid IN (...) co
cd80: 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20  nstraints.  */. 
cd90: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
cda0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
cdb0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
cdc0: 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66  |WO_IN, 0);.  if
cdd0: 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45  ( pTerm ){.    E
cde0: 78 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20  xpr *pExpr;.    
cdf0: 2a 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20  *ppIndex = 0;.  
ce00: 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48    bestFlags = WH
ce10: 45 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20  ERE_ROWID_EQ;.  
ce20: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70    if( pTerm->eOp
ce30: 65 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29  erator & WO_EQ )
ce40: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64  {.      /* Rowid
ce50: 3d 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65  == is always the
ce60: 20 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f   best pick.  Loo
ce70: 6b 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42  k no further.  B
ce80: 65 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20  ecause only.    
ce90: 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f    ** a single ro
cea0: 77 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20  w is generated, 
ceb0: 6f 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73  output is always
cec0: 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72   in sorted order
ced0: 20 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67   */.      *pFlag
cee0: 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s = WHERE_ROWID_
cef0: 45 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55  EQ | WHERE_UNIQU
cf00: 45 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d  E;.      *pnEq =
cf10: 20 31 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54   1;.      WHERET
cf20: 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73 74 20  RACE(("... best 
cf30: 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b 0a 20  is rowid\n"));. 
cf40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b       return 0.0;
cf50: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
cf60: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
cf70: 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d 30 20  Expr)->pList!=0 
cf80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  ){.      /* Rowi
cf90: 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63 6f 73  d IN (LIST): cos
cfa0: 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65  t is NlogN where
cfb0: 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72   N is the number
cfc0: 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20 20 2a   of list.      *
cfd0: 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a 2f 0a  * elements.  */.
cfe0: 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
cff0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
d000: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 6c 6f  >nExpr;.      lo
d010: 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73 74 4c  westCost *= estL
d020: 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29 3b 0a  og(lowestCost);.
d030: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d040: 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28 53 45   /* Rowid IN (SE
d050: 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LECT): cost is N
d060: 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
d070: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
d080: 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74  ws.      ** in t
d090: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
d0a0: 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e 20 20   inner select.  
d0b0: 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  We have no way t
d0c0: 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20 20 20  o estimate.     
d0d0: 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65 20 73   ** that value s
d0e0: 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20 67 75  o make a wild gu
d0f0: 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20 6c 6f  ess. */.      lo
d100: 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30 3b 0a  westCost = 200;.
d110: 20 20 20 20 7d 0a 20 20 20 20 57 48 45 52 45 54      }.    WHERET
d120: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
d130: 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e   IN cost: %.9g\n
d140: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b  ", lowestCost));
d150: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  .  }..  /* Estim
d160: 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ate the cost of 
d170: 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49  a table scan.  I
d180: 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  f we do not know
d190: 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65   how many.  ** e
d1a0: 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68  ntries are in th
d1b0: 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d  e table, use 1 m
d1c0: 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73  illion as a gues
d1d0: 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d  s..  */.  cost =
d1e0: 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65   pProbe ? pProbe
d1f0: 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20  ->aiRowEst[0] : 
d200: 31 30 30 30 30 30 30 3b 0a 20 20 57 48 45 52 45  1000000;.  WHERE
d210: 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c  TRACE(("... tabl
d220: 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74  e scan base cost
d230: 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  : %.9g\n", cost)
d240: 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45  );.  flags = WHE
d250: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a  RE_ROWID_RANGE;.
d260: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
d270: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
d280: 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73   range of rowids
d290: 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e   in a table scan
d2a0: 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d  ..  */.  pTerm =
d2b0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d2c0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
d2d0: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
d2e0: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
d2f0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
d300: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
d310: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
d320: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
d330: 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_LE, 0) ){.    
d340: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
d350: 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
d360: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
d370: 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
d380: 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d<EXPR eliminate
d390: 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20  s two-thirds or 
d3a0: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rows */.    }.  
d3b0: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
d3c0: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
d3d0: 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
d3e0: 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _GE, 0) ){.     
d3f0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
d400: 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
d410: 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20   cost /= 3;  /* 
d420: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
d430: 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  >EXPR eliminates
d440: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72   two-thirds of r
d450: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
d460: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
d470: 2e 20 72 6f 77 69 64 20 72 61 6e 67 65 20 72 65  . rowid range re
d480: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
d490: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
d4a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67   }else{.    flag
d4b0: 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  s = 0;.  }..  /*
d4c0: 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 73 63   If the table sc
d4d0: 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73 61 74 69  an does not sati
d4e0: 73 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59  sfy the ORDER BY
d4f0: 20 63 6c 61 75 73 65 2c 20 69 6e 63 72 65 61 73   clause, increas
d500: 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 73 74 20  e.  ** the cost 
d510: 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63 6f 76 65  by NlogN to cove
d520: 72 20 74 68 65 20 65 78 70 65 6e 73 65 20 6f 66  r the expense of
d530: 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 69   sorting. */.  i
d540: 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a 20  f( pOrderBy ){. 
d550: 20 20 20 69 66 28 20 73 6f 72 74 61 62 6c 65 42     if( sortableB
d560: 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72  yRowid(iCur, pOr
d570: 64 65 72 42 79 2c 20 70 57 43 2d 3e 70 4d 61 73  derBy, pWC->pMas
d580: 6b 53 65 74 2c 20 26 72 65 76 29 20 29 7b 0a 20  kSet, &rev) ){. 
d590: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
d5a0: 45 52 45 5f 4f 52 44 45 52 42 59 7c 57 48 45 52  ERE_ORDERBY|WHER
d5b0: 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a 20  E_ROWID_RANGE;. 
d5c0: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
d5d0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
d5e0: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 3b 0a   WHERE_REVERSE;.
d5f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
d600: 65 7b 0a 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  e{.      cost +=
d610: 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
d620: 74 29 3b 0a 20 20 20 20 20 20 57 48 45 52 45 54  t);.      WHERET
d630: 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
d640: 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  ng increases cos
d650: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
d660: 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
d670: 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
d680: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77  tCost ){.    low
d690: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
d6a0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
d6b0: 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  flags;.  }..  /*
d6c0: 20 49 66 20 74 68 65 20 70 53 72 63 20 74 61 62   If the pSrc tab
d6d0: 6c 65 20 69 73 20 74 68 65 20 72 69 67 68 74 20  le is the right 
d6e0: 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54 20  table of a LEFT 
d6f0: 4a 4f 49 4e 20 74 68 65 6e 20 77 65 20 6d 61 79  JOIN then we may
d700: 20 6e 6f 74 0a 20 20 2a 2a 20 75 73 65 20 61 6e   not.  ** use an
d710: 20 69 6e 64 65 78 20 74 6f 20 73 61 74 69 73 66   index to satisf
d720: 79 20 49 53 20 4e 55 4c 4c 20 63 6f 6e 73 74 72  y IS NULL constr
d730: 61 69 6e 74 73 20 6f 6e 20 74 68 61 74 20 74 61  aints on that ta
d740: 62 6c 65 2e 20 20 54 68 69 73 20 69 73 0a 20 20  ble.  This is.  
d750: 2a 2a 20 62 65 63 61 75 73 65 20 63 6f 6c 75 6d  ** because colum
d760: 6e 73 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20  ns might end up 
d770: 62 65 69 6e 67 20 4e 55 4c 4c 20 69 66 20 74 68  being NULL if th
d780: 65 20 74 61 62 6c 65 20 64 6f 65 73 20 6e 6f 74  e table does not
d790: 20 6d 61 74 63 68 20 2d 0a 20 20 2a 2a 20 61 20   match -.  ** a 
d7a0: 63 69 72 63 75 6d 73 74 61 6e 63 65 20 77 68 69  circumstance whi
d7b0: 63 68 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e  ch the index can
d7c0: 6e 6f 74 20 68 65 6c 70 20 75 73 20 64 69 73 63  not help us disc
d7d0: 6f 76 65 72 2e 20 20 54 69 63 6b 65 74 20 23 32  over.  Ticket #2
d7e0: 31 37 37 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  177..  */.  if( 
d7f0: 28 70 53 72 63 2d 3e 6a 6f 69 6e 74 79 70 65 20  (pSrc->jointype 
d800: 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b  & JT_LEFT)!=0 ){
d810: 0a 20 20 20 20 65 71 54 65 72 6d 4d 61 73 6b 20  .    eqTermMask 
d820: 3d 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 3b 0a 20  = WO_EQ|WO_IN;. 
d830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 71 54 65   }else{.    eqTe
d840: 72 6d 4d 61 73 6b 20 3d 20 57 4f 5f 45 51 7c 57  rmMask = WO_EQ|W
d850: 4f 5f 49 4e 7c 57 4f 5f 49 53 4e 55 4c 4c 3b 0a  O_IN|WO_ISNULL;.
d860: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61    }..  /* Look a
d870: 74 20 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20  t each index..  
d880: 2a 2f 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62  */.  for(; pProb
d890: 65 3b 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65  e; pProbe=pProbe
d8a0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e  ->pNext){.    in
d8b0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
d8c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
d8d0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
d8e0: 20 20 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69    double inMulti
d8f0: 70 6c 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20  plier = 1;..    
d900: 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e  WHERETRACE(("...
d910: 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20 70   index %s:\n", p
d920: 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b 0a  Probe->zName));.
d930: 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68  .    /* Count th
d940: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
d950: 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65 78  mns in the index
d960: 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73 66   that are satisf
d970: 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78 3d  ied.    ** by x=
d980: 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 73  EXPR constraints
d990: 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20 63   or x IN (...) c
d9a0: 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20 20  onstraints..    
d9b0: 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  */.    flags = 0
d9c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d9d0: 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e  <pProbe->nColumn
d9e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e  ; i++){.      in
d9f0: 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t j = pProbe->ai
da00: 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20 20  Column[i];.     
da10: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
da20: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20  m(pWC, iCur, j, 
da30: 6e 6f 74 52 65 61 64 79 2c 20 65 71 54 65 72 6d  notReady, eqTerm
da40: 4d 61 73 6b 2c 20 70 50 72 6f 62 65 29 3b 0a 20  Mask, pProbe);. 
da50: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
da60: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
da70: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
da80: 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20 20 20  COLUMN_EQ;.     
da90: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
daa0: 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20 29 7b  rator & WO_IN ){
dab0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
dac0: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
dad0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66 6c 61  xpr;.        fla
dae0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
daf0: 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20 20 69  MN_IN;.        i
db00: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
db10: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t!=0 ){.        
db20: 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a    inMultiplier *
db30: 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20 7d 65  = 25;.        }e
db40: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
db50: 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  List!=0 ){.     
db60: 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65       inMultiplie
db70: 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  r *= pExpr->pLis
db80: 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a 20 20  t->nExpr + 1;.  
db90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dba0: 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74 20 3d      }.    cost =
dbb0: 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73   pProbe->aiRowEs
dbc0: 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69 70 6c  t[i] * inMultipl
dbd0: 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69 6e 4d  ier * estLog(inM
dbe0: 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20 20 20  ultiplier);.    
dbf0: 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69 66 28  nEq = i;.    if(
dc00: 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72 6f 72   pProbe->onError
dc10: 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28 66 6c  !=OE_None && (fl
dc20: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
dc30: 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20 20 20  MN_IN)==0.      
dc40: 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72 6f 62     && nEq==pProb
dc50: 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
dc60: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
dc70: 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 7d  RE_UNIQUE;.    }
dc80: 0a 20 20 20 20 57 48 45 52 45 54 52 41 43 45 28  .    WHERETRACE(
dc90: 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20  ("...... nEq=%d 
dca0: 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74  inMult=%.9g cost
dcb0: 3d 25 2e 39 67 5c 6e 22 2c 6e 45 71 2c 69 6e 4d  =%.9g\n",nEq,inM
dcc0: 75 6c 74 69 70 6c 69 65 72 2c 63 6f 73 74 29 29  ultiplier,cost))
dcd0: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ;..    /* Look f
dce0: 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  or range constra
dcf0: 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ints.    */.    
dd00: 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
dd10: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
dd20: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
dd30: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
dd40: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
dd50: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
dd60: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
dd70: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
dd80: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b  |WO_GE, pProbe);
dd90: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
dda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
ddb0: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
ddc0: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
ddd0: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
dde0: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
ddf0: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
de00: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
de10: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
de20: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
de30: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
de40: 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d   /= 3;.        }
de50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
de60: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
de70: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
de80: 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
de90: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
dea0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
deb0: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
dec0: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
ded0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
dee0: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e   WHERETRACE(("..
def0: 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63  .... range reduc
df00: 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c  es cost to %.9g\
df10: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20  n", cost));.    
df20: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
df30: 2a 20 41 64 64 20 74 68 65 20 61 64 64 69 74 69  * Add the additi
df40: 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72  onal cost of sor
df50: 74 69 6e 67 20 69 66 20 74 68 61 74 20 69 73 20  ting if that is 
df60: 61 20 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f  a factor..    */
df70: 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65 72 42  .    if( pOrderB
df80: 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  y ){.      if( (
df90: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
dfa0: 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20  LUMN_IN)==0 &&. 
dfb0: 20 20 20 20 20 20 20 20 20 20 69 73 53 6f 72 74            isSort
dfc0: 69 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c  ingIndex(pParse,
dfd0: 70 57 43 2d 3e 70 4d 61 73 6b 53 65 74 2c 70 50  pWC->pMaskSet,pP
dfe0: 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72  robe,iCur,pOrder
dff0: 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a  By,nEq,&rev) ){.
e000: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
e010: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
e020: 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
e030: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
e040: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e050: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
e060: 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
e070: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
e080: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
e090: 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  ERE_REVERSE;.   
e0a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  se{.        cost
e0c0: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
e0d0: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 57  cost);.        W
e0e0: 48 45 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e  HERETRACE(("....
e0f0: 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65  .. orderby incre
e100: 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
e110: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
e120: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
e130: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
e140: 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61   if we can get a
e150: 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a  way with using j
e160: 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69  ust the index wi
e170: 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65  thout.    ** eve
e180: 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61  r reading the ta
e190: 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73  ble.  If that is
e1a0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
e1b0: 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a  halve the.    **
e1c0: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e   cost of this in
e1d0: 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
e1e0: 69 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72  if( flags && pSr
e1f0: 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28  c->colUsed < (((
e200: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
e210: 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69  -1)) ){.      Bi
e220: 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
e230: 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
e240: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
e250: 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e  j=0; j<pProbe->n
e260: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
e270: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
e280: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  robe->aiColumn[j
e290: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
e2a0: 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
e2b0: 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
e2c0: 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
e2d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
e2e0: 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
e2f0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
e300: 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
e310: 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f  ;.        cost /
e320: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 57 48 45  = 2;.        WHE
e330: 52 45 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e  RETRACE(("......
e340: 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64 75 63 65   idx-only reduce
e350: 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e  s cost to %.9g\n
e360: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20  ", cost));.     
e370: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
e380: 20 49 66 20 74 68 69 73 20 69 6e 64 65 78 20 68   If this index h
e390: 61 73 20 61 63 68 69 65 76 65 64 20 74 68 65 20  as achieved the 
e3a0: 6c 6f 77 65 73 74 20 63 6f 73 74 20 73 6f 20 66  lowest cost so f
e3b0: 61 72 2c 20 74 68 65 6e 20 75 73 65 20 69 74 2e  ar, then use it.
e3c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
e3d0: 66 6c 61 67 73 20 26 26 20 63 6f 73 74 20 3c 20  flags && cost < 
e3e0: 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a 20 20  lowestCost ){.  
e3f0: 20 20 20 20 62 65 73 74 49 64 78 20 3d 20 70 50      bestIdx = pP
e400: 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65  robe;.      lowe
e410: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
e420: 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d       bestFlags =
e430: 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 62 65   flags;.      be
e440: 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20  stNEq = nEq;.   
e450: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
e460: 6f 72 74 20 74 68 65 20 62 65 73 74 20 72 65 73  ort the best res
e470: 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a 70 70 49 6e  ult.  */.  *ppIn
e480: 64 65 78 20 3d 20 62 65 73 74 49 64 78 3b 0a 20  dex = bestIdx;. 
e490: 20 57 48 45 52 45 54 52 41 43 45 28 28 22 62 65   WHERETRACE(("be
e4a0: 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20  st index is %s, 
e4b0: 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73  cost=%.9g, flags
e4c0: 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a  =%x, nEq=%d\n",.
e4d0: 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20          bestIdx 
e4e0: 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65  ? bestIdx->zName
e4f0: 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77   : "(none)", low
e500: 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61  estCost, bestFla
e510: 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20  gs, bestNEq));. 
e520: 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46   *pFlags = bestF
e530: 6c 61 67 73 20 7c 20 65 71 54 65 72 6d 4d 61 73  lags | eqTermMas
e540: 6b 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62 65 73  k;.  *pnEq = bes
e550: 74 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e 20 6c  tNEq;.  return l
e560: 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a 0a 2f  owestCost;.}.../
e570: 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 20 74  *.** Disable a t
e580: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
e590: 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65 70 74   clause.  Except
e5a0: 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62 6c 65  , do not disable
e5b0: 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69 66 20   the term.** if 
e5c0: 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20 4c 45  it controls a LE
e5d0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20 61 6e  FT OUTER JOIN an
e5e0: 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f 72 69  d it did not ori
e5f0: 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20 4f 4e  ginate in the ON
e600: 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63 6c 61  .** or USING cla
e610: 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f 69 6e  use of that join
e620: 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64 65 72  ..**.** Consider
e630: 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a 3d 27   the term t2.z='
e640: 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  ok' in the follo
e650: 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a 2a 2a  wing queries:.**
e660: 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c 45 43  .**   (1)  SELEC
e670: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
e680: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
e690: 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32 2e 7a  =t2.x WHERE t2.z
e6a0: 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29 20 20  ='ok'.**   (2)  
e6b0: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
e6c0: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
e6d0: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
e6e0: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 33  2.z='ok'.**   (3
e6f0: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
e700: 20 74 31 2c 20 74 32 20 57 48 45 52 45 20 74 31   t1, t2 WHERE t1
e710: 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a  .a=t2.x AND t2.z
e720: 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ='ok'.**.** The 
e730: 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64 69 73  t2.z='ok' is dis
e740: 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69 6e 20  abled in the in 
e750: 28 32 29 20 62 65 63 61 75 73 65 20 69 74 20 6f  (2) because it o
e760: 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69 6e 20  riginates.** in 
e770: 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e 20 20  the ON clause.  
e780: 54 68 65 20 74 65 72 6d 20 69 73 20 64 69 73 61  The term is disa
e790: 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65 63 61  bled in (3) beca
e7a0: 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70 61  use it is not pa
e7b0: 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46 54 20  rt.** of a LEFT 
e7c0: 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49 6e 20  OUTER JOIN.  In 
e7d0: 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20 69 73  (1), the term is
e7e0: 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e 0a 2a   not disabled..*
e7f0: 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67 20 61  *.** Disabling a
e800: 20 74 65 72 6d 20 63 61 75 73 65 73 20 74 68 61   term causes tha
e810: 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20 62 65  t term to not be
e820: 20 74 65 73 74 65 64 20 69 6e 20 74 68 65 20 69   tested in the i
e830: 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f 66 20  nner loop.** of 
e840: 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73 61 62  the join.  Disab
e850: 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74 69 6d  ling is an optim
e860: 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e 20 74  ization.  When t
e870: 65 72 6d 73 20 61 72 65 20 73 61 74 69 73 66 69  erms are satisfi
e880: 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63 65 73  ed.** by indices
e890: 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74 68 65  , we disable the
e8a0: 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 64  m to prevent red
e8b0: 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69 6e 20  undant tests in 
e8c0: 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c 6f 6f  the inner.** loo
e8d0: 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65 74  p.  We would get
e8e0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
e8f0: 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
e900: 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
e910: 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69 6e 73  ed,.** but joins
e920: 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69 74   might run a lit
e930: 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  tle slower.  The
e940: 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
e950: 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a 2a 20  able as much.** 
e960: 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f 75  as we can withou
e970: 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f 6f 20  t disabling too 
e980: 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
e990: 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
e9a0: 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20 77 72  'd get.** the wr
e9b0: 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53 65 65  ong answer.  See
e9c0: 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f   ticket #813..*/
e9d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
e9e0: 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65  ableTerm(WhereLe
e9f0: 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57 68 65  vel *pLevel, Whe
ea00: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29 7b 0a  reTerm *pTerm){.
ea10: 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20 20 20    if( pTerm.    
ea20: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 66 6c 61    && (pTerm->fla
ea30: 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29  gs & TERM_CODED)
ea40: 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28 70 4c  ==0.      && (pL
ea50: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d  evel->iLeftJoin=
ea60: 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72 6f  =0 || ExprHasPro
ea70: 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70 45 78  perty(pTerm->pEx
ea80: 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29  pr, EP_FromJoin)
ea90: 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65 72 6d  ).  ){.    pTerm
eaa0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f  ->flags |= TERM_
eab0: 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28 20 70  CODED;.    if( p
eac0: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e 3d 30  Term->iParent>=0
ead0: 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65 54   ){.      WhereT
eae0: 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20 26 70  erm *pOther = &p
eaf0: 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70 54 65  Term->pWC->a[pTe
eb00: 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a 20 20  rm->iParent];.  
eb10: 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74 68 65      if( (--pOthe
eb20: 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20 29 7b  r->nChild)==0 ){
eb30: 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
eb40: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 4f 74  Term(pLevel, pOt
eb50: 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  her);.      }.  
eb60: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
eb70: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
eb80: 68 61 74 20 62 75 69 6c 64 73 20 61 20 70 72 6f  hat builds a pro
eb90: 62 65 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 2e  be for an index.
eba0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 73 68 6f  .**.** There sho
ebb0: 75 6c 64 20 62 65 20 6e 43 6f 6c 75 6d 6e 20 76  uld be nColumn v
ebc0: 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 73 74 61  alues on the sta
ebd0: 63 6b 2e 20 20 54 68 65 20 69 6e 64 65 78 0a 2a  ck.  The index.*
ebe0: 2a 20 74 6f 20 62 65 20 70 72 6f 62 65 64 20 69  * to be probed i
ebf0: 73 20 70 49 64 78 2e 20 20 50 6f 70 20 74 68 65  s pIdx.  Pop the
ec00: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 74 68 65   values from the
ec10: 20 73 74 61 63 6b 20 61 6e 64 0a 2a 2a 20 72 65   stack and.** re
ec20: 70 6c 61 63 65 20 74 68 65 6d 20 61 6c 6c 20 77  place them all w
ec30: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 72 65 63  ith a single rec
ec40: 6f 72 64 20 74 68 61 74 20 69 73 20 74 68 65 20  ord that is the 
ec50: 69 6e 64 65 78 0a 2a 2a 20 70 72 6f 62 6c 65 6d  index.** problem
ec60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ec70: 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
ec80: 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20  (.  Vdbe *v,    
ec90: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
eca0: 63 6f 64 65 20 69 6e 74 6f 20 74 68 69 73 20 56  code into this V
ecb0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  M */.  int nColu
ecc0: 6d 6e 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 75  mn,    /* The nu
ecd0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
ece0: 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 4e 55 4c  to check for NUL
ecf0: 4c 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  L */.  Index *pI
ed00: 64 78 2c 20 20 20 20 2f 2a 20 49 6e 64 65 78 20  dx,    /* Index 
ed10: 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20  that we will be 
ed20: 73 65 61 72 63 68 69 6e 67 20 2a 2f 0a 20 20 69  searching */.  i
ed30: 6e 74 20 72 65 67 53 72 63 2c 20 20 20 20 20 2f  nt regSrc,     /
ed40: 2a 20 54 61 6b 65 20 76 61 6c 75 65 73 20 66 72  * Take values fr
ed50: 6f 6d 20 74 68 69 73 20 72 65 67 69 73 74 65 72  om this register
ed60: 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 44 65 73   */.  int regDes
ed70: 74 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  t     /* Write t
ed80: 68 65 20 72 65 73 75 6c 74 20 69 6e 74 6f 20 74  he result into t
ed90: 68 69 73 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  his register */.
eda0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 72 65 67  ){.  assert( reg
edb0: 53 72 63 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  Src>0 );.  asser
edc0: 74 28 20 72 65 67 44 65 73 74 3e 30 20 29 3b 0a  t( regDest>0 );.
edd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ede0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
edf0: 63 6f 72 64 2c 20 72 65 67 53 72 63 2c 20 6e 43  cord, regSrc, nC
ee00: 6f 6c 75 6d 6e 2c 20 72 65 67 44 65 73 74 29 3b  olumn, regDest);
ee10: 0a 20 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  .  sqlite3IndexA
ee20: 66 66 69 6e 69 74 79 53 74 72 28 76 2c 20 70 49  ffinityStr(v, pI
ee30: 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  dx);.}.../*.** G
ee40: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
ee50: 20 61 20 73 69 6e 67 6c 65 20 65 71 75 61 6c 69   a single equali
ee60: 74 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57  ty term of the W
ee70: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e  HERE clause.  An
ee80: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72   equality.** ter
ee90: 6d 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20  m can be either 
eea0: 58 3d 65 78 70 72 20 6f 72 20 58 20 49 4e 20 28  X=expr or X IN (
eeb0: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
eec0: 20 74 68 65 20 74 65 72 6d 20 74 6f 20 62 65 20   the term to be 
eed0: 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a  .** coded..**.**
eee0: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
eef0: 75 65 20 66 6f 72 20 74 68 65 20 63 6f 6e 73 74  ue for the const
ef00: 72 61 69 6e 74 20 69 73 20 6c 65 66 74 20 69 6e  raint is left in
ef10: 20 72 65 67 69 73 74 65 72 20 69 52 65 67 2e 0a   register iReg..
ef20: 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73  **.** For a cons
ef30: 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20 66 6f  traint of the fo
ef40: 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65 20 65  rm X=expr, the e
ef50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65 76 61  xpression is eva
ef60: 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73 0a 2a  luated and its.*
ef70: 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65 66 74  * result is left
ef80: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20   on the stack.  
ef90: 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  For constraints 
efa0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20 49 4e  of the form X IN
efb0: 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72   (...).** this r
efc0: 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70 20 61  outine sets up a
efd0: 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c 6c 20   loop that will 
efe0: 69 74 65 72 61 74 65 20 6f 76 65 72 20 61 6c 6c  iterate over all
eff0: 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f   values of X..*/
f000: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
f010: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
f020: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
f030: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
f040: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
f050: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
f060: 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  m,   /* The term
f070: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
f080: 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
f090: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
f0a0: 20 2a 70 4c 65 76 65 6c 2c 20 2f 2a 20 57 68 65   *pLevel, /* Whe
f0b0: 6e 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 46  n level of the F
f0c0: 52 4f 4d 20 63 6c 61 75 73 65 20 77 65 20 61 72  ROM clause we ar
f0d0: 65 20 77 6f 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a  e working on */.
f0e0: 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 20 20    int iReg      
f0f0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72        /* Leave r
f100: 65 73 75 6c 74 73 20 69 6e 20 74 68 69 73 20 72  esults in this r
f110: 65 67 69 73 74 65 72 20 2a 2f 0a 29 7b 0a 20 20  egister */.){.  
f120: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
f130: 2d 3e 70 45 78 70 72 3b 0a 20 20 56 64 62 65 20  ->pExpr;.  Vdbe 
f140: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
f150: 62 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  be;..  assert( i
f160: 52 65 67 3e 30 20 26 26 20 69 52 65 67 3c 3d 70  Reg>0 && iReg<=p
f170: 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a 20  Parse->nMem );. 
f180: 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f   if( pX->op==TK_
f190: 45 51 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  EQ ){.    sqlite
f1a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
f1b0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20 69 52  , pX->pRight, iR
f1c0: 65 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eg);.  }else if(
f1d0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 55   pX->op==TK_ISNU
f1e0: 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  LL ){.    sqlite
f1f0: 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
f200: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 69 52 65 67 29  P_Null, 0, iReg)
f210: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f220: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
f230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f240: 65 54 79 70 65 3b 0a 20 20 20 20 69 6e 74 20 69  eType;.    int i
f250: 54 61 62 3b 0a 20 20 20 20 73 74 72 75 63 74 20  Tab;.    struct 
f260: 49 6e 4c 6f 6f 70 20 2a 70 49 6e 3b 0a 0a 20 20  InLoop *pIn;..  
f270: 20 20 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70    assert( pX->op
f280: 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 65  ==TK_IN );.    e
f290: 54 79 70 65 20 3d 20 73 71 6c 69 74 65 33 46 69  Type = sqlite3Fi
f2a0: 6e 64 49 6e 49 6e 64 65 78 28 70 50 61 72 73 65  ndInIndex(pParse
f2b0: 2c 20 70 58 2c 20 31 29 3b 0a 20 20 20 20 69 54  , pX, 1);.    iT
f2c0: 61 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b  ab = pX->iTable;
f2d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f2e0: 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77  AddOp2(v, OP_Rew
f2f0: 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  ind, iTab, 0);. 
f300: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
f310: 76 2c 20 22 25 2e 2a 73 22 2c 20 70 58 2d 3e 73  v, "%.*s", pX->s
f320: 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e  pan.n, pX->span.
f330: 7a 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  z));.    if( pLe
f340: 76 65 6c 2d 3e 6e 49 6e 3d 3d 30 20 29 7b 0a 20  vel->nIn==0 ){. 
f350: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 78 74       pLevel->nxt
f360: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
f370: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
f380: 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  }.    pLevel->nI
f390: 6e 2b 2b 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  n++;.    pLevel-
f3a0: 3e 61 49 6e 4c 6f 6f 70 20 3d 20 73 71 6c 69 74  >aInLoop = sqlit
f3b0: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
f3c0: 65 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 4c  e(pParse->db, pL
f3d0: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20  evel->aInLoop,. 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 73 69 7a 65 6f 66 28 70 4c 65 76 65 6c     sizeof(pLevel
f410: 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d 29 2a 70 4c  ->aInLoop[0])*pL
f420: 65 76 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20  evel->nIn);.    
f430: 70 49 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49  pIn = pLevel->aI
f440: 6e 4c 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 70  nLoop;.    if( p
f450: 49 6e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 20  In ){.      pIn 
f460: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 2d  += pLevel->nIn -
f470: 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 2d 3e 69   1;.      pIn->i
f480: 43 75 72 20 3d 20 69 54 61 62 3b 0a 20 20 20 20  Cur = iTab;.    
f490: 20 20 69 66 28 20 65 54 79 70 65 3d 3d 49 4e 5f    if( eType==IN_
f4a0: 49 4e 44 45 58 5f 52 4f 57 49 44 20 29 7b 0a 20  INDEX_ROWID ){. 
f4b0: 20 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41         pIn->topA
f4c0: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f4d0: 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f  eAddOp2(v, OP_Ro
f4e0: 77 69 64 2c 20 69 54 61 62 2c 20 69 52 65 67 29  wid, iTab, iReg)
f4f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f500: 20 20 20 20 20 20 20 70 49 6e 2d 3e 74 6f 70 41         pIn->topA
f510: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
f520: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f  eAddOp3(v, OP_Co
f530: 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 2c 20 69  lumn, iTab, 0, i
f540: 52 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Reg);.      }.  
f550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f560: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 73 4e 75  ddOp1(v, OP_IsNu
f570: 6c 6c 2c 20 69 52 65 67 29 3b 0a 20 20 20 20 7d  ll, iReg);.    }
f580: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76  else{.      pLev
f590: 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20  el->nIn = 0;.   
f5a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
f5b0: 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76  disableTerm(pLev
f5c0: 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f  el, pTerm);.}../
f5d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
f5e0: 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61  de that will eva
f5f0: 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64  luate all == and
f600: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
f610: 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e  for an.** index.
f620: 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72    The values for
f630: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
f640: 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65   are left on the
f650: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f   stack..**.** Fo
f660: 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69  r example, consi
f670: 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62  der table t1(a,b
f680: 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69  ,c,d,e,f) with i
f690: 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a  ndex i1(a,b,c)..
f6a0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57  ** Suppose the W
f6b0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74  HERE clause is t
f6c0: 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62  his:  a==5 AND b
f6d0: 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20   IN (1,2,3) AND 
f6e0: 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20  c>5 AND c<10.** 
f6f0: 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73  The index has as
f700: 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65   many as three e
f710: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
f720: 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73  nts, but in this
f730: 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65  .** example, the
f740: 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65   third "c" value
f750: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
f760: 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20  y.  So only two 
f770: 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  .** constraints 
f780: 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73  are coded.  This
f790: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65   routine will ge
f7a0: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
f7b0: 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20  valuate.** a==5 
f7c0: 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29  and b IN (1,2,3)
f7d0: 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76  .  The current v
f7e0: 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20  alues for a and 
f7f0: 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a  b will be left.*
f800: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d  * on the stack -
f810: 20 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73   a is the deepes
f820: 74 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c  t and b the shal
f830: 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  lowest..**.** In
f840: 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f   the example abo
f850: 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20  ve nEq==2.  But 
f860: 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20  this subroutine 
f870: 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61  works for any va
f880: 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e  lue.** of nEq in
f890: 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e  cluding 0.  If n
f8a0: 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74  Eq==0, this rout
f8b0: 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20  ine is nearly a 
f8c0: 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e  no-op..** The on
f8d0: 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73  ly thing it does
f8e0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65   is allocate the
f8f0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65   pLevel->iMem me
f900: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
f910: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
f920: 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61  ways allocates a
f930: 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f  t least one memo
f940: 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73  ry cell and puts
f950: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
f960: 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63  of that memory c
f970: 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69  ell in pLevel->i
f980: 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74  Mem.  The code t
f990: 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69  hat.** calls thi
f9a0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75  s routine will u
f9b0: 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20  se pLevel->iMem 
f9c0: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72  to store the ter
f9d0: 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20  mination.** key 
f9e0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  value of the loo
f9f0: 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f  p.  If one or mo
fa00: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
fa10: 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20  appear, then.** 
fa20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c  this routine all
fa30: 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69  ocates an additi
fa40: 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20  onal nEq memory 
fa50: 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e  cells for intern
fa60: 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74  al.** use..*/.st
fa70: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 41 6c 6c  atic int codeAll
fa80: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
fa90: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
faa0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
fab0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
fac0: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
fad0: 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
fae0: 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
faf0: 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
fb00: 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
fb10: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
fb20: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
fb30: 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
fb40: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
fb50: 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
fb60: 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
fb70: 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
fb80: 20 20 69 6e 74 20 6e 45 78 74 72 61 52 65 67 20    int nExtraReg 
fb90: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fba0: 72 20 6f 66 20 65 78 74 72 61 20 72 65 67 69 73  r of extra regis
fbb0: 74 65 72 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65  ters to allocate
fbc0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 71   */.){.  int nEq
fbd0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 20   = pLevel->nEq; 
fbe0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
fbf0: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
fc00: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
fc10: 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20 2a  code */.  Vdbe *
fc20: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
fc30: 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
fc40: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
fc50: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
fc60: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
fc70: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
fc80: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
fc90: 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
fca0: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
fcb0: 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
fcc0: 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
fcd0: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
fce0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
fcf0: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
fd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
fd10: 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
fd20: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
fd30: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
fd40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
fd50: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
fd60: 69 6e 74 20 72 65 67 42 61 73 65 3b 20 20 20 20  int regBase;    
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd80: 20 42 61 73 65 20 72 65 67 69 73 74 65 72 20 2a   Base register *
fd90: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
fda0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f  ut how many memo
fdb0: 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c 6c  ry cells we will
fdc0: 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f 63   need then alloc
fdd0: 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20 57  ate them..  ** W
fde0: 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61 74  e always need at
fdf0: 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64 20   least one used 
fe00: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f 6f  to store the loo
fe10: 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20 2a  p terminator.  *
fe20: 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68 65  * value.  If the
fe30: 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61 74  re are IN operat
fe40: 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20 6f  ors we'll need o
fe50: 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20 6f  ne for each == o
fe60: 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74 72  r.  ** IN constr
fe70: 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65  aint..  */.  pLe
fe80: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
fe90: 73 65 2d 3e 6e 4d 65 6d 20 2b 20 31 3b 0a 20 20  se->nMem + 1;.  
fea0: 72 65 67 42 61 73 65 20 3d 20 70 50 61 72 73 65  regBase = pParse
feb0: 2d 3e 6e 4d 65 6d 20 2b 20 32 3b 0a 20 20 70 50  ->nMem + 2;.  pP
fec0: 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c  arse->nMem += pL
fed0: 65 76 65 6c 2d 3e 6e 45 71 20 2b 20 32 20 2b 20  evel->nEq + 2 + 
fee0: 6e 45 78 74 72 61 52 65 67 3b 0a 0a 20 20 2f 2a  nExtraReg;..  /*
fef0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71   Evaluate the eq
ff00: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
ff10: 74 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ts.  */.  assert
ff20: 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e  ( pIdx->nColumn>
ff30: 3d 6e 45 71 20 29 3b 0a 20 20 66 6f 72 28 6a 3d  =nEq );.  for(j=
ff40: 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a  0; j<nEq; j++){.
ff50: 20 20 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78      int k = pIdx
ff60: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20  ->aiColumn[j];. 
ff70: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
ff80: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b  erm(pWC, iCur, k
ff90: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 70 4c 65 76  , notReady, pLev
ffa0: 65 6c 2d 3e 66 6c 61 67 73 2c 20 70 49 64 78 29  el->flags, pIdx)
ffb0: 3b 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d  ;.    if( pTerm=
ffc0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ffd0: 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
ffe0: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
fff0: 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 63 6f  ED)==0 );.    co
10000 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70  deEqualityTerm(p
10010 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 70 4c  Parse, pTerm, pL
10020 65 76 65 6c 2c 20 72 65 67 42 61 73 65 2b 6a 29  evel, regBase+j)
10030 3b 0a 20 20 20 20 69 66 28 20 28 70 54 65 72 6d  ;.    if( (pTerm
10040 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57  ->eOperator & (W
10050 4f 5f 49 53 4e 55 4c 4c 7c 57 4f 5f 49 4e 29 29  O_ISNULL|WO_IN))
10060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
10070 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
10080 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67  , OP_IsNull, reg
10090 42 61 73 65 2b 6a 2c 20 70 4c 65 76 65 6c 2d 3e  Base+j, pLevel->
100a0 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  brk);.    }.  }.
100b0 20 20 72 65 74 75 72 6e 20 72 65 67 42 61 73 65    return regBase
100c0 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ;.}..#if defined
100d0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
100e0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
100f0 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  g variable holds
10100 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74   a text descript
10110 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61  ion of query pla
10120 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62  n generated.** b
10130 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  y the most recen
10140 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
10150 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20  3WhereBegin().  
10160 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65  Each call to Whe
10170 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77  reBegin.** overw
10180 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f  rites the previo
10190 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  us.  This inform
101a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
101b0 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a  r testing and.**
101c0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a   analysis only..
101d0 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f  */.char sqlite3_
101e0 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32  query_plan[BMS*2
101f0 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f  *40];  /* Text o
10200 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74  f the join */.st
10210 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20  atic int nQPlan 
10220 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
10230 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73    /* Next free s
10240 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c  low in _query_pl
10250 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20  an[] */..#endif 
10260 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a  /* SQLITE_TEST *
10270 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  /.../*.** Free a
10280 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63   WhereInfo struc
10290 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ture.*/.static v
102a0 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65  oid whereInfoFre
102b0 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49  e(WhereInfo *pWI
102c0 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e  nfo){.  if( pWIn
102d0 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  fo ){.    int i;
102e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
102f0 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20  pWInfo->nLevel; 
10300 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  i++){.      sqli
10310 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
10320 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e  pInfo = pWInfo->
10330 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[i].pIdxInfo;. 
10340 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29       if( pInfo )
10350 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
10360 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46  ( pInfo->needToF
10370 72 65 65 49 64 78 53 74 72 3d 3d 30 20 29 3b 0a  reeIdxStr==0 );.
10380 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
10390 66 72 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20  free(pInfo);.   
103a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
103b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 49 6e  qlite3_free(pWIn
103c0 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  fo);.  }.}.../*.
103d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
103e0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
103f0 20 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57   loop used for W
10400 48 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63  HERE clause proc
10410 65 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72  essing..** The r
10420 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61  eturn value is a
10430 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f   pointer to an o
10440 70 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20  paque structure 
10450 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
10460 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65   information nee
10470 64 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65  ded to terminate
10480 20 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65   the loop.  Late
10490 72 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  r, the calling r
104a0 6f 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64  outine.** should
104b0 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57   invoke sqlite3W
104c0 68 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74  hereEnd() with t
104d0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
104e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
104f0 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
10500 63 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45  complete the WHE
10510 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  RE clause proces
10520 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  sing..**.** If a
10530 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
10540 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
10550 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  urns NULL..**.**
10560 20 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20   The basic idea 
10570 69 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65  is to do a neste
10580 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70  d loop, one loop
10590 20 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20   for each table 
105a0 69 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63  in.** the FROM c
105b0 6c 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63  lause of a selec
105c0 74 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20  t.  (INSERT and 
105d0 55 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74  UPDATE statement
105e0 73 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d  s are the.** sam
105f0 65 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69  e as a SELECT wi
10600 74 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  th only a single
10610 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
10620 4f 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72  OM clause.)  For
10630 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  .** example, if 
10640 74 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a  the SQL is this:
10650 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c  .**.**       SEL
10660 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
10670 32 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b  2, t3 WHERE ...;
10680 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20  .**.** Then the 
10690 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69  code generated i
106a0 73 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c  s conceptually l
106b0 69 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ike the followin
106c0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f  g:.**.**      fo
106d0 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
106e0 20 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43   do       \    C
106f0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
10700 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20          foreach 
10710 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20  row2 in t2 do   
10720 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
10730 33 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a  3WhereBegin().**
10740 20 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63            foreac
10750 68 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20  h row3 in t3 do 
10760 20 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20    /.**          
10770 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20    ....**        
10780 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20    end           
10790 20 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43            \    C
107a0 6f 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  ode generated.**
107b0 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20          end     
107c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107d0 20 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65     |-- by sqlite
107e0 33 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20  3WhereEnd().**  
107f0 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
10800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10810 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  /.**.** Note tha
10820 74 20 74 68 65 20 6c 6f 6f 70 73 20 6d 69 67 68  t the loops migh
10830 74 20 6e 6f 74 20 62 65 20 6e 65 73 74 65 64 20  t not be nested 
10840 69 6e 20 74 68 65 20 6f 72 64 65 72 20 69 6e 20  in the order in 
10850 77 68 69 63 68 20 74 68 65 79 0a 2a 2a 20 61 70  which they.** ap
10860 70 65 61 72 20 69 6e 20 74 68 65 20 46 52 4f 4d  pear in the FROM
10870 20 63 6c 61 75 73 65 20 69 66 20 61 20 64 69 66   clause if a dif
10880 66 65 72 65 6e 74 20 6f 72 64 65 72 20 69 73 20  ferent order is 
10890 62 65 74 74 65 72 20 61 62 6c 65 20 74 6f 20 6d  better able to m
108a0 61 6b 65 0a 2a 2a 20 75 73 65 20 6f 66 20 69 6e  ake.** use of in
108b0 64 69 63 65 73 2e 20 20 4e 6f 74 65 20 61 6c 73  dices.  Note als
108c0 6f 20 74 68 61 74 20 77 68 65 6e 20 74 68 65 20  o that when the 
108d0 49 4e 20 6f 70 65 72 61 74 6f 72 20 61 70 70 65  IN operator appe
108e0 61 72 73 20 69 6e 0a 2a 2a 20 74 68 65 20 57 48  ars in.** the WH
108f0 45 52 45 20 63 6c 61 75 73 65 2c 20 69 74 20 6d  ERE clause, it m
10900 69 67 68 74 20 72 65 73 75 6c 74 20 69 6e 20 61  ight result in a
10910 64 64 69 74 69 6f 6e 61 6c 20 6e 65 73 74 65 64  dditional nested
10920 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a 2a 20 73 63   loops for.** sc
10930 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 61  anning through a
10940 6c 6c 20 76 61 6c 75 65 73 20 6f 6e 20 74 68 65  ll values on the
10950 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10960 20 6f 66 20 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a   of the IN..**.*
10970 2a 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65  * There are Btre
10980 65 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69  e cursors associ
10990 61 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74  ated with each t
109a0 61 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63  able.  t1 uses c
109b0 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20  ursor.** number 
109c0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
109d0 43 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73  Cursor.  t2 uses
109e0 20 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62   the cursor pTab
109f0 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73  List->a[1].iCurs
10a00 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f  or..** And so fo
10a10 72 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69  rth.  This routi
10a20 6e 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  ne generates cod
10a30 65 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20  e to open those 
10a40 56 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20  VDBE cursors.** 
10a50 61 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  and sqlite3Where
10a60 45 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20  End() generates 
10a70 74 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73  the code to clos
10a80 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68  e them..**.** Th
10a90 65 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69  e code that sqli
10aa0 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
10ab0 67 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73  generates leaves
10ac0 20 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d   the cursors nam
10ad0 65 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73  ed.** in pTabLis
10ae0 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68  t pointing at th
10af0 65 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20  eir appropriate 
10b00 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e  entries.  The [.
10b10 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20  ..] code.** can 
10b20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e  use OP_Column an
10b30 64 20 4f 50 5f 52 6f 77 69 64 20 6f 70 63 6f 64  d OP_Rowid opcod
10b40 65 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73  es on these curs
10b50 6f 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a  ors to extract.*
10b60 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
10b70 76 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f  various tables o
10b80 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a  f the loop..**.*
10b90 2a 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63  * If the WHERE c
10ba0 6c 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20  lause is empty, 
10bb0 74 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70  the foreach loop
10bc0 73 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e  s must each scan
10bd0 20 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65   their.** entire
10be0 20 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61   tables.  Thus a
10bf0 20 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20   three-way join 
10c00 69 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65  is an O(N^3) ope
10c10 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a  ration.  But if.
10c20 2a 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61  ** the tables ha
10c30 76 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74  ve indices and t
10c40 68 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69  here are terms i
10c50 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
10c60 73 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72  se that.** refer
10c70 20 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65   to those indice
10c80 73 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61  s, a complete ta
10c90 62 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20  ble scan can be 
10ca0 61 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a  avoided and the.
10cb0 2a 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e  ** code will run
10cc0 20 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d   much faster.  M
10cd0 6f 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20  ost of the work 
10ce0 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  of this routine 
10cf0 69 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74  is checking.** t
10d00 6f 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61  o see if there a
10d10 72 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20  re indices that 
10d20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
10d30 70 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70  peed up the loop
10d40 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66  ..**.** Terms of
10d50 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
10d60 65 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20  e are also used 
10d70 74 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72  to limit which r
10d80 6f 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  ows actually.** 
10d90 6d 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22  make it to the "
10da0 2e 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64  ..." in the midd
10db0 6c 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20  le of the loop. 
10dc0 20 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72   After each "for
10dd0 65 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20  each",.** terms 
10de0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
10df0 75 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c  use that use onl
10e00 79 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20  y terms in that 
10e10 6c 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a  loop and outer.*
10e20 2a 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c  * loops are eval
10e30 75 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c  uated and if fal
10e40 73 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  se a jump is mad
10e50 65 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62  e around all sub
10e60 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72  sequent.** inner
10e70 20 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e   loops (or aroun
10e80 64 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74  d the "..." if t
10e90 68 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77  he test occurs w
10ea0 69 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d  ithin the inner-
10eb0 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a  .** most loop).*
10ec0 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53  *.** OUTER JOINS
10ed0 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20  .**.** An outer 
10ee0 6a 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74  join of tables t
10ef0 31 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63  1 and t2 is conc
10f00 65 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73  eptally coded as
10f10 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
10f20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
10f30 69 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20  in t1 do.**     
10f40 20 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20   flag = 0.**    
10f50 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69    foreach row2 i
10f60 6e 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t2 do.**      
10f70 20 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20    start:.**     
10f80 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20       ....**     
10f90 20 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a       flag = 1.**
10fa0 20 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20        end.**    
10fb0 20 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65    if flag==0 the
10fc0 6e 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65  n.**        move
10fd0 20 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72   the row2 cursor
10fe0 20 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a   to a null row.*
10ff0 2a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74  *        goto st
11000 61 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a  art.**      fi.*
11010 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f  *    end.**.** O
11020 52 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50  RDER BY CLAUSE P
11030 52 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20  ROCESSING.**.** 
11040 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20  *ppOrderBy is a 
11050 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f  pointer to the O
11060 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
11070 66 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  f a SELECT state
11080 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72  ment,.** if ther
11090 65 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68  e is one.  If th
110a0 65 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20  ere is no ORDER 
110b0 42 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20  BY clause or if 
110c0 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
110d0 69 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61  is called from a
110e0 6e 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  n UPDATE or DELE
110f0 54 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  TE statement, th
11100 65 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20  en ppOrderBy is 
11110 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  NULL..**.** If a
11120 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75  n index can be u
11130 73 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20  sed so that the 
11140 6e 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f  natural output o
11150 72 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rder of the tabl
11160 65 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72  e.** scan is cor
11170 72 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44  rect for the ORD
11180 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68  ER BY clause, th
11190 65 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73  en that index is
111a0 20 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70   used and.** *pp
111b0 4f 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74  OrderBy is set t
111c0 6f 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73  o NULL.  This is
111d0 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
111e0 20 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61   that prevents a
111f0 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79  n.** unnecessary
11200 20 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73   sort of the res
11210 75 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e  ult set if an in
11220 64 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20  dex appropriate 
11230 66 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  for the.** ORDER
11240 20 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61   BY clause alrea
11250 64 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  dy exists..**.**
11260 20 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c   If the where cl
11270 61 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f  ause loops canno
11280 74 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f  t be arranged to
11290 20 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72   provide the cor
112a0 72 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f  rect.** output o
112b0 72 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a  rder, then the *
112c0 70 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63  ppOrderBy is unc
112d0 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65  hanged..*/.Where
112e0 49 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65  Info *sqlite3Whe
112f0 72 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65  reBegin(.  Parse
11300 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
11310 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
11320 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c  ontext */.  SrcL
11330 69 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20  ist *pTabList,  
11340 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
11350 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20  ll tables to be 
11360 73 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70  scanned */.  Exp
11370 72 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20  r *pWhere,      
11380 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20     /* The WHERE 
11390 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72  clause */.  Expr
113a0 4c 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79  List **ppOrderBy
113b0 2c 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59  , /* An ORDER BY
113c0 20 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c   clause, or NULL
113d0 20 2a 2f 0a 20 20 75 38 20 6f 62 66 6c 61 67 20   */.  u8 obflag 
113e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
113f0 6e 65 20 6f 66 20 4f 52 44 45 52 42 59 5f 4d 49  ne of ORDERBY_MI
11400 4e 2c 20 4f 52 44 45 52 42 59 5f 4d 41 58 20 6f  N, ORDERBY_MAX o
11410 72 20 4f 52 44 45 52 42 59 5f 4e 4f 52 4d 41 4c  r ORDERBY_NORMAL
11420 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
11450 74 65 72 20 2a 2f 0a 20 20 57 68 65 72 65 49 6e  ter */.  WhereIn
11460 66 6f 20 2a 70 57 49 6e 66 6f 3b 20 20 20 20 20  fo *pWInfo;     
11470 20 20 20 20 2f 2a 20 57 69 6c 6c 20 62 65 63 6f      /* Will beco
11480 6d 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  me the return va
11490 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
114a0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 20 2a  tion */.  Vdbe *
114b0 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
114c0 65 3b 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74  e;   /* The virt
114d0 75 61 6c 20 64 61 74 61 62 61 73 65 20 65 6e 67  ual database eng
114e0 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ine */.  int brk
114f0 2c 20 63 6f 6e 74 20 3d 20 30 3b 20 20 20 20 20  , cont = 0;     
11500 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 65 73      /* Addresses
11510 20 75 73 65 64 20 64 75 72 69 6e 67 20 63 6f 64   used during cod
11520 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a  e generation */.
11530 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61    Bitmask notRea
11540 64 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dy;          /* 
11550 43 75 72 73 6f 72 73 20 74 68 61 74 20 61 72 65  Cursors that are
11560 20 6e 6f 74 20 79 65 74 20 70 6f 73 69 74 69 6f   not yet positio
11570 6e 65 64 20 2a 2f 0a 20 20 57 68 65 72 65 54 65  ned */.  WhereTe
11580 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20 20  rm *pTerm;      
11590 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
115a0 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52  term in the WHER
115b0 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  E clause */.  Ex
115c0 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53 65  prMaskSet maskSe
115d0 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t;       /* The 
115e0 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
115f0 73 65 74 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  set */.  WhereCl
11600 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20 20  ause wc;        
11610 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45      /* The WHERE
11620 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69 64   clause is divid
11630 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74 65  ed into these te
11640 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
11650 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
11660 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73 69  abItem;  /* A si
11670 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d 20  ngle entry from 
11680 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57 68  pTabList */.  Wh
11690 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
116a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
116b0 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20   A single level 
116c0 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c 69  in the pWInfo li
116d0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 46 72 6f  st */.  int iFro
116e0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
116f0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
11700 20 75 6e 75 73 65 64 20 46 52 4f 4d 20 63 6c 61   unused FROM cla
11710 75 73 65 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  use element */. 
11720 20 69 6e 74 20 61 6e 64 46 6c 61 67 73 3b 20 20   int andFlags;  
11730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
11740 4e 44 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f  ND-ed combinatio
11750 6e 20 6f 66 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e  n of all wc.a[].
11760 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
11770 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
11780 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
11790 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
117a0 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
117b0 65 72 42 79 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  erBy = 0;..  /* 
117c0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 61  The number of ta
117d0 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f 4d  bles in the FROM
117e0 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69 74   clause is limit
117f0 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65 72  ed by the number
11800 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69 6e   of.  ** bits in
11810 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a 2f   a Bitmask .  */
11820 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74 2d  .  if( pTabList-
11830 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a 20 20 20  >nSrc>BMS ){.   
11840 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
11850 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
11860 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
11870 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b 0a 20 20   join", BMS);.  
11880 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11890 0a 20 20 69 66 28 20 70 70 4f 72 64 65 72 42 79  .  if( ppOrderBy
118a0 20 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79   ){.    pOrderBy
118b0 20 3d 20 2a 70 70 4f 72 64 65 72 42 79 3b 0a 20   = *ppOrderBy;. 
118c0 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74   }..  /* Split t
118d0 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
118e0 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
118f0 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
11900 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
11910 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
11920 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
11930 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
11940 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26  .  initMaskSet(&
11950 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
11960 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c  eClauseInit(&wc,
11970 20 70 50 61 72 73 65 2c 20 26 6d 61 73 6b 53 65   pParse, &maskSe
11980 74 29 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74  t);.  whereSplit
11990 28 26 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b  (&wc, pWhere, TK
119a0 5f 41 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a  _AND);.    .  /*
119b0 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e   Allocate and in
119c0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65  itialize the Whe
119d0 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
119e0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d   that will becom
119f0 65 20 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72  e the.  ** retur
11a00 6e 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20  n value..  */.  
11a10 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
11a20 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73 71 6c 69  .  pWInfo = sqli
11a30 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
11a40 64 62 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20  db,  .          
11a50 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
11a60 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b 20  of(WhereInfo) + 
11a70 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a 73  pTabList->nSrc*s
11a80 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65 6c  izeof(WhereLevel
11a90 29 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  ));.  if( db->ma
11aa0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
11ab0 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69    goto whereBegi
11ac0 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57  nNoMem;.  }.  pW
11ad0 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  Info->nLevel = p
11ae0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20  TabList->nSrc;. 
11af0 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20   pWInfo->pParse 
11b00 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e  = pParse;.  pWIn
11b10 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70  fo->pTabList = p
11b20 54 61 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66  TabList;.  pWInf
11b30 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69  o->iBreak = sqli
11b40 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
11b50 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69  (v);..  /* Speci
11b60 61 6c 20 63 61 73 65 3a 20 61 20 57 48 45 52 45  al case: a WHERE
11b70 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
11b80 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75  constant.  Evalu
11b90 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70  ate the.  ** exp
11ba0 72 65 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68  ression and eith
11bb0 65 72 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c  er jump over all
11bc0 20 6f 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20   of the code or 
11bd0 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a  fall thru..  */.
11be0 20 20 69 66 28 20 70 57 68 65 72 65 20 26 26 20    if( pWhere && 
11bf0 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d  (pTabList->nSrc=
11c00 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70  =0 || sqlite3Exp
11c10 72 49 73 43 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f  rIsConstantNotJo
11c20 69 6e 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20  in(pWhere)) ){. 
11c30 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
11c40 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57  False(pParse, pW
11c50 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42  here, pWInfo->iB
11c60 72 65 61 6b 2c 20 53 51 4c 49 54 45 5f 4a 55 4d  reak, SQLITE_JUM
11c70 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 70 57  PIFNULL);.    pW
11c80 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  here = 0;.  }.. 
11c90 20 2f 2a 20 41 73 73 69 67 6e 20 61 20 62 69 74   /* Assign a bit
11ca0 20 66 72 6f 6d 20 74 68 65 20 62 69 74 6d 61 73   from the bitmas
11cb0 6b 20 74 6f 20 65 76 65 72 79 20 74 65 72 6d 20  k to every term 
11cc0 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
11cd0 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  se..  **.  ** Wh
11ce0 65 6e 20 61 73 73 69 67 6e 69 6e 67 20 62 69 74  en assigning bit
11cf0 6d 61 73 6b 20 76 61 6c 75 65 73 20 74 6f 20 46  mask values to F
11d00 52 4f 4d 20 63 6c 61 75 73 65 20 63 75 72 73 6f  ROM clause curso
11d10 72 73 2c 20 69 74 20 6d 75 73 74 20 62 65 0a 20  rs, it must be. 
11d20 20 2a 2a 20 74 68 65 20 63 61 73 65 20 74 68 61   ** the case tha
11d30 74 20 69 66 20 58 20 69 73 20 74 68 65 20 62 69  t if X is the bi
11d40 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20 4e 2d  tmask for the N-
11d50 74 68 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  th FROM clause t
11d60 65 72 6d 20 74 68 65 6e 0a 20 20 2a 2a 20 74 68  erm then.  ** th
11d70 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  e bitmask for al
11d80 6c 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65  l FROM clause te
11d90 72 6d 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  rms to the left 
11da0 6f 66 20 74 68 65 20 4e 2d 74 68 20 74 65 72 6d  of the N-th term
11db0 0a 20 20 2a 2a 20 69 73 20 28 58 2d 31 29 2e 20  .  ** is (X-1). 
11dc0 20 20 41 6e 20 65 78 70 72 65 73 73 69 6f 6e 20    An expression 
11dd0 66 72 6f 6d 20 74 68 65 20 4f 4e 20 63 6c 61 75  from the ON clau
11de0 73 65 20 6f 66 20 61 20 4c 45 46 54 20 4a 4f 49  se of a LEFT JOI
11df0 4e 20 63 61 6e 20 75 73 65 0a 20 20 2a 2a 20 69  N can use.  ** i
11e00 74 73 20 45 78 70 72 2e 69 52 69 67 68 74 4a 6f  ts Expr.iRightJo
11e10 69 6e 54 61 62 6c 65 20 76 61 6c 75 65 20 74 6f  inTable value to
11e20 20 66 69 6e 64 20 74 68 65 20 62 69 74 6d 61 73   find the bitmas
11e30 6b 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  k of the right t
11e40 61 62 6c 65 0a 20 20 2a 2a 20 6f 66 20 74 68 65  able.  ** of the
11e50 20 6a 6f 69 6e 2e 20 20 53 75 62 74 72 61 63 74   join.  Subtract
11e60 69 6e 67 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ing one from the
11e70 20 72 69 67 68 74 20 74 61 62 6c 65 20 62 69 74   right table bit
11e80 6d 61 73 6b 20 67 69 76 65 73 20 61 0a 20 20 2a  mask gives a.  *
11e90 2a 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 61 6c  * bitmask for al
11ea0 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  l tables to the 
11eb0 6c 65 66 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  left of the join
11ec0 2e 20 20 4b 6e 6f 77 69 6e 67 20 74 68 65 20 62  .  Knowing the b
11ed0 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 66 6f 72 20  itmask.  ** for 
11ee0 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f 20 74 68  all tables to th
11ef0 65 20 6c 65 66 74 20 6f 66 20 61 20 6c 65 66 74  e left of a left
11f00 20 6a 6f 69 6e 20 69 73 20 69 6d 70 6f 72 74 61   join is importa
11f10 6e 74 2e 20 20 54 69 63 6b 65 74 20 23 33 30 31  nt.  Ticket #301
11f20 35 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  5..  */.  for(i=
11f30 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
11f40 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
11f50 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53  reateMask(&maskS
11f60 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
11f70 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
11f80 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11f90 20 20 7b 0a 20 20 20 20 42 69 74 6d 61 73 6b 20    {.    Bitmask 
11fa0 74 6f 54 68 65 4c 65 66 74 20 3d 20 30 3b 0a 20  toTheLeft = 0;. 
11fb0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
11fc0 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
11fd0 2b 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73  +){.      Bitmas
11fe0 6b 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d  k m = getMask(&m
11ff0 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
12000 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b  ->a[i].iCursor);
12010 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
12020 6d 2d 31 29 3d 3d 74 6f 54 68 65 4c 65 66 74 20  m-1)==toTheLeft 
12030 29 3b 0a 20 20 20 20 20 20 74 6f 54 68 65 4c 65  );.      toTheLe
12040 66 74 20 7c 3d 20 6d 3b 0a 20 20 20 20 7d 0a 20  ft |= m;.    }. 
12050 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
12060 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
12070 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
12080 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
12090 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
120a0 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
120b0 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
120c0 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
120d0 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
120e0 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
120f0 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
12100 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
12110 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
12120 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
12130 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
12140 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
12150 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
12160 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
12170 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
12180 2f 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41  /.  exprAnalyzeA
12190 6c 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 77 63  ll(pTabList, &wc
121a0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
121b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
121c0 20 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e   goto whereBegin
121d0 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NoMem;.  }..  /*
121e0 20 43 68 6f 73 65 20 74 68 65 20 62 65 73 74 20   Chose the best 
121f0 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72  index to use for
12200 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74   each table in t
12210 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a  he FROM clause..
12220 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
12230 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65  oop fills in the
12240 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
12250 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70  s:.  **.  **   p
12260 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20  WInfo->a[].pIdx 
12270 20 20 20 20 20 54 68 65 20 69 6e 64 65 78 20 74       The index t
12280 6f 20 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c  o use for this l
12290 65 76 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70  evel of the loop
122a0 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  ..  **   pWInfo-
122b0 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57  >a[].flags     W
122c0 48 45 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61  HERE_xxx flags a
122d0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
122e0 49 64 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66  Idx.  **   pWInf
122f0 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20  o->a[].nEq      
12300 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d   The number of =
12310 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61  = and IN constra
12320 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e  ints.  **   pWIn
12330 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20  fo->a[].iFrom   
12340 20 20 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74    When term of t
12350 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
12360 73 20 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20  s being coded.  
12370 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d  **   pWInfo->a[]
12380 2e 69 54 61 62 43 75 72 20 20 20 54 68 65 20 56  .iTabCur   The V
12390 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
123a0 68 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  he database tabl
123b0 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  e.  **   pWInfo-
123c0 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54  >a[].iIdxCur   T
123d0 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66  he VDBE cursor f
123e0 6f 72 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  or the index.  *
123f0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70  *.  ** This loop
12400 20 61 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75   also figures ou
12410 74 20 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72  t the nesting or
12420 64 65 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e  der of tables in
12430 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63   the FROM.  ** c
12440 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f  lause..  */.  no
12450 74 52 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61  tReady = ~(Bitma
12460 73 6b 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d  sk)0;.  pTabItem
12470 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a   = pTabList->a;.
12480 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66    pLevel = pWInf
12490 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73  o->a;.  andFlags
124a0 20 3d 20 7e 30 3b 0a 20 20 57 48 45 52 45 54 52   = ~0;.  WHERETR
124b0 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69  ACE(("*** Optimi
124c0 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22  zer Start ***\n"
124d0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f  ));.  for(i=iFro
124e0 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e  m=0, pLevel=pWIn
124f0 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73  fo->a; i<pTabLis
12500 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c  t->nSrc; i++, pL
12510 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64  evel++){.    Ind
12520 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
12530 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
12540 78 20 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65  x for FROM table
12550 20 61 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a   at pTabItem */.
12560 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20      int flags;  
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 2f 2a 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69  /* Flags asssoci
12590 61 74 65 64 20 77 69 74 68 20 70 49 64 78 20 2a  ated with pIdx *
125a0 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20  /.    int nEq;  
125b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d    /* Number of =
125d0 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69  = or IN constrai
125e0 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  nts */.    doubl
125f0 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
12600 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
12610 73 74 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20  st for pIdx */. 
12620 20 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20     int j;       
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12640 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
12650 65 72 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a  er FROM tables *
12660 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65  /.    Index *pBe
12670 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
12680 20 20 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e    /* The best in
12690 64 65 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20  dex seen so far 
126a0 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46  */.    int bestF
126b0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
126c0 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
126d0 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
126e0 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73  t */.    int bes
126f0 74 4e 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20  tNEq = 0;       
12700 20 20 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f       /* nEq asso
12710 63 69 61 74 65 64 20 77 69 74 68 20 70 42 65 73  ciated with pBes
12720 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  t */.    double 
12730 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20  lowestCost;     
12740 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20       /* Cost of 
12750 74 68 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20  the pBest */.   
12760 20 69 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20   int bestJ = 0; 
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12780 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a  The value of j *
12790 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b  /.    Bitmask m;
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c    /* Bitmask val
127c0 75 65 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74  ue for j or best
127d0 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63  J */.    int onc
127e0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
127f0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65       /* True whe
12800 6e 20 66 69 72 73 74 20 74 61 62 6c 65 20 69 73  n first table is
12810 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c   seen */.    sql
12820 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
12830 2a 70 49 6e 64 65 78 3b 20 2f 2a 20 43 75 72 72  *pIndex; /* Curr
12840 65 6e 74 20 76 69 72 74 75 61 6c 20 69 6e 64 65  ent virtual inde
12850 78 20 2a 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74  x */..    lowest
12860 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49  Cost = SQLITE_BI
12870 47 5f 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a  G_DBL;.    for(j
12880 3d 69 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d  =iFrom, pTabItem
12890 3d 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d  =&pTabList->a[j]
128a0 3b 20 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ; j<pTabList->nS
128b0 72 63 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65  rc; j++, pTabIte
128c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  m++){.      int 
128d0 64 6f 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f  doNotReorder;  /
128e0 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 74  * True if this t
128f0 61 62 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20  able should not 
12900 62 65 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a  be reordered */.
12910 0a 20 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72  .      doNotReor
12920 64 65 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d  der =  (pTabItem
12930 2d 3e 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54  ->jointype & (JT
12940 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29  _LEFT|JT_CROSS))
12950 21 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  !=0;.      if( o
12960 6e 63 65 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72  nce && doNotReor
12970 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  der ) break;.   
12980 20 20 20 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26     m = getMask(&
12990 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 49 74 65  maskSet, pTabIte
129a0 6d 2d 3e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  m->iCursor);.   
129b0 20 20 20 69 66 28 20 28 6d 20 26 20 6e 6f 74 52     if( (m & notR
129c0 65 61 64 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  eady)==0 ){.    
129d0 20 20 20 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d      if( j==iFrom
129e0 20 29 20 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20   ) iFrom++;.    
129f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12a00 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
12a10 72 74 28 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  rt( pTabItem->pT
12a20 61 62 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  ab );.#ifndef SQ
12a30 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
12a40 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 69 66 28  LTABLE.      if(
12a50 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 49   IsVirtual(pTabI
12a60 74 65 6d 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20  tem->pTab) ){.  
12a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
12a80 64 65 78 5f 69 6e 66 6f 20 2a 2a 70 70 49 64 78  dex_info **ppIdx
12a90 49 6e 66 6f 20 3d 20 26 70 57 49 6e 66 6f 2d 3e  Info = &pWInfo->
12aa0 61 5b 6a 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20  a[j].pIdxInfo;. 
12ab0 20 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65         cost = be
12ac0 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28 70  stVirtualIndex(p
12ad0 50 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62  Parse, &wc, pTab
12ae0 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a  Item, notReady,.
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b10 70 70 4f 72 64 65 72 42 79 20 3f 20 2a 70 70 4f  ppOrderBy ? *ppO
12b20 72 64 65 72 42 79 20 3a 20 30 2c 20 69 3d 3d 30  rderBy : 0, i==0
12b30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
12b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b50 20 20 70 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20    ppIdxInfo);.  
12b60 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48        flags = WH
12b70 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  ERE_VIRTUALTABLE
12b80 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 64 65 78  ;.        pIndex
12b90 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
12ba0 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 64 65         if( pInde
12bb0 78 20 26 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64  x && pIndex->ord
12bc0 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a  erByConsumed ){.
12bd0 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
12be0 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54  = WHERE_VIRTUALT
12bf0 41 42 4c 45 20 7c 20 57 48 45 52 45 5f 4f 52 44  ABLE | WHERE_ORD
12c00 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERBY;.        }.
12c10 20 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30          pIdx = 0
12c20 3b 0a 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20  ;.        nEq = 
12c30 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  0;.        if( (
12c40 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 2f 32  SQLITE_BIG_DBL/2
12c50 2e 30 29 3c 63 6f 73 74 20 29 7b 0a 20 20 20 20  .0)<cost ){.    
12c60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73        /* The cos
12c70 74 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  t is not allowed
12c80 20 74 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68   to be larger th
12c90 61 6e 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42  an SQLITE_BIG_DB
12ca0 4c 20 28 74 68 65 0a 20 20 20 20 20 20 20 20 20  L (the.         
12cb0 20 2a 2a 20 69 6e 69 74 61 6c 20 76 61 6c 75 65   ** inital value
12cc0 20 6f 66 20 6c 6f 77 65 73 74 43 6f 73 74 20 69   of lowestCost i
12cd0 6e 20 74 68 69 73 20 6c 6f 6f 70 2e 20 49 66 20  n this loop. If 
12ce0 69 74 20 69 73 2c 20 74 68 65 6e 0a 20 20 20 20  it is, then.    
12cf0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 28 63 6f        ** the (co
12d00 73 74 3c 6c 6f 77 65 73 74 43 6f 73 74 29 20 74  st<lowestCost) t
12d10 65 73 74 20 62 65 6c 6f 77 20 77 69 6c 6c 20 6e  est below will n
12d20 65 76 65 72 20 62 65 20 74 72 75 65 20 61 6e 64  ever be true and
12d30 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 4c  .          ** pL
12d40 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 6e  evel->pBestIdx n
12d50 65 76 65 72 20 73 65 74 2e 0a 20 20 20 20 20 20  ever set..      
12d60 20 20 20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20      */ .        
12d70 20 20 63 6f 73 74 20 3d 20 28 53 51 4c 49 54 45    cost = (SQLITE
12d80 5f 42 49 47 5f 44 42 4c 2f 32 2e 30 29 3b 0a 20  _BIG_DBL/2.0);. 
12d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12da0 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20  else .#endif.   
12db0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 73     {.        cos
12dc0 74 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50  t = bestIndex(pP
12dd0 61 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49  arse, &wc, pTabI
12de0 74 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20  tem, notReady,. 
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e00 20 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26          (i==0 &&
12e10 20 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70   ppOrderBy) ? *p
12e20 70 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20  pOrderBy : 0,.  
12e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e40 20 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66         &pIdx, &f
12e50 6c 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20  lags, &nEq);.   
12e60 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b       pIndex = 0;
12e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12e80 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  f( cost<lowestCo
12e90 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e  st ){.        on
12ea0 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
12eb0 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
12ec0 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  t;.        pBest
12ed0 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
12ee0 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
12ef0 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  gs;.        best
12f00 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  NEq = nEq;.     
12f10 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
12f20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42        pLevel->pB
12f30 65 73 74 49 64 78 20 3d 20 70 49 6e 64 65 78 3b  estIdx = pIndex;
12f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
12f50 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  f( doNotReorder 
12f60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
12f70 20 20 20 57 48 45 52 45 54 52 41 43 45 28 28 22     WHERETRACE(("
12f80 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63 68  *** Optimizer ch
12f90 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66 6f  oose table %d fo
12fa0 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65  r loop %d\n", be
12fb0 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20 20  stJ,.           
12fc0 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61  pLevel-pWInfo->a
12fd0 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65 73  ));.    if( (bes
12fe0 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 4f  tFlags & WHERE_O
12ff0 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20 20  RDERBY)!=0 ){.  
13000 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d      *ppOrderBy =
13010 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e   0;.    }.    an
13020 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46 6c  dFlags &= bestFl
13030 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
13040 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c 61  >flags = bestFla
13050 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  gs;.    pLevel->
13060 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20 20  pIdx = pBest;.  
13070 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20    pLevel->nEq = 
13080 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65  bestNEq;.    pLe
13090 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30  vel->aInLoop = 0
130a0 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
130b0 6e 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  n = 0;.    if( p
130c0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 70 4c  Best ){.      pL
130d0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
130e0 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
130f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13100 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
13110 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
13120 20 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65   notReady &= ~ge
13130 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20  tMask(&maskSet, 
13140 70 54 61 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74  pTabList->a[best
13150 4a 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 20  J].iCursor);.   
13160 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d   pLevel->iFrom =
13170 20 62 65 73 74 4a 3b 0a 20 20 7d 0a 20 20 57 48   bestJ;.  }.  WH
13180 45 52 45 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f  ERETRACE(("*** O
13190 70 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65  ptimizer Finishe
131a0 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f  d ***\n"));..  /
131b0 2a 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71  * If the total q
131c0 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74  uery only select
131d0 73 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20  s a single row, 
131e0 74 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42  then the ORDER B
131f0 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73  Y.  ** clause is
13200 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a   irrelevant..  *
13210 2f 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67  /.  if( (andFlag
13220 73 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45  s & WHERE_UNIQUE
13230 29 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  )!=0 && ppOrderB
13240 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65  y ){.    *ppOrde
13250 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  rBy = 0;.  }..  
13260 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
13270 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
13280 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
13290 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
132a0 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
132b0 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
132c0 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
132d0 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
132e0 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
132f0 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
13300 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
13310 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c   for(i=0, pLevel
13320 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54  =pWInfo->a; i<pT
13330 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
13340 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20  +, pLevel++){.  
13350 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
13360 20 20 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f     /* Table to o
13370 70 65 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78  pen */.    Index
13380 20 2a 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49   *pIx;      /* I
13390 6e 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63  ndex used to acc
133a0 65 73 73 20 70 54 61 62 20 28 69 66 20 61 6e 79  ess pTab (if any
133b0 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62  ) */.    int iDb
133c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64  ;         /* Ind
133d0 65 78 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  ex of database c
133e0 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f  ontaining table/
133f0 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74  index */.    int
13400 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65   iIdxCur = pLeve
13410 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66  l->iIdxCur;..#if
13420 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13430 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28  _EXPLAIN.    if(
13440 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
13450 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==2 ){.      cha
13460 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73  r *zMsg;.      s
13470 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
13480 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61  em *pItem = &pTa
13490 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
134a0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a  >iFrom];.      z
134b0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
134c0 69 6e 74 66 28 64 62 2c 20 22 54 41 42 4c 45 20  intf(db, "TABLE 
134d0 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  %s", pItem->zNam
134e0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
134f0 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
13500 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
13510 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13520 20 22 25 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73   "%z AS %s", zMs
13530 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  g, pItem->zAlias
13540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13550 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76   if( (pIx = pLev
13560 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a  el->pIdx)!=0 ){.
13570 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
13580 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
13590 2c 20 22 25 7a 20 57 49 54 48 20 49 4e 44 45 58  , "%z WITH INDEX
135a0 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d   %s", zMsg, pIx-
135b0 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  >zName);.      }
135c0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
135d0 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45 5f  >flags & (WHERE_
135e0 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f 52  ROWID_EQ|WHERE_R
135f0 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20  OWID_RANGE) ){. 
13600 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
13610 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
13620 20 22 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41   "%z USING PRIMA
13630 52 59 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a  RY KEY", zMsg);.
13640 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
13650 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
13660 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65  UALTABLE.      e
13670 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
13680 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20  pBestIdx ){.    
13690 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65      sqlite3_inde
136a0 78 5f 69 6e 66 6f 20 2a 70 42 65 73 74 49 64 78  x_info *pBestIdx
136b0 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73 74   = pLevel->pBest
136c0 49 64 78 3b 0a 20 20 20 20 20 20 20 20 7a 4d 73  Idx;.        zMs
136d0 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
136e0 74 66 28 64 62 2c 20 22 25 7a 20 56 49 52 54 55  tf(db, "%z VIRTU
136f0 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20 25  AL TABLE INDEX %
13700 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20 20  d:%s", zMsg,.   
13710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13720 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 4e 75   pBestIdx->idxNu
13730 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78  m, pBestIdx->idx
13740 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Str);.      }.#e
13750 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70  ndif.      if( p
13760 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
13770 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a  HERE_ORDERBY ){.
13780 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
13790 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
137a0 2c 20 22 25 7a 20 4f 52 44 45 52 20 42 59 22 2c  , "%z ORDER BY",
137b0 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a   zMsg);.      }.
137c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
137d0 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78  eAddOp4(v, OP_Ex
137e0 70 6c 61 69 6e 2c 20 69 2c 20 70 4c 65 76 65 6c  plain, i, pLevel
137f0 2d 3e 69 46 72 6f 6d 2c 20 30 2c 20 7a 4d 73 67  ->iFrom, 0, zMsg
13800 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P4_DYNAMIC);. 
13810 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
13820 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
13830 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49 74  IN */.    pTabIt
13840 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
13850 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
13860 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61  ;.    pTab = pTa
13870 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
13880 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63   iDb = sqlite3Sc
13890 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61 72  hemaToIndex(pPar
138a0 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70 53  se->db, pTab->pS
138b0 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20  chema);.    if( 
138c0 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c  pTab->isEphem ||
138d0 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
138e0 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64   continue;.#ifnd
138f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
13900 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
13910 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 42 65 73  if( pLevel->pBes
13920 74 49 64 78 20 29 7b 0a 20 20 20 20 20 20 69 6e  tIdx ){.      in
13930 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
13940 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
13950 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13960 4f 70 34 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c  Op4(v, OP_VOpen,
13970 20 69 43 75 72 2c 20 30 2c 20 30 2c 0a 20 20 20   iCur, 0, 0,.   
13980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13990 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
139a0 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50  *)pTab->pVtab, P
139b0 34 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  4_VTAB);.    }el
139c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
139d0 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
139e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
139f0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
13a00 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
13a10 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
13a20 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
13a30 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
13a40 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  d);.      if( pT
13a50 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66  ab->nCol<(sizeof
13a60 28 42 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a  (Bitmask)*8) ){.
13a70 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
13a80 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
13a90 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
13aa0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
13ab0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
13ac0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
13ad0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13ae0 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33  ngeP2(v, sqlite3
13af0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
13b00 76 29 2d 32 2c 20 6e 29 3b 0a 20 20 20 20 20 20  v)-2, n);.      
13b10 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
13b20 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
13b30 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13b40 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
13b50 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
13b60 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
13b70 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
13b80 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
13b90 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
13ba0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
13bb0 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65    if( (pIx = pLe
13bc0 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b  vel->pIdx)!=0 ){
13bd0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
13be0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
13bf0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
13c00 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61  e, pIx);.      a
13c10 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
13c20 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
13c30 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
13c40 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
13c50 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
13c60 73 2c 20 30 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75  s, 0, pIx->nColu
13c70 6d 6e 2b 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  mn+1);.      sql
13c80 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 76  ite3VdbeAddOp4(v
13c90 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
13ca0 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
13cb0 6d 2c 20 69 44 62 2c 0a 20 20 20 20 20 20 20 20  m, iDb,.        
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cd0 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 34 5f  (char*)pKey, P4_
13ce0 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29  KEYINFO_HANDOFF)
13cf0 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
13d00 65 6e 74 28 28 76 2c 20 22 25 73 22 2c 20 70 49  ent((v, "%s", pI
13d10 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20  x->zName));.    
13d20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
13d30 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
13d40 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
13d50 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
13d60 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
13d70 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
13d80 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
13d90 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
13da0 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
13db0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
13dc0 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
13dd0 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
13de0 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
13df0 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
13e00 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
13e10 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
13e20 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
13e30 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
13e40 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
13e50 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
13e60 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
13e70 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
13e80 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
13e90 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20  m->iCursor;  /* 
13ea0 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
13eb0 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
13ec0 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
13ed0 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
13ee0 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
13ef0 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
13f00 20 6e 78 74 3b 20 20 20 20 20 20 20 20 20 20 20   nxt;           
13f10 2f 2a 20 57 68 65 72 65 20 74 6f 20 6a 75 6d 70  /* Where to jump
13f20 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 77 69 74   to continue wit
13f30 68 20 74 68 65 20 6e 65 78 74 20 49 4e 20 63 61  h the next IN ca
13f40 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  se */.    int iI
13f50 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20  dxCur;       /* 
13f60 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
13f70 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f  for the index */
13f80 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62  .    int omitTab
13f90 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20  le;     /* True 
13fa0 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69 6e  if we use the in
13fb0 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20  dex only */.    
13fc0 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20 20  int bRev;       
13fd0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 65     /* True if we
13fe0 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69 6e   need to scan in
13ff0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a   reverse order *
14000 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  /..    pTabItem 
14010 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
14020 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
14030 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49 74     iCur = pTabIt
14040 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
14050 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e   pIdx = pLevel->
14060 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75  pIdx;.    iIdxCu
14070 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
14080 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d 20  Cur;.    bRev = 
14090 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
140a0 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29 21   WHERE_REVERSE)!
140b0 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c  =0;.    omitTabl
140c0 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61  e = (pLevel->fla
140d0 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f  gs & WHERE_IDX_O
140e0 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a  NLY)!=0;..    /*
140f0 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20 66   Create labels f
14100 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20 61  or the "break" a
14110 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69 6e  nd "continue" in
14120 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20 2a  structions.    *
14130 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  * for the curren
14140 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74 6f  t loop.  Jump to
14150 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f 75   brk to break ou
14160 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20 20  t of a loop..   
14170 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e 74   ** Jump to cont
14180 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74 65   to go immediate
14190 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20 69  ly to the next i
141a0 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a  teration of the.
141b0 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20      ** loop..   
141c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 68 65 6e 20   **.    ** When 
141d0 74 68 65 72 65 20 69 73 20 61 6e 20 49 4e 20 6f  there is an IN o
141e0 70 65 72 61 74 6f 72 2c 20 77 65 20 61 6c 73 6f  perator, we also
141f0 20 68 61 76 65 20 61 20 22 6e 78 74 22 20 6c 61   have a "nxt" la
14200 62 65 6c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  bel that.    ** 
14210 6d 65 61 6e 73 20 74 6f 20 63 6f 6e 74 69 6e 75  means to continu
14220 65 20 77 69 74 68 20 74 68 65 20 6e 65 78 74 20  e with the next 
14230 49 4e 20 76 61 6c 75 65 20 63 6f 6d 62 69 6e 61  IN value combina
14240 74 69 6f 6e 2e 20 20 57 68 65 6e 0a 20 20 20 20  tion.  When.    
14250 2a 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  ** there are no 
14260 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 69 6e 20  IN operators in 
14270 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c  the constraints,
14280 20 74 68 65 20 22 6e 78 74 22 20 6c 61 62 65 6c   the "nxt" label
14290 0a 20 20 20 20 2a 2a 20 69 73 20 74 68 65 20 73  .    ** is the s
142a0 61 6d 65 20 61 73 20 22 62 72 6b 22 2e 0a 20 20  ame as "brk"..  
142b0 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70    */.    brk = p
142c0 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 70 4c 65  Level->brk = pLe
142d0 76 65 6c 2d 3e 6e 78 74 20 3d 20 73 71 6c 69 74  vel->nxt = sqlit
142e0 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
142f0 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70  v);.    cont = p
14300 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71  Level->cont = sq
14310 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
14320 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  el(v);..    /* I
14330 66 20 74 68 69 73 20 69 73 20 74 68 65 20 72 69  f this is the ri
14340 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61 20 4c  ght table of a L
14350 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20  EFT OUTER JOIN, 
14360 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20 20 20  allocate and.   
14370 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 20 61   ** initialize a
14380 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61   memory cell tha
14390 74 20 72 65 63 6f 72 64 73 20 69 66 20 74 68 69  t records if thi
143a0 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65 73 20  s table matches 
143b0 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f  any.    ** row o
143c0 66 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65  f the left table
143d0 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   of the join..  
143e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 65    */.    if( pLe
143f0 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20  vel->iFrom>0 && 
14400 28 70 54 61 62 49 74 65 6d 5b 30 5d 2e 6a 6f 69  (pTabItem[0].joi
14410 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
14420 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  !=0 ){.      pLe
14430 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d  vel->iLeftJoin =
14440 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b   ++pParse->nMem;
14450 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14460 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49  beAddOp2(v, OP_I
14470 6e 74 65 67 65 72 2c 20 30 2c 20 70 4c 65 76 65  nteger, 0, pLeve
14480 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
14490 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
144a0 28 28 76 2c 20 22 69 6e 69 74 20 4c 45 46 54 20  ((v, "init LEFT 
144b0 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c  JOIN no-match fl
144c0 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ag"));.    }..#i
144d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
144e0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
144f0 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
14500 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20 20  BestIdx ){.     
14510 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65   /* Case 0:  The
14520 20 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74   table is a virt
14530 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20  ual-table.  Use 
14540 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20  the VFilter and 
14550 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20  VNext.      **  
14560 20 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73          to acces
14570 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20  s the data..    
14580 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a    */.      int j
14590 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 52 65 67  ;.      int iReg
145a0 3b 20 20 20 2f 2a 20 50 33 20 56 61 6c 75 65 20  ;   /* P3 Value 
145b0 66 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 2a  for OP_VFilter *
145c0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
145d0 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65 73  index_info *pBes
145e0 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70  tIdx = pLevel->p
145f0 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20 69  BestIdx;.      i
14600 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  nt nConstraint =
14610 20 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73   pBestIdx->nCons
14620 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20 73 74  traint;.      st
14630 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
14640 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
14650 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a 20 20  age *aUsage =.  
14660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14690 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73 74  pBestIdx->aConst
146a0 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 20 20  raintUsage;.    
146b0 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
146c0 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
146d0 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73 74 72  straint *aConstr
146e0 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20  aint =.         
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14710 20 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64           pBestId
14720 78 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->aConstraint;.
14730 0a 20 20 20 20 20 20 69 52 65 67 20 3d 20 73 71  .      iReg = sq
14740 6c 69 74 65 33 47 65 74 54 65 6d 70 52 61 6e 67  lite3GetTempRang
14750 65 28 70 50 61 72 73 65 2c 20 6e 43 6f 6e 73 74  e(pParse, nConst
14760 72 61 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20  raint+2);.      
14770 66 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e  for(j=1; j<=nCon
14780 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20  straint; j++){. 
14790 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
147a0 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
147b0 3c 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b  <nConstraint; k+
147c0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
147d0 28 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76  ( aUsage[k].argv
147e0 49 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20  Index==j ){.    
147f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
14800 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
14810 6b 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  k].iTermOffset;.
14820 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
14830 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
14840 73 65 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e  se, wc.a[iTerm].
14850 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 69  pExpr->pRight, i
14860 52 65 67 2b 6a 2b 31 29 3b 0a 20 20 20 20 20 20  Reg+j+1);.      
14870 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
14880 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14890 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b   }.        if( k
148a0 3d 3d 6e 43 6f 6e 73 74 72 61 69 6e 74 20 29 20  ==nConstraint ) 
148b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
148c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
148d0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
148e0 65 67 65 72 2c 20 70 42 65 73 74 49 64 78 2d 3e  eger, pBestIdx->
148f0 69 64 78 4e 75 6d 2c 20 69 52 65 67 29 3b 0a 20  idxNum, iReg);. 
14900 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
14910 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74  AddOp2(v, OP_Int
14920 65 67 65 72 2c 20 6a 2d 31 2c 20 69 52 65 67 2b  eger, j-1, iReg+
14930 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14940 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20 4f  3VdbeAddOp4(v, O
14950 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
14960 20 62 72 6b 2c 20 69 52 65 67 2c 20 70 42 65 73   brk, iReg, pBes
14970 74 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a 20 20  tIdx->idxStr,.  
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
149a0 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
149b0 20 3f 20 50 34 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P4_MPRINTF : 
149c0 50 34 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P4_STATIC);.    
149d0 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65    sqlite3Release
149e0 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73 65  TempRange(pParse
149f0 2c 20 69 52 65 67 2c 20 6e 43 6f 6e 73 74 72 61  , iReg, nConstra
14a00 69 6e 74 2b 32 29 3b 0a 20 20 20 20 20 20 70 42  int+2);.      pB
14a10 65 73 74 49 64 78 2d 3e 6e 65 65 64 54 6f 46 72  estIdx->needToFr
14a20 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
14a30 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
14a40 42 65 73 74 49 64 78 2d 3e 6e 43 6f 6e 73 74 72  BestIdx->nConstr
14a50 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  aint; j++){.    
14a60 20 20 20 20 69 66 28 20 61 55 73 61 67 65 5b 6a      if( aUsage[j
14a70 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  ].omit ){.      
14a80 20 20 20 20 69 6e 74 20 69 54 65 72 6d 20 3d 20      int iTerm = 
14a90 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69  aConstraint[j].i
14aa0 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20  TermOffset;.    
14ab0 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
14ac0 6d 28 70 4c 65 76 65 6c 2c 20 26 77 63 2e 61 5b  m(pLevel, &wc.a[
14ad0 69 54 65 72 6d 5d 29 3b 0a 20 20 20 20 20 20 20  iTerm]);.       
14ae0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14af0 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
14b00 5f 56 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c  _VNext;.      pL
14b10 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
14b20 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
14b30 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  2 = sqlite3VdbeC
14b40 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
14b50 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
14b60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
14b70 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a  IRTUALTABLE */..
14b80 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14b90 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f  flags & WHERE_RO
14ba0 57 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20  WID_EQ ){.      
14bb0 2f 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63  /* Case 1:  We c
14bc0 61 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65  an directly refe
14bd0 72 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72  rence a single r
14be0 6f 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ow using an.    
14bf0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71    **          eq
14c00 75 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f  uality compariso
14c10 6e 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f  n against the RO
14c20 57 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20  WID field.  Or. 
14c30 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
14c40 20 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75   we reference mu
14c50 6c 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e  ltiple rows usin
14c60 67 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e  g a "rowid IN (.
14c70 2e 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20  ..)".      **   
14c80 20 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74         construct
14c90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
14ca0 20 69 6e 74 20 72 31 3b 0a 20 20 20 20 20 20 70   int r1;.      p
14cb0 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
14cc0 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  &wc, iCur, -1, n
14cd0 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c 57  otReady, WO_EQ|W
14ce0 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20 20  O_IN, 0);.      
14cf0 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
14d00 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
14d10 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21 3d  ( pTerm->pExpr!=
14d20 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14d30 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  t( pTerm->leftCu
14d40 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20  rsor==iCur );.  
14d50 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
14d60 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
14d70 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
14d80 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
14d90 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75 61  ;.      codeEqua
14da0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
14db0 20 70 54 65 72 6d 2c 20 70 4c 65 76 65 6c 2c 20   pTerm, pLevel, 
14dc0 72 31 29 3b 0a 20 20 20 20 20 20 6e 78 74 20 3d  r1);.      nxt =
14dd0 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b 0a 20 20   pLevel->nxt;.  
14de0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
14df0 64 64 4f 70 33 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp3(v, OP_Must
14e00 42 65 49 6e 74 2c 20 72 31 2c 20 6e 78 74 2c 20  BeInt, r1, nxt, 
14e10 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
14e20 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
14e30 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75  P_NotExists, iCu
14e40 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20 20 20  r, nxt, r1);.   
14e50 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
14e60 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20  v, "pk"));.     
14e70 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
14e80 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
14e90 31 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  1);.      pLevel
14ea0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
14eb0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
14ec0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
14ed0 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
14ee0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
14ef0 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
14f00 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
14f10 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
14f20 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
14f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
14f40 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
14f50 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  op;.      int st
14f60 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65  art;.      Where
14f70 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
14f80 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  End;..      asse
14f90 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
14fa0 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74   );.      pStart
14fb0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
14fc0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
14fd0 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
14fe0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64  , 0);.      pEnd
14ff0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
15000 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
15010 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
15020 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
15030 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
15040 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
15050 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d          pStart =
15060 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70   pEnd;.        p
15070 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
15080 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
15090 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
150a0 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
150b0 20 20 20 69 6e 74 20 72 31 2c 20 72 65 67 46 72     int r1, regFr
150c0 65 65 31 3b 0a 20 20 20 20 20 20 20 20 70 58 20  ee1;.        pX 
150d0 3d 20 70 53 74 61 72 74 2d 3e 70 45 78 70 72 3b  = pStart->pExpr;
150e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
150f0 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   pX!=0 );.      
15100 20 20 61 73 73 65 72 74 28 20 70 53 74 61 72 74    assert( pStart
15110 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
15120 75 72 20 29 3b 0a 20 20 20 20 20 20 20 20 72 31  ur );.        r1
15130 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
15140 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70  deTemp(pParse, p
15150 58 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46  X->pRight, &regF
15160 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
15170 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
15180 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c  (v, OP_ForceInt,
15190 20 72 31 2c 20 62 72 6b 2c 20 0a 20 20 20 20 20   r1, brk, .     
151a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151b0 20 20 20 20 20 20 20 20 70 58 2d 3e 6f 70 3d 3d          pX->op==
151c0 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LE || pX->op=
151d0 3d 54 4b 5f 47 54 29 3b 0a 20 20 20 20 20 20 20  =TK_GT);.       
151e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
151f0 70 33 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  p3(v, bRev ? OP_
15200 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65  MoveLt : OP_Move
15210 47 65 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 72  Ge, iCur, brk, r
15220 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  1);.        Vdbe
15230 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
15240 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
15250 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65  te3ReleaseTempRe
15260 67 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65  g(pParse, regFre
15270 65 31 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  e1);.        dis
15280 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
15290 20 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20   pStart);.      
152a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
152b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
152c0 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61  (v, bRev ? OP_La
152d0 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20  st : OP_Rewind, 
152e0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
152f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
15300 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  nd ){.        Ex
15310 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20  pr *pX;.        
15320 70 58 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72  pX = pEnd->pExpr
15330 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
15340 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
15350 20 20 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d     assert( pEnd-
15360 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
15370 72 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  r );.        pLe
15380 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70 50  vel->iMem = ++pP
15390 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20  arse->nMem;.    
153a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
153b0 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
153c0 70 52 69 67 68 74 2c 20 70 4c 65 76 65 6c 2d 3e  pRight, pLevel->
153d0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  iMem);.        i
153e0 66 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  f( pX->op==TK_LT
153f0 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47   || pX->op==TK_G
15400 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  T ){.          t
15410 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f  estOp = bRev ? O
15420 50 5f 4c 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20  P_Le : OP_Ge;.  
15430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15440 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20         testOp = 
15450 62 52 65 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f  bRev ? OP_Lt : O
15460 50 5f 47 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  P_Gt;.        }.
15470 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
15480 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 45 6e 64  erm(pLevel, pEnd
15490 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
154a0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
154b0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
154c0 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  v);.      pLevel
154d0 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  ->op = bRev ? OP
154e0 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b  _Prev : OP_Next;
154f0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
15500 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20  1 = iCur;.      
15510 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
15520 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65  rt;.      if( te
15530 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
15540 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 31 20  .        int r1 
15550 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
15560 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
15570 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15580 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 52 6f 77  AddOp2(v, OP_Row
15590 69 64 2c 20 69 43 75 72 2c 20 72 31 29 3b 0a 20  id, iCur, r1);. 
155a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
155b0 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
155c0 50 5f 53 43 6f 70 79 2c 20 70 4c 65 76 65 6c 2d  P_SCopy, pLevel-
155d0 3e 69 4d 65 6d 2c 20 30 29 3b 20 2a 2f 0a 20 20  >iMem, 0); */.  
155e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
155f0 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
15600 70 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  p, pLevel->iMem,
15610 20 62 72 6b 2c 20 72 31 29 3b 0a 20 20 20 20 20   brk, r1);.     
15620 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
15630 61 6e 67 65 50 35 28 76 2c 20 53 51 4c 49 54 45  angeP5(v, SQLITE
15640 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 20 53  _AFF_NUMERIC | S
15650 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
15660 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
15670 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
15680 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
15690 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
156a0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
156b0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
156c0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
156d0 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65 20 57  /* Case 3: The W
156e0 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
156f0 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
15700 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
15710 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
15720 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
15730 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61  dex is an inequa
15740 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70  lity.  For examp
15750 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  le, if.      ** 
15760 20 20 20 20 20 20 20 20 74 68 65 20 69 6e 64 65          the inde
15770 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20  x is on (x,y,z) 
15780 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63 6c  and the WHERE cl
15790 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20  ause is of the. 
157a0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
157b0 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c  form "x=5 AND y<
157c0 31 30 22 20 74 68 65 6e 20 74 68 69 73 20 63 61  10" then this ca
157d0 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c  se is used.  Onl
157e0 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20  y the.      **  
157f0 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73         right-mos
15800 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
15810 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
15820 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
15830 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
15840 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
15850 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a  "IN" operators..
15860 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
15870 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
15880 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
15890 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
158a0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
158b0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
158c0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
158d0 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
158e0 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
158f0 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
15900 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
15910 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
15920 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
15930 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
15940 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
15950 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
15960 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
15970 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f  Eq;.      int to
15980 70 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a  pEq=0;        /*
15990 20 54 72 75 65 20 69 66 20 74 6f 70 20 6c 69 6d   True if top lim
159a0 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73  it uses ==. Fals
159b0 65 20 69 73 20 73 74 72 69 63 74 6c 79 20 3c 20  e is strictly < 
159c0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d  */.      int btm
159d0 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  Eq=0;        /* 
159e0 54 72 75 65 20 69 66 20 62 74 6d 20 6c 69 6d 69  True if btm limi
159f0 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65  t uses ==. False
15a00 20 69 66 20 73 74 72 69 63 74 6c 79 20 3e 20 2a   if strictly > *
15a10 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4f  /.      int topO
15a20 70 2c 20 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f  p, btmOp;   /* O
15a30 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
15a40 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   top and bottom 
15a50 73 65 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f  search bounds */
15a60 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
15a70 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70  p;.      int top
15a80 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d  Limit = (pLevel-
15a90 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54  >flags & WHERE_T
15aa0 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20  OP_LIMIT)!=0;.  
15ab0 20 20 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74      int btmLimit
15ac0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
15ad0 73 20 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49  s & WHERE_BTM_LI
15ae0 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20 20 20 69  MIT)!=0;.      i
15af0 6e 74 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20  nt isMinQuery = 
15b00 30 3b 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  0;      /* If th
15b10 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
15b20 65 64 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29  ed SELECT min(x)
15b30 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e   ... */.      in
15b40 74 20 72 65 67 42 61 73 65 3b 20 20 20 20 20 20  t regBase;      
15b50 20 20 2f 2a 20 42 61 73 65 20 72 65 67 69 73 74    /* Base regist
15b60 65 72 20 68 6f 6c 64 69 6e 67 20 63 6f 6e 73 74  er holding const
15b70 72 61 69 6e 74 20 76 61 6c 75 65 73 20 2a 2f 0a  raint values */.
15b80 20 20 20 20 20 20 69 6e 74 20 72 31 3b 20 20 20        int r1;   
15b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d            /* Tem
15ba0 70 20 72 65 67 69 73 74 65 72 20 2a 2f 0a 0a 20  p register */.. 
15bb0 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
15bc0 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74   code to evaluat
15bd0 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  e all constraint
15be0 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20   terms using == 
15bf0 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61  or IN.      ** a
15c00 6e 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c  nd level the val
15c10 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72  ues of those ter
15c20 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ms on the stack.
15c30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
15c40 72 65 67 42 61 73 65 20 3d 20 63 6f 64 65 41 6c  regBase = codeAl
15c50 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70  lEqualityTerms(p
15c60 50 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26  Parse, pLevel, &
15c70 77 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 32 29  wc, notReady, 2)
15c80 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
15c90 72 65 20 6f 75 74 20 77 68 61 74 20 63 6f 6d 70  re out what comp
15ca0 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 73  arison operators
15cb0 20 74 6f 20 75 73 65 20 66 6f 72 20 74 6f 70 20   to use for top 
15cc0 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20 20 20  and bottom .    
15cd0 20 20 2a 2a 20 73 65 61 72 63 68 20 62 6f 75 6e    ** search boun
15ce0 64 73 2e 20 46 6f 72 20 61 6e 20 61 73 63 65 6e  ds. For an ascen
15cf0 64 69 6e 67 20 69 6e 64 65 78 2c 20 74 68 65 20  ding index, the 
15d00 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69 73 20  bottom bound is 
15d10 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20 20 20  a > or >=.      
15d20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e 64 20  ** operator and 
15d30 74 68 65 20 74 6f 70 20 62 6f 75 6e 64 20 69 73  the top bound is
15d40 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65 72 61   a < or <= opera
15d50 74 6f 72 2e 20 20 46 6f 72 20 61 20 64 65 73 63  tor.  For a desc
15d60 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  ending.      ** 
15d70 69 6e 64 65 78 20 74 68 65 20 6f 70 65 72 61 74  index the operat
15d80 6f 72 73 20 61 72 65 20 72 65 76 65 72 73 65 64  ors are reversed
15d90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15da0 20 69 66 28 20 70 49 64 78 2d 3e 61 53 6f 72 74   if( pIdx->aSort
15db0 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53 51 4c 49  Order[nEq]==SQLI
15dc0 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a 20 20 20  TE_SO_ASC ){.   
15dd0 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f       topOp = WO_
15de0 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20  LT|WO_LE;.      
15df0 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 47 54 7c    btmOp = WO_GT|
15e00 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c  WO_GE;.      }el
15e10 73 65 7b 0a 20 20 20 20 20 20 20 20 74 6f 70 4f  se{.        topO
15e20 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b  p = WO_GT|WO_GE;
15e30 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20 3d  .        btmOp =
15e40 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20   WO_LT|WO_LE;.  
15e50 20 20 20 20 20 20 53 57 41 50 28 69 6e 74 2c 20        SWAP(int, 
15e60 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d 4c 69 6d  topLimit, btmLim
15e70 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  it);.      }..  
15e80 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 6c      /* If this l
15e90 6f 6f 70 20 73 61 74 69 73 66 69 65 73 20 61 20  oop satisfies a 
15ea0 73 6f 72 74 20 6f 72 64 65 72 20 28 70 4f 72 64  sort order (pOrd
15eb0 65 72 42 79 29 20 72 65 71 75 65 73 74 20 74 68  erBy) request th
15ec0 61 74 20 0a 20 20 20 20 20 20 2a 2a 20 77 61 73  at .      ** was
15ed0 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
15ee0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6d 70 6c  function to impl
15ef0 65 6d 65 6e 74 20 61 20 22 53 45 4c 45 43 54 20  ement a "SELECT 
15f00 6d 69 6e 28 78 29 20 2e 2e 2e 22 20 0a 20 20 20  min(x) ..." .   
15f10 20 20 20 2a 2a 20 71 75 65 72 79 2c 20 74 68 65     ** query, the
15f20 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  n the caller wil
15f30 6c 20 6f 6e 6c 79 20 61 6c 6c 6f 77 20 74 68 65  l only allow the
15f40 20 6c 6f 6f 70 20 74 6f 20 72 75 6e 20 66 6f 72   loop to run for
15f50 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67  .      ** a sing
15f60 6c 65 20 69 74 65 72 61 74 69 6f 6e 2e 20 54 68  le iteration. Th
15f70 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
15f80 65 20 66 69 72 73 74 20 72 6f 77 20 72 65 74 75  e first row retu
15f90 72 6e 65 64 0a 20 20 20 20 20 20 2a 2a 20 73 68  rned.      ** sh
15fa0 6f 75 6c 64 20 6e 6f 74 20 68 61 76 65 20 61 20  ould not have a 
15fb0 4e 55 4c 4c 20 76 61 6c 75 65 20 73 74 6f 72 65  NULL value store
15fc0 64 20 69 6e 20 27 78 27 2e 20 49 66 20 63 6f 6c  d in 'x'. If col
15fd0 75 6d 6e 20 27 78 27 20 69 73 0a 20 20 20 20 20  umn 'x' is.     
15fe0 20 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6f 6e   ** the first on
15ff0 65 20 61 66 74 65 72 20 74 68 65 20 6e 45 71 20  e after the nEq 
16000 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
16010 69 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ints in the inde
16020 78 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73  x,.      ** this
16030 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 20 73   requires some s
16040 70 65 63 69 61 6c 20 68 61 6e 64 6c 69 6e 67 2e  pecial handling.
16050 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
16060 69 66 28 20 28 6f 62 66 6c 61 67 3d 3d 4f 52 44  if( (obflag==ORD
16070 45 52 42 59 5f 4d 49 4e 29 0a 20 20 20 20 20 20  ERBY_MIN).      
16080 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61   && (pLevel->fla
16090 67 73 26 57 48 45 52 45 5f 4f 52 44 45 52 42 59  gs&WHERE_ORDERBY
160a0 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 49 64  ).       && (pId
160b0 78 2d 3e 6e 43 6f 6c 75 6d 6e 3e 6e 45 71 29 0a  x->nColumn>nEq).
160c0 20 20 20 20 20 20 20 26 26 20 28 70 4f 72 64 65         && (pOrde
160d0 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d  rBy->a[0].pExpr-
160e0 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e  >iColumn==pIdx->
160f0 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 29 0a 20  aiColumn[nEq]). 
16100 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
16110 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 31 3b 0a  isMinQuery = 1;.
16120 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
16130 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
16140 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20  ermination key. 
16150 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
16160 20 76 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20   value that.    
16170 20 20 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68    ** will end th
16180 65 20 73 65 61 72 63 68 2e 20 20 54 68 65 72 65  e search.  There
16190 20 69 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69   is no terminati
161a0 6f 6e 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a  on key if there.
161b0 20 20 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20        ** are no 
161c0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
161d0 6e 64 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65  nd no "X<..." te
161e0 72 6d 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  rm..      **.   
161f0 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
16200 34 3a 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d  4: On a reverse-
16210 6f 72 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20  order scan, the 
16220 73 6f 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69  so-called "termi
16230 6e 61 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a  nation".      **
16240 20 6b 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65   key computed he
16250 72 65 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75  re really ends u
16260 70 20 62 65 69 6e 67 20 74 68 65 20 73 74 61 72  p being the star
16270 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  t key..      */.
16280 20 20 20 20 20 20 6e 78 74 20 3d 20 70 4c 65 76        nxt = pLev
16290 65 6c 2d 3e 6e 78 74 3b 0a 20 20 20 20 20 20 69  el->nxt;.      i
162a0 66 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20  f( topLimit ){. 
162b0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
162c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d  .        int k =
162d0 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
162e0 6e 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 70 54  nEq];.        pT
162f0 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 26  erm = findTerm(&
16300 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74  wc, iCur, k, not
16310 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49  Ready, topOp, pI
16320 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  dx);.        ass
16330 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29 3b  ert( pTerm!=0 );
16340 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 54  .        pX = pT
16350 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  erm->pExpr;.    
16360 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
16370 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
16380 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
16390 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
163a0 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
163b0 2d 3e 70 52 69 67 68 74 2c 20 72 65 67 42 61 73  ->pRight, regBas
163c0 65 2b 6e 45 71 29 3b 0a 20 20 20 20 20 20 20 20  e+nEq);.        
163d0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
163e0 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20  2(v, OP_IsNull, 
163f0 72 65 67 42 61 73 65 2b 6e 45 71 2c 20 6e 78 74  regBase+nEq, nxt
16400 29 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71  );.        topEq
16410 20 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61   = pTerm->eOpera
16420 74 6f 72 20 26 20 28 57 4f 5f 4c 45 7c 57 4f 5f  tor & (WO_LE|WO_
16430 47 45 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  GE);.        dis
16440 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
16450 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   pTerm);.       
16460 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78   testOp = OP_Idx
16470 47 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  GE;.      }else{
16480 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20  .        testOp 
16490 3d 20 6e 45 71 3e 30 20 3f 20 4f 50 5f 49 64 78  = nEq>0 ? OP_Idx
164a0 47 45 20 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  GE : OP_Noop;.  
164b0 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 31 3b        topEq = 1;
164c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
164d0 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
164e0 6f 70 20 7c 7c 20 28 69 73 4d 69 6e 51 75 65 72  op || (isMinQuer
164f0 79 26 26 62 52 65 76 29 20 29 7b 0a 20 20 20 20  y&&bRev) ){.    
16500 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e      int nCol = n
16510 45 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20  Eq + topLimit;. 
16520 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 69 6e         if( isMin
16530 51 75 65 72 79 20 26 26 20 62 52 65 76 20 26 26  Query && bRev &&
16540 20 21 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20   !topLimit ){.  
16550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16560 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
16570 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61 73 65  Null, 0, regBase
16580 2b 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  +nCol);.        
16590 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20    nCol++;.      
165a0 20 20 20 20 74 6f 70 45 71 20 3d 20 30 3b 0a 20      topEq = 0;. 
165b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
165c0 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
165d0 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64 78 2c 20  (v, nCol, pIdx, 
165e0 72 65 67 42 61 73 65 2c 20 70 4c 65 76 65 6c 2d  regBase, pLevel-
165f0 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20  >iMem);.        
16600 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
16610 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 74        int op = t
16620 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65  opEq ? OP_MoveLe
16630 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20   : OP_MoveLt;.  
16640 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
16650 64 62 65 41 64 64 4f 70 33 28 76 2c 20 6f 70 2c  dbeAddOp3(v, op,
16660 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c 20 70   iIdxCur, nxt, p
16670 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20  Level->iMem);.  
16680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
16690 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b 0a  lse if( bRev ){.
166a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
166b0 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
166c0 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62  Last, iIdxCur, b
166d0 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rk);.      }.   
166e0 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
166f0 74 65 20 74 68 65 20 73 74 61 72 74 20 6b 65 79  te the start key
16700 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 6b  .  This is the k
16710 65 79 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  ey that defines 
16720 74 68 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20  the lower.      
16730 2a 2a 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20  ** bound on the 
16740 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
16750 73 20 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69  s no start key i
16760 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20  f there are no. 
16770 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
16780 20 74 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68   terms and if th
16790 65 72 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e  ere is no "X>...
167a0 22 20 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20  " term.  In.    
167b0 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20    ** that case, 
167c0 67 65 6e 65 72 61 74 65 20 61 20 22 52 65 77 69  generate a "Rewi
167d0 6e 64 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  nd" instruction 
167e0 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a  in place of the.
167f0 20 20 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b        ** start k
16800 65 79 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20  ey search..     
16810 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30   **.      ** 200
16820 32 2d 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65  2-Dec-04: In the
16830 20 63 61 73 65 20 6f 66 20 61 20 72 65 76 65 72   case of a rever
16840 73 65 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c  se-order search,
16850 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20   the so-called. 
16860 20 20 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20       ** "start" 
16870 6b 65 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20  key really ends 
16880 75 70 20 62 65 69 6e 67 20 75 73 65 64 20 61 73  up being used as
16890 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
168a0 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   key..      */. 
168b0 20 20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69       if( btmLimi
168c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  t ){.        Exp
168d0 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69  r *pX;.        i
168e0 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43  nt k = pIdx->aiC
168f0 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20  olumn[nEq];.    
16900 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64      pTerm = find
16910 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c 20  Term(&wc, iCur, 
16920 6b 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 74 6d  k, notReady, btm
16930 4f 70 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20  Op, pIdx);.     
16940 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
16950 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
16960 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
16970 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16980 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  ( (pTerm->flags 
16990 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30  & TERM_CODED)==0
169a0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
169b0 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
169c0 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 2c 20  se, pX->pRight, 
169d0 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
169e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
169f0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
16a00 4e 75 6c 6c 2c 20 72 65 67 42 61 73 65 2b 6e 45  Null, regBase+nE
16a10 71 2c 20 6e 78 74 29 3b 0a 20 20 20 20 20 20 20  q, nxt);.       
16a20 20 62 74 6d 45 71 20 3d 20 70 54 65 72 6d 2d 3e   btmEq = pTerm->
16a30 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
16a40 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20  LE|WO_GE);.     
16a50 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
16a60 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20  Level, pTerm);. 
16a70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16a80 20 20 20 20 62 74 6d 45 71 20 3d 20 31 3b 0a 20      btmEq = 1;. 
16a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
16aa0 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d   nEq>0 || btmLim
16ab0 69 74 20 7c 7c 20 28 69 73 4d 69 6e 51 75 65 72  it || (isMinQuer
16ac0 79 26 26 21 62 52 65 76 29 20 29 7b 0a 20 20 20  y&&!bRev) ){.   
16ad0 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20       int nCol = 
16ae0 6e 45 71 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a  nEq + btmLimit;.
16af0 20 20 20 20 20 20 20 20 69 66 28 20 69 73 4d 69          if( isMi
16b00 6e 51 75 65 72 79 20 26 26 20 21 62 52 65 76 20  nQuery && !bRev 
16b10 26 26 20 21 62 74 6d 4c 69 6d 69 74 20 29 7b 0a  && !btmLimit ){.
16b20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
16b30 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f  3VdbeAddOp2(v, O
16b40 50 5f 4e 75 6c 6c 2c 20 30 2c 20 72 65 67 42 61  P_Null, 0, regBa
16b50 73 65 2b 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  se+nCol);.      
16b60 20 20 20 20 6e 43 6f 6c 2b 2b 3b 0a 20 20 20 20      nCol++;.    
16b70 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 30 3b        btmEq = 0;
16b80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16b90 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
16ba0 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 70 4c           r1 = pL
16bb0 65 76 65 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20  evel->iMem;.    
16bc0 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
16bd0 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20 20 20 20  P_IdxLT;.       
16be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
16bf0 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65    r1 = sqlite3Ge
16c00 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29  tTempReg(pParse)
16c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16c20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
16c30 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 70 49 64  obe(v, nCol, pId
16c40 78 2c 20 72 65 67 42 61 73 65 2c 20 72 31 29 3b  x, regBase, r1);
16c50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62 52  .        if( !bR
16c60 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
16c70 69 6e 74 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f  int op = btmEq ?
16c80 20 4f 50 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f   OP_MoveGe : OP_
16c90 4d 6f 76 65 47 74 3b 0a 20 20 20 20 20 20 20 20  MoveGt;.        
16ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16cb0 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 64 78 43  Op3(v, op, iIdxC
16cc0 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20 20  ur, nxt, r1);.  
16cd0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
16ce0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
16cf0 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20 20  arse, r1);.     
16d00 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16d10 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
16d20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50       testOp = OP
16d30 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c  _Noop;.      }el
16d40 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
16d50 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
16d60 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 49 64 78   OP_Rewind, iIdx
16d70 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
16d80 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e   }..      /* Gen
16d90 65 72 61 74 65 20 74 68 65 20 74 68 65 20 74 6f  erate the the to
16da0 70 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  p of the loop.  
16db0 49 66 20 74 68 65 72 65 20 69 73 20 61 20 74 65  If there is a te
16dc0 72 6d 69 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20  rmination.      
16dd0 2a 2a 20 6b 65 79 20 77 65 20 68 61 76 65 20 74  ** key we have t
16de0 6f 20 74 65 73 74 20 66 6f 72 20 74 68 61 74 20  o test for that 
16df0 6b 65 79 20 61 6e 64 20 61 62 6f 72 74 20 61 74  key and abort at
16e00 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a   the top of the.
16e10 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20        ** loop.. 
16e20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74       */.      st
16e30 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
16e40 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
16e50 0a 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f  .      if( testO
16e60 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20  p!=OP_Noop ){.  
16e70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
16e80 65 41 64 64 4f 70 33 28 76 2c 20 74 65 73 74 4f  eAddOp3(v, testO
16e90 70 2c 20 69 49 64 78 43 75 72 2c 20 6e 78 74 2c  p, iIdxCur, nxt,
16ea0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 29 3b 0a   pLevel->iMem);.
16eb0 20 20 20 20 20 20 20 20 69 66 28 20 28 74 6f 70          if( (top
16ec0 45 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20  Eq && !bRev) || 
16ed0 28 21 62 74 6d 45 71 20 26 26 20 62 52 65 76 29  (!btmEq && bRev)
16ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
16ef0 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
16f00 35 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  5(v, 1);.       
16f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
16f20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74   r1 = sqlite3Get
16f30 54 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b  TempReg(pParse);
16f40 0a 20 20 20 20 20 20 69 66 28 20 74 6f 70 4c 69  .      if( topLi
16f50 6d 69 74 20 7c 20 62 74 6d 4c 69 6d 69 74 20 29  mit | btmLimit )
16f60 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
16f70 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f  3VdbeAddOp3(v, O
16f80 50 5f 43 6f 6c 75 6d 6e 2c 20 69 49 64 78 43 75  P_Column, iIdxCu
16f90 72 2c 20 6e 45 71 2c 20 72 31 29 3b 0a 20 20 20  r, nEq, r1);.   
16fa0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16fb0 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73 4e  AddOp2(v, OP_IsN
16fc0 75 6c 6c 2c 20 72 31 2c 20 63 6f 6e 74 29 3b 0a  ull, r1, cont);.
16fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16fe0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
16ff0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
17000 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
17010 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75  IdxRowid, iIdxCu
17020 72 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20  r, r1);.        
17030 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17040 33 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  3(v, OP_MoveGe, 
17050 69 43 75 72 2c 20 30 2c 20 72 31 29 3b 20 20 2f  iCur, 0, r1);  /
17060 2a 20 44 65 66 65 72 72 65 64 20 73 65 65 6b 20  * Deferred seek 
17070 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
17080 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
17090 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
170a0 31 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65  1);..      /* Re
170b0 63 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63  cord the instruc
170c0 74 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72  tion used to ter
170d0 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e  minate the loop.
170e0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
170f0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65  pLevel->op = bRe
17100 76 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50  v ? OP_Prev : OP
17110 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  _Next;.      pLe
17120 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75  vel->p1 = iIdxCu
17130 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
17140 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20  >p2 = start;.   
17150 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
17160 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
17170 5f 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20  _COLUMN_EQ ){.  
17180 20 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20      /* Case 4:  
17190 54 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65  There is an inde
171a0 78 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20  x and all terms 
171b0 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
171c0 75 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  use that.      *
171d0 2a 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72  *          refer
171e0 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73   to the index us
171f0 69 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20  ing the "==" or 
17200 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a  "IN" operators..
17210 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
17220 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20  nt start;.      
17230 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c  int nEq = pLevel
17240 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69 6e 74  ->nEq;.      int
17250 20 69 73 4d 69 6e 51 75 65 72 79 20 3d 20 30 3b   isMinQuery = 0;
17260 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
17270 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64   is an optimized
17280 20 53 45 4c 45 43 54 20 6d 69 6e 28 78 29 20 2e   SELECT min(x) .
17290 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  .. */.      int 
172a0 72 65 67 42 61 73 65 3b 20 20 20 20 20 20 20 20  regBase;        
172b0 20 20 20 20 20 2f 2a 20 42 61 73 65 20 72 65 67       /* Base reg
172c0 69 73 74 65 72 20 6f 66 20 61 72 72 61 79 20 68  ister of array h
172d0 6f 6c 64 69 6e 67 20 63 6f 6e 73 74 72 61 69 6e  olding constrain
172e0 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
172f0 72 31 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65  r1;..      /* Ge
17300 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65  nerate code to e
17310 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e 73  valuate all cons
17320 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73 69  traint terms usi
17330 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20 20  ng == or IN.    
17340 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20 74    ** and leave t
17350 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68 6f  he values of tho
17360 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65 20  se terms on the 
17370 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a  stack..      */.
17380 20 20 20 20 20 20 72 65 67 42 61 73 65 20 3d 20        regBase = 
17390 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
173a0 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65  erms(pParse, pLe
173b0 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61  vel, &wc, notRea
173c0 64 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 6e 78  dy, 1);.      nx
173d0 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 78 74 3b  t = pLevel->nxt;
173e0 0a 0a 20 20 20 20 20 20 69 66 28 20 28 6f 62 66  ..      if( (obf
173f0 6c 61 67 3d 3d 4f 52 44 45 52 42 59 5f 4d 49 4e  lag==ORDERBY_MIN
17400 29 0a 20 20 20 20 20 20 20 26 26 20 28 70 4c 65  ).       && (pLe
17410 76 65 6c 2d 3e 66 6c 61 67 73 26 57 48 45 52 45  vel->flags&WHERE
17420 5f 4f 52 44 45 52 42 59 29 20 0a 20 20 20 20 20  _ORDERBY) .     
17430 20 20 26 26 20 28 70 49 64 78 2d 3e 6e 43 6f 6c    && (pIdx->nCol
17440 75 6d 6e 3e 6e 45 71 29 0a 20 20 20 20 20 20 20  umn>nEq).       
17450 26 26 20 28 70 4f 72 64 65 72 42 79 2d 3e 61 5b  && (pOrderBy->a[
17460 30 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  0].pExpr->iColum
17470 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d  n==pIdx->aiColum
17480 6e 5b 6e 45 71 5d 29 0a 20 20 20 20 20 20 29 7b  n[nEq]).      ){
17490 0a 20 20 20 20 20 20 20 20 69 73 4d 69 6e 51 75  .        isMinQu
174a0 65 72 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ery = 1;.       
174b0 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65   buildIndexProbe
174c0 28 76 2c 20 6e 45 71 2c 20 70 49 64 78 2c 20 72  (v, nEq, pIdx, r
174d0 65 67 42 61 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  egBase, pLevel->
174e0 69 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  iMem);.        s
174f0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
17500 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
17510 72 65 67 42 61 73 65 2b 6e 45 71 29 3b 0a 20 20  regBase+nEq);.  
17520 20 20 20 20 20 20 72 31 20 3d 20 2b 2b 70 50 61        r1 = ++pPa
17530 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
17540 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
17550 62 65 28 76 2c 20 6e 45 71 2b 31 2c 20 70 49 64  be(v, nEq+1, pId
17560 78 2c 20 72 65 67 42 61 73 65 2c 20 72 31 29 3b  x, regBase, r1);
17570 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17580 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
17590 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79 20 74  e a single key t
175a0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
175b0 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74 20 61   to both start a
175c0 6e 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  nd .        ** t
175d0 65 72 6d 69 6e 61 74 65 20 74 68 65 20 73 65 61  erminate the sea
175e0 72 63 68 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  rch.        */. 
175f0 20 20 20 20 20 20 20 72 31 20 3d 20 70 4c 65 76         r1 = pLev
17600 65 6c 2d 3e 69 4d 65 6d 3b 0a 20 20 20 20 20 20  el->iMem;.      
17610 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
17620 65 28 76 2c 20 6e 45 71 2c 20 70 49 64 78 2c 20  e(v, nEq, pIdx, 
17630 72 65 67 42 61 73 65 2c 20 72 31 29 3b 0a 20 20  regBase, r1);.  
17640 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
17650 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 31  Generate code (1
17660 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65  ) to move to the
17670 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67 20   first matching 
17680 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74  element of the t
17690 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
176a0 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f 64  hen generate cod
176b0 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70 73  e (2) that jumps
176c0 20 74 6f 20 22 6e 78 74 22 20 61 66 74 65 72 20   to "nxt" after 
176d0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 61  the cursor is pa
176e0 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  st.      ** the 
176f0 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c  last matching el
17700 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62  ement of the tab
17710 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28 31  le.  The code (1
17720 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20 20  ) is executed.  
17730 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69      ** once to i
17740 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 65  nitialize the se
17750 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20 28  arch, the code (
17760 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20 62  2) is executed b
17770 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20 20  efore each.     
17780 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f 66   ** iteration of
17790 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65 65   the scan to see
177a0 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61 73   if the scan has
177b0 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20   finished. */.  
177c0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
177d0 20 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20          /* Scan 
177e0 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
177f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
17800 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
17810 69 73 4d 69 6e 51 75 65 72 79 20 29 7b 0a 20 20  isMinQuery ){.  
17820 20 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f          op = OP_
17830 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20  MoveLt;.        
17840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17850 20 6f 70 20 3d 20 4f 50 5f 4d 6f 76 65 4c 65 3b   op = OP_MoveLe;
17860 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17870 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
17880 64 4f 70 33 28 76 2c 20 6f 70 2c 20 69 49 64 78  dOp3(v, op, iIdx
17890 43 75 72 2c 20 6e 78 74 2c 20 72 31 29 3b 0a 20  Cur, nxt, r1);. 
178a0 20 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73         start = s
178b0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
178c0 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49  (v, OP_IdxLT, iI
178d0 64 78 43 75 72 2c 20 6e 78 74 2c 20 70 4c 65 76  dxCur, nxt, pLev
178e0 65 6c 2d 3e 69 4d 65 6d 29 3b 0a 20 20 20 20 20  el->iMem);.     
178f0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
17900 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  OP_Prev;.      }
17910 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
17920 20 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72   Scan in the for
17930 77 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ward order */.  
17940 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20        int op;.  
17950 20 20 20 20 20 20 69 66 28 20 69 73 4d 69 6e 51        if( isMinQ
17960 75 65 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20  uery ){.        
17970 20 20 6f 70 20 3d 20 4f 50 5f 4d 6f 76 65 47 74    op = OP_MoveGt
17980 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17990 0a 20 20 20 20 20 20 20 20 20 20 6f 70 20 3d 20  .          op = 
179a0 4f 50 5f 4d 6f 76 65 47 65 3b 0a 20 20 20 20 20  OP_MoveGe;.     
179b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
179c0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
179d0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 6e  , op, iIdxCur, n
179e0 78 74 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 20  xt, r1);.       
179f0 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
17a00 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50  VdbeAddOp3(v, OP
17a10 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72 2c  _IdxGE, iIdxCur,
17a20 20 6e 78 74 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d   nxt, pLevel->iM
17a30 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
17a40 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
17a50 28 76 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (v, 1);.        
17a60 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
17a70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
17a80 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
17a90 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 31  le ){.        r1
17aa0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
17ab0 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
17ac0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
17ad0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 64  eAddOp2(v, OP_Id
17ae0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
17af0 20 72 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71   r1);.        sq
17b00 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
17b10 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43  v, OP_MoveGe, iC
17b20 75 72 2c 20 30 2c 20 72 31 29 3b 20 20 2f 2a 20  ur, 0, r1);  /* 
17b30 44 65 66 65 72 72 65 64 20 73 65 65 6b 20 2a 2f  Deferred seek */
17b40 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
17b50 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70  ReleaseTempReg(p
17b60 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 20 20  Parse, r1);.    
17b70 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65 6c    }.      pLevel
17b80 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a  ->p1 = iIdxCur;.
17b90 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
17ba0 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65   = start;.    }e
17bb0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  lse{.      /* Ca
17bc0 73 65 20 35 3a 20 20 54 68 65 72 65 20 69 73 20  se 5:  There is 
17bd0 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65 78 2e  no usable index.
17be0 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61 20 63    We must do a c
17bf0 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20 2a 2a  omplete.      **
17c00 20 20 20 20 20 20 20 20 20 20 73 63 61 6e 20 6f            scan o
17c10 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 61 62  f the entire tab
17c20 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  le..      */.   
17c30 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
17c40 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
17c50 20 61 73 73 65 72 74 28 20 62 52 65 76 3d 3d 30   assert( bRev==0
17c60 20 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   );.      pLevel
17c70 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a  ->op = OP_Next;.
17c80 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
17c90 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20 20 70   = iCur;.      p
17ca0 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 31 20 2b 20  Level->p2 = 1 + 
17cb0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
17cc0 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  2(v, OP_Rewind, 
17cd0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
17ce0 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26  }.    notReady &
17cf0 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b  = ~getMask(&mask
17d00 53 65 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20  Set, iCur);..   
17d10 20 2f 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20   /* Insert code 
17d20 74 6f 20 74 65 73 74 20 65 76 65 72 79 20 73 75  to test every su
17d30 62 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74  bexpression that
17d40 20 63 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65   can be complete
17d50 6c 79 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74  ly.    ** comput
17d60 65 64 20 75 73 69 6e 67 20 74 68 65 20 63 75 72  ed using the cur
17d70 72 65 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c  rent set of tabl
17d80 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  es..    */.    f
17d90 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a  or(pTerm=wc.a, j
17da0 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a 3e 30 3b 20  =wc.nTerm; j>0; 
17db0 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j--, pTerm++){. 
17dc0 20 20 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20       Expr *pE;. 
17dd0 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
17de0 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f 56 49  flags & (TERM_VI
17df0 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44  RTUAL|TERM_CODED
17e00 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
17e10 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e      if( (pTerm->
17e20 70 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52  prereqAll & notR
17e30 65 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69  eady)!=0 ) conti
17e40 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20  nue;.      pE = 
17e50 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
17e60 20 20 20 20 61 73 73 65 72 74 28 20 70 45 21 3d      assert( pE!=
17e70 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
17e80 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
17e90 20 26 26 20 21 45 78 70 72 48 61 73 50 72 6f 70   && !ExprHasProp
17ea0 65 72 74 79 28 70 45 2c 20 45 50 5f 46 72 6f 6d  erty(pE, EP_From
17eb0 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  Join) ){.       
17ec0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
17ed0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
17ee0 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
17ef0 73 65 2c 20 70 45 2c 20 63 6f 6e 74 2c 20 53 51  se, pE, cont, SQ
17f00 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29  LITE_JUMPIFNULL)
17f10 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66  ;.      pTerm->f
17f20 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44  lags |= TERM_COD
17f30 45 44 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ED;.    }..    /
17f40 2a 20 46 6f 72 20 61 20 4c 45 46 54 20 4f 55 54  * For a LEFT OUT
17f50 45 52 20 4a 4f 49 4e 2c 20 67 65 6e 65 72 61 74  ER JOIN, generat
17f60 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
17f70 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
17f80 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 61 74 20   that.    ** at 
17f90 6c 65 61 73 74 20 6f 6e 65 20 72 6f 77 20 6f 66  least one row of
17fa0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
17fb0 20 68 61 73 20 6d 61 74 63 68 65 64 20 74 68 65   has matched the
17fc0 20 6c 65 66 74 20 74 61 62 6c 65 2e 20 20 0a 20   left table.  . 
17fd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
17fe0 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20  evel->iLeftJoin 
17ff0 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  ){.      pLevel-
18000 3e 74 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64  >top = sqlite3Vd
18010 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
18020 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18030 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18040 49 6e 74 65 67 65 72 2c 20 31 2c 20 70 4c 65 76  Integer, 1, pLev
18050 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a  el->iLeftJoin);.
18060 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
18070 74 28 28 76 2c 20 22 72 65 63 6f 72 64 20 4c 45  t((v, "record LE
18080 46 54 20 4a 4f 49 4e 20 68 69 74 22 29 29 3b 0a  FT JOIN hit"));.
18090 20 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d        for(pTerm=
180a0 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e  wc.a, j=0; j<wc.
180b0 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72  nTerm; j++, pTer
180c0 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  m++){.        if
180d0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
180e0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
180f0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
18100 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
18110 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  f( (pTerm->prere
18120 71 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29  qAll & notReady)
18130 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
18140 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
18150 70 54 65 72 6d 2d 3e 70 45 78 70 72 20 29 3b 0a  pTerm->pExpr );.
18160 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
18170 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
18180 65 2c 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c  e, pTerm->pExpr,
18190 20 63 6f 6e 74 2c 20 53 51 4c 49 54 45 5f 4a 55   cont, SQLITE_JU
181a0 4d 50 49 46 4e 55 4c 4c 29 3b 0a 20 20 20 20 20  MPIFNULL);.     
181b0 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20     pTerm->flags 
181c0 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20  |= TERM_CODED;. 
181d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
181e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
181f0 54 45 53 54 20 20 2f 2a 20 46 6f 72 20 74 65 73  TEST  /* For tes
18200 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69  ting and debuggi
18210 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20  ng use only */. 
18220 20 2f 2a 20 52 65 63 6f 72 64 20 69 6e 20 74 68   /* Record in th
18230 65 20 71 75 65 72 79 20 70 6c 61 6e 20 69 6e 66  e query plan inf
18240 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
18250 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c 65  he current table
18260 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  .  ** and the in
18270 64 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65  dex used to acce
18280 73 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20  ss it (if any). 
18290 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74   If the table it
182a0 73 65 6c 66 0a 20 20 2a 2a 20 69 73 20 6e 6f 74  self.  ** is not
182b0 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65 20   used, its name 
182c0 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20 49  is just '{}'.  I
182d0 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75 73  f no index is us
182e0 65 64 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  ed.  ** the inde
182f0 78 20 69 73 20 6c 69 73 74 65 64 20 61 73 20 22  x is listed as "
18300 7b 7d 22 2e 20 20 49 66 20 74 68 65 20 70 72 69  {}".  If the pri
18310 6d 61 72 79 20 6b 65 79 20 69 73 20 75 73 65 64  mary key is used
18320 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20   the.  ** index 
18330 6e 61 6d 65 20 69 73 20 27 2a 27 2e 0a 20 20 2a  name is '*'..  *
18340 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
18350 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
18360 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
18370 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
18380 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
18390 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 54 61  o->a[i];.    pTa
183a0 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
183b0 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
183c0 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d 20 70 54 61  om];.    z = pTa
183d0 62 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  bItem->zAlias;. 
183e0 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
183f0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
18400 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 6e 20 3d  ->zName;.    n =
18410 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20   strlen(z);.    
18420 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
18430 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
18440 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
18450 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
18460 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
18470 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  IDX_ONLY ){.    
18480 20 20 20 20 6d 65 6d 63 70 79 28 26 73 71 6c 69      memcpy(&sqli
18490 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
184a0 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22 2c 20 32 29  QPlan], "{}", 2)
184b0 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e  ;.        nQPlan
184c0 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65 6c   += 2;.      }el
184d0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63  se{.        memc
184e0 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
184f0 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
18500 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 6e  z, n);.        n
18510 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20  QPlan += n;.    
18520 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
18530 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
18540 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  lan++] = ' ';.  
18550 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76    }.    if( pLev
18560 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45  el->flags & (WHE
18570 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52  RE_ROWID_EQ|WHER
18580 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29  E_ROWID_RANGE) )
18590 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
185a0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
185b0 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22  an[nQPlan], "* "
185c0 2c 20 32 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  , 2);.      nQPl
185d0 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
185e0 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
185f0 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
18600 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33 5f  memcpy(&sqlite3_
18610 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
18620 6e 5d 2c 20 22 7b 7d 20 22 2c 20 33 29 3b 0a 20  n], "{} ", 3);. 
18630 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33       nQPlan += 3
18640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18650 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c     n = strlen(pL
18660 65 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d  evel->pIdx->zNam
18670 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b  e);.      if( n+
18680 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
18690 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
186a0 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
186b0 20 6d 65 6d 63 70 79 28 26 73 71 6c 69 74 65 33   memcpy(&sqlite3
186c0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
186d0 61 6e 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64  an], pLevel->pId
186e0 78 2d 3e 7a 4e 61 6d 65 2c 20 6e 29 3b 0a 20 20  x->zName, n);.  
186f0 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20        nQPlan += 
18700 6e 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  n;.        sqlit
18710 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
18720 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20  Plan++] = ' ';. 
18730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18740 0a 20 20 77 68 69 6c 65 28 20 6e 51 50 6c 61 6e  .  while( nQPlan
18750 3e 30 20 26 26 20 73 71 6c 69 74 65 33 5f 71 75  >0 && sqlite3_qu
18760 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2d  ery_plan[nQPlan-
18770 31 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 73  1]==' ' ){.    s
18780 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
18790 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  n[--nQPlan] = 0;
187a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 71  .  }.  sqlite3_q
187b0 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
187c0 5d 20 3d 20 30 3b 0a 20 20 6e 51 50 6c 61 6e 20  ] = 0;.  nQPlan 
187d0 3d 20 30 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  = 0;.#endif /* S
187e0 51 4c 49 54 45 5f 54 45 53 54 20 2f 2f 20 54 65  QLITE_TEST // Te
187f0 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
18800 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20 2a 2f 0a  ing use only */.
18810 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65  .  /* Record the
18820 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 61 64   continuation ad
18830 64 72 65 73 73 20 69 6e 20 74 68 65 20 57 68 65  dress in the Whe
18840 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  reInfo structure
18850 2e 20 20 54 68 65 6e 0a 20 20 2a 2a 20 63 6c 65  .  Then.  ** cle
18860 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
18870 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 2d  ..  */.  pWInfo-
18880 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e  >iContinue = con
18890 74 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  t;.  whereClause
188a0 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65  Clear(&wc);.  re
188b0 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 0a 20 20  turn pWInfo;..  
188c0 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
188d0 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
188e0 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3a  whereBeginNoMem:
188f0 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  .  whereClauseCl
18900 65 61 72 28 26 77 63 29 3b 0a 20 20 77 68 65 72  ear(&wc);.  wher
18910 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e 66 6f  eInfoFree(pWInfo
18920 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
18930 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
18940 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
18950 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
18960 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
18970 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
18980 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
18990 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
189a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
189b0 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
189c0 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56  fo *pWInfo){.  V
189d0 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
189e0 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
189f0 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
18a00 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
18a10 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
18a20 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
18a30 62 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 47 65 6e  bList;..  /* Gen
18a40 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69  erate loop termi
18a50 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a  nation code..  *
18a60 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69  /.  for(i=pTabLi
18a70 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30  st->nSrc-1; i>=0
18a80 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76  ; i--){.    pLev
18a90 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b  el = &pWInfo->a[
18aa0 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  i];.    sqlite3V
18ab0 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
18ac0 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29  v, pLevel->cont)
18ad0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
18ae0 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  ->op!=OP_Noop ){
18af0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
18b00 62 65 41 64 64 4f 70 32 28 76 2c 20 70 4c 65 76  beAddOp2(v, pLev
18b10 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
18b20 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
18b30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18b40 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20 20  Level->nIn ){.  
18b50 20 20 20 20 73 74 72 75 63 74 20 49 6e 4c 6f 6f      struct InLoo
18b60 70 20 2a 70 49 6e 3b 0a 20 20 20 20 20 20 69 6e  p *pIn;.      in
18b70 74 20 6a 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t j;.      sqlit
18b80 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
18b90 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6e 78  el(v, pLevel->nx
18ba0 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  t);.      for(j=
18bb0 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2c 20 70 49 6e  pLevel->nIn, pIn
18bc0 3d 26 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  =&pLevel->aInLoo
18bd0 70 5b 6a 2d 31 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d  p[j-1]; j>0; j--
18be0 2c 20 70 49 6e 2d 2d 29 7b 0a 20 20 20 20 20 20  , pIn--){.      
18bf0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18c00 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f  pHere(v, pIn->to
18c10 70 41 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20  pAddr+1);.      
18c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
18c30 4f 70 32 28 76 2c 20 4f 50 5f 4e 65 78 74 2c 20  Op2(v, OP_Next, 
18c40 70 49 6e 2d 3e 69 43 75 72 2c 20 70 49 6e 2d 3e  pIn->iCur, pIn->
18c50 74 6f 70 41 64 64 72 29 3b 0a 20 20 20 20 20 20  topAddr);.      
18c60 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
18c70 70 48 65 72 65 28 76 2c 20 70 49 6e 2d 3e 74 6f  pHere(v, pIn->to
18c80 70 41 64 64 72 2d 31 29 3b 0a 20 20 20 20 20 20  pAddr-1);.      
18c90 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
18ca0 66 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e  free(pLevel->aIn
18cb0 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Loop);.    }.   
18cc0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
18cd0 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76  lveLabel(v, pLev
18ce0 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66  el->brk);.    if
18cf0 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
18d00 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
18d10 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
18d20 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
18d30 64 64 4f 70 31 28 76 2c 20 4f 50 5f 49 66 50 6f  ddOp1(v, OP_IfPo
18d40 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  s, pLevel->iLeft
18d50 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  Join);.      sql
18d60 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
18d70 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
18d80 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
18d90 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69 66 28  rsor);.      if(
18da0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
18db0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  >=0 ){.        s
18dc0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
18dd0 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
18de0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 29  pLevel->iIdxCur)
18df0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18e00 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18e10 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  2(v, OP_Goto, 0,
18e20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20   pLevel->top);. 
18e30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18e40 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
18e50 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
18e60 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
18e70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
18e80 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
18e90 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
18ea0 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
18eb0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
18ec0 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
18ed0 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
18ee0 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
18ef0 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
18f00 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
18f10 65 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  ed by sqlite3Whe
18f20 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20  reBegin..  */.  
18f30 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
18f40 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
18f50 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
18f60 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
18f70 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
18f80 69 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d  item *pTabItem =
18f90 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
18fa0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
18fb0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
18fc0 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
18fd0 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
18fe0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  !=0 );.    if( p
18ff0 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20  Tab->isEphem || 
19000 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20  pTab->pSelect ) 
19010 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
19020 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
19030 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
19040 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
19050 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
19060 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
19070 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
19080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19090 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20  pLevel->pIdx!=0 
190a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
190b0 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50  VdbeAddOp1(v, OP
190c0 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
190d0 69 49 64 78 43 75 72 29 3b 0a 20 20 20 20 7d 0a  iIdxCur);.    }.
190e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
190f0 73 63 61 6e 20 75 73 65 73 20 61 6e 20 69 6e 64  scan uses an ind
19100 65 78 2c 20 6d 61 6b 65 20 63 6f 64 65 20 73 75  ex, make code su
19110 62 73 74 69 74 75 74 69 6f 6e 73 20 74 6f 20 72  bstitutions to r
19120 65 61 64 20 64 61 74 61 0a 20 20 20 20 2a 2a 20  ead data.    ** 
19130 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 20 69  from the index i
19140 6e 20 70 72 65 66 65 72 65 6e 63 65 20 74 6f 20  n preference to 
19150 74 68 65 20 74 61 62 6c 65 2e 20 53 6f 6d 65 74  the table. Somet
19160 69 6d 65 73 2c 20 74 68 69 73 20 6d 65 61 6e 73  imes, this means
19170 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 61 62 6c  .    ** the tabl
19180 65 20 6e 65 65 64 20 6e 65 76 65 72 20 62 65 20  e need never be 
19190 72 65 61 64 20 66 72 6f 6d 2e 20 54 68 69 73 20  read from. This 
191a0 69 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  is a performance
191b0 20 62 6f 6f 73 74 2c 0a 20 20 20 20 2a 2a 20 61   boost,.    ** a
191c0 73 20 74 68 65 20 76 64 62 65 20 6c 65 76 65 6c  s the vdbe level
191d0 20 77 61 69 74 73 20 75 6e 74 69 6c 20 74 68 65   waits until the
191e0 20 74 61 62 6c 65 20 69 73 20 72 65 61 64 20 62   table is read b
191f0 65 66 6f 72 65 20 61 63 74 75 61 6c 6c 79 0a 20  efore actually. 
19200 20 20 20 2a 2a 20 73 65 65 6b 69 6e 67 20 74 68     ** seeking th
19210 65 20 74 61 62 6c 65 20 63 75 72 73 6f 72 20 74  e table cursor t
19220 6f 20 74 68 65 20 72 65 63 6f 72 64 20 63 6f 72  o the record cor
19230 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
19240 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
19250 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74 68 65   position in the
19260 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a 20 0a   index..    ** .
19270 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
19280 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
19290 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
192a0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
192b0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
192c0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
192d0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
192e0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
192f0 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
19300 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
19310 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
19320 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
19330 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
19340 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
19350 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
19360 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
19370 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
19380 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
19390 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
193a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
193b0 4c 65 76 65 6c 2d 3e 70 49 64 78 20 29 7b 0a 20  Level->pIdx ){. 
193c0 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c       int k, j, l
193d0 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65 4f  ast;.      VdbeO
193e0 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49 6e  p *pOp;.      In
193f0 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76  dex *pIdx = pLev
19400 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 20 20  el->pIdx;.      
19410 69 6e 74 20 75 73 65 49 6e 64 65 78 4f 6e 6c 79  int useIndexOnly
19420 20 3d 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73   = pLevel->flags
19430 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
19440 59 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  Y;..      assert
19450 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20  ( pIdx!=0 );.   
19460 20 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33     pOp = sqlite3
19470 56 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49  VdbeGetOp(v, pWI
19480 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20  nfo->iTop);.    
19490 20 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33    last = sqlite3
194a0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
194b0 76 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d  v);.      for(k=
194c0 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 6b 3c  pWInfo->iTop; k<
194d0 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f 70 2b 2b  last; k++, pOp++
194e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
194f0 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e  Op->p1!=pLevel->
19500 69 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e  iTabCur ) contin
19510 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ue;.        if( 
19520 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
19530 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20  Column ){.      
19540 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
19550 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b  Idx->nColumn; j+
19560 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
19570 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64  if( pOp->p2==pId
19580 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29  x->aiColumn[j] )
19590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
195a0 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20  pOp->p2 = j;.   
195b0 20 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e             pOp->
195c0 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  p1 = pLevel->iId
195d0 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20  xCur;.          
195e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
195f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
19600 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
19610 73 73 65 72 74 28 21 75 73 65 49 6e 64 65 78 4f  ssert(!useIndexO
19620 6e 6c 79 20 7c 7c 20 6a 3c 70 49 64 78 2d 3e 6e  nly || j<pIdx->n
19630 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20  Column);.       
19640 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
19650 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
19660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
19670 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
19680 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
19690 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
196a0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
196b0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
196c0 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
196d0 4e 75 6c 6c 52 6f 77 20 26 26 20 75 73 65 49 6e  NullRow && useIn
196e0 64 65 78 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  dexOnly ){.     
196f0 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
19700 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
19710 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
19720 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
19730 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
19740 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
19750 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
19760 72 6e 3b 0a 7d 0a                                rn;.}.