/ Hex Artifact Content
Login

Artifact a5d5cec9b57fc35e24a538c677bd7607e4aa5d43:


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 32 37   where.c,v 1.227
0340: 20 32 30 30 36 2f 30 36 2f 32 37 20 31 32 3a 31   2006/06/27 12:1
0350: 36 3a 35 36 20 64 61 6e 69 65 6c 6b 31 39 37 37  6:56 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 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
0400: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
0410: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 2e 0a 2a  s in an array..*
0420: 2f 0a 23 64 65 66 69 6e 65 20 41 52 52 41 59 53  /.#define ARRAYS
0430: 49 5a 45 28 58 29 20 20 28 73 69 7a 65 6f 66 28  IZE(X)  (sizeof(
0440: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
0450: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0460: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0470: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0480: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0490: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
04a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 65  .int sqlite3_whe
04b0: 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23 20  re_trace = 0;.# 
04c0: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 20  define TRACE(X) 
04d0: 20 69 66 28 73 71 6c 69 74 65 33 5f 77 68 65 72   if(sqlite3_wher
04e0: 65 5f 74 72 61 63 65 29 20 73 71 6c 69 74 65 33  e_trace) sqlite3
04f0: 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65  DebugPrintf X.#e
0500: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41  lse.# define TRA
0510: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0520: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0530: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0540: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0550: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 0a 2f   WhereClause;../
0560: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0570: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0580: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0590: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
05a0: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
05b0: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
05c0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05e0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05f0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
0600: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
0610: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
0620: 68 65 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f  hers by an AND o
0630: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41  perator..**.** A
0640: 6c 6c 20 57 68 65 72 65 54 65 72 6d 73 20 61 72  ll WhereTerms ar
0650: 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  e collected into
0660: 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43   a single WhereC
0670: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
0680: 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77    .** The follow
0690: 69 6e 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c  ing identity hol
06a0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ds:.**.**       
06b0: 20 57 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e   WhereTerm.pWC->
06c0: 61 5b 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d  a[WhereTerm.idx]
06d0: 20 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a   == WhereTerm.**
06e0: 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20  .** When a term 
06f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
0700: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
0710: 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e     X <op> <expr>
0720: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  .**.** where X i
0730: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  s a column name 
0740: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
0750: 6f 66 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61  of certain opera
0760: 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68  tors,.** then Wh
0770: 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73  ereTerm.leftCurs
0780: 6f 72 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d  or and WhereTerm
0790: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f  .leftColumn reco
07a0: 72 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  rd the.** cursor
07b0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75   number and colu
07c0: 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  mn number for X.
07d0: 20 20 57 68 65 72 65 54 65 72 6d 2e 6f 70 65 72    WhereTerm.oper
07e0: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
07f0: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
0800: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
0810: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
0820: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
0830: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
0840: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
0850: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
0860: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
0870: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
0880: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
0890: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
08a0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
08b0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72  tors..**.** prer
08c0: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
08d0: 65 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74  eqAll record set
08e0: 73 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62  s of cursor numb
08f0: 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79  ers,.** but they
0900: 20 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c   do so indirectl
0910: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 45 78 70  y.  A single Exp
0920: 72 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  rMaskSet structu
0930: 72 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a  re translates.**
0940: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
0950: 6e 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65  nto bits and the
0960: 20 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20   translated bit 
0970: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
0980: 20 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64   prereq.** field
0990: 73 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74  s.  The translat
09a0: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f  ion is used in o
09b0: 72 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65  rder to maximize
09c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
09d0: 2a 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c  * bits that will
09e0: 20 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73   fit in a Bitmas
09f0: 6b 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72  k.  The VDBE cur
0a00: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
0a10: 74 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f  t be.** spread o
0a20: 75 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d  ut over the non-
0a30: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
0a40: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  s.  For example,
0a50: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e   the cursor.** n
0a60: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20  umbers might be 
0a70: 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c  3, 8, 9, 10, 20,
0a80: 20 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e   23, 41, and 45.
0a90: 20 20 54 68 65 20 45 78 70 72 4d 61 73 6b 53 65    The ExprMaskSe
0aa0: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
0ab0: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
0ac0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
0ad0: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
0ae0: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
0af0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
0b00: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
0b10: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
0b20: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
0b30: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
0b40: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
0b50: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
0b60: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
0b70: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
0b80: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
0b90: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
0ba0: 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  gh 7..*/.typedef
0bb0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0bc0: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0bd0: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0be0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0c00: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0c10: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
0c20: 31 36 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  16 iParent;     
0c30: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0c40: 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74  e pWC->a[iParent
0c50: 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d  ] when this term
0c60: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69   disabled */.  i
0c70: 31 36 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20  16 leftCursor;  
0c80: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
0c90: 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20   number of X in 
0ca0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
0cb0: 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 6f 6c  */.  i16 leftCol
0cc0: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
0cd0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
0ce0: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
0cf0: 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65  xpr>" */.  u16 e
0d00: 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20  Operator;       
0d10: 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61     /* A WO_xx va
0d20: 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c  lue describing <
0d30: 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  op> */.  u8 flag
0d40: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
0d50: 20 2f 2a 20 42 69 74 20 66 6c 61 67 73 2e 20 20   /* Bit flags.  
0d60: 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75  See below */.  u
0d70: 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  8 nChild;       
0d80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d90: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61   of children tha
0da0: 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75  t must disable u
0db0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
0dc0: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
0dd0: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
0de0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
0df0: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
0e00: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
0e10: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
0e20: 6c 65 73 20 75 73 65 64 20 62 79 20 70 52 69 67  les used by pRig
0e30: 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ht */.  Bitmask 
0e40: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
0e50: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0e60: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0e70: 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  by p */.};../*.*
0e80: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0e90: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 66 6c   of WhereTerm.fl
0ea0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
0eb0: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
0ec0: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
0ed0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
0ee0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 20 2a  rDelete(pExpr) *
0ef0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
0f00: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
0f10: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
0f20: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
0f30: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
0f40: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
0f50: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
0f60: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
0f70: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
0f80: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
0f90: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
0fa0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
0fb0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
0fc0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 55       0x10   /* U
0fd0: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
0fe0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
0ff0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
1000: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1010: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1020: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
1030: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
1040: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
1050: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1060: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1070: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1080: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63  eTerms..*/.struc
1090: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a  t WhereClause {.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
10b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10c0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1100: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  s */.  int nSlot
1110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1130: 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  ries in a[] */. 
1140: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20   WhereTerm *a;  
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
1160: 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20  h a[] describes 
1170: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  a term of the WH
1180: 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20  ERE cluase */.  
1190: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
11a0: 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74  c[10];   /* Init
11b0: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
11c0: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a   for a[] */.};..
11d0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
11e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
11f0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1200: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
1210: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
1220: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1230: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
1240: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
1250: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
1260: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1270: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
1280: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
1290: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
12a0: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
12b0: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
12c0: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
12d0: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
12e0: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
12f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
1300: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
1310: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
1320: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
1330: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
1340: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
1350: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
1360: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
1370: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
1380: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
1390: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
13a0: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
13b0: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
13c0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
13d0: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
13e0: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
13f0: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
1400: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78  h 0..**.** If Ex
1410: 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d  prMaskSet.ix[A]=
1420: 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =B it means that
1430: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
1440: 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f   a Bitmask.** co
1450: 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63  rresponds VDBE c
1460: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20  ursor number B. 
1470: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
1480: 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c   a bitmask is 1<
1490: 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  <A..**.** For ex
14a0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48  ample, if the WH
14b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
14c0: 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65  ssion used these
14d0: 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73   VDBE.** cursors
14e0: 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20  :  4, 5, 8, 29, 
14f0: 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68  57, 73.  Then th
1500: 65 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 73  e  ExprMaskSet s
1510: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1520: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1530: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1540: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1550: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1560: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1570: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1580: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1590: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
15a0: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
15b0: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
15c0: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
15d0: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
15e0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
15f0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1600: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1610: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1620: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1630: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1640: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1650: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1660: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1670: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1680: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1690: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
16a0: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
16b0: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 74  ** no gaps..*/.t
16c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78  ypedef struct Ex
16d0: 70 72 4d 61 73 6b 53 65 74 20 45 78 70 72 4d 61  prMaskSet ExprMa
16e0: 73 6b 53 65 74 3b 0a 73 74 72 75 63 74 20 45 78  skSet;.struct Ex
16f0: 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e  prMaskSet {.  in
1700: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1720: 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65  umber of assigne
1730: 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20  d cursor values 
1740: 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a 65  */.  int ix[size
1750: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20  of(Bitmask)*8]; 
1760: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73     /* Cursor ass
1770: 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69  igned to each bi
1780: 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  t */.};.../*.** 
1790: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
17a0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
17b0: 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65  indices are able
17c0: 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e   to exploit.  An
17d0: 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e  .** OR-ed combin
17e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76  ation of these v
17f0: 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65  alues can be use
1800: 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67  d when searching
1810: 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e   for.** terms in
1820: 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
1830: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  e..*/.#define WO
1840: 5f 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69 6e  _IN     1.#defin
1850: 65 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23 64  e WO_EQ     2.#d
1860: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
1870: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
1880: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
1890: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
18a0: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
18b0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
18c0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
18d0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
18e0: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
18f0: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
1900: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
1910: 43 48 20 20 36 34 0a 0a 2f 2a 0a 2a 2a 20 56 61  CH  64../*.** Va
1920: 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20 72 65  lue for flags re
1930: 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e  turned by bestIn
1940: 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  dex().*/.#define
1950: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
1960: 20 20 20 20 20 20 30 78 30 30 30 31 20 20 20 2f        0x0001   /
1970: 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  * rowid=EXPR or 
1980: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a  rowid IN (...) *
1990: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
19a0: 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 20 20 30  ROWID_RANGE    0
19b0: 78 30 30 30 32 20 20 20 2f 2a 20 72 6f 77 69 64  x0002   /* rowid
19c0: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77  <EXPR and/or row
19d0: 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69  id>EXPR */.#defi
19e0: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
19f0: 45 51 20 20 20 20 20 20 30 78 30 30 31 30 20 20  EQ      0x0010  
1a00: 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20   /* x=EXPR or x 
1a10: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1a20: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
1a30: 5f 52 41 4e 47 45 20 20 20 30 78 30 30 32 30 20  _RANGE   0x0020 
1a40: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
1a50: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
1a60: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1a70: 4e 5f 49 4e 20 20 20 20 20 20 30 78 30 30 34 30  N_IN      0x0040
1a80: 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29     /* x IN (...)
1a90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1aa0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 20  E_TOP_LIMIT     
1ab0: 20 30 78 30 31 30 30 20 20 20 2f 2a 20 78 3c 45   0x0100   /* x<E
1ac0: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
1ad0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
1ae0: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
1af0: 49 4d 49 54 20 20 20 20 20 20 30 78 30 32 30 30  IMIT      0x0200
1b00: 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20     /* x>EXPR or 
1b10: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
1b20: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
1b30: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20  ERE_IDX_ONLY    
1b40: 20 20 20 30 78 30 38 30 30 20 20 20 2f 2a 20 55     0x0800   /* U
1b50: 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20  se index only - 
1b60: 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64  omit table */.#d
1b70: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45  efine WHERE_ORDE
1b80: 52 42 59 20 20 20 20 20 20 20 20 30 78 31 30 30  RBY        0x100
1b90: 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 77 69  0   /* Output wi
1ba0: 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63 6f 72  ll appear in cor
1bb0: 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23 64  rect order */.#d
1bc0: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45 56 45  efine WHERE_REVE
1bd0: 52 53 45 20 20 20 20 20 20 20 20 30 78 32 30 30  RSE        0x200
1be0: 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72  0   /* Scan in r
1bf0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1c00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e  #define WHERE_UN
1c10: 49 51 55 45 20 20 20 20 20 20 20 20 20 30 78 34  IQUE         0x4
1c20: 30 30 30 20 20 20 2f 2a 20 53 65 6c 65 63 74 73  000   /* Selects
1c30: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1c40: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
1c50: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1c60: 42 4c 45 20 20 20 30 78 38 30 30 30 20 20 20 2f  BLE   0x8000   /
1c70: 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61  * Use virtual-ta
1c80: 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ble processing *
1c90: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
1ca0: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
1cb0: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
1cc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1cd0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
1ce0: 61 75 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c  auseInit(WhereCl
1cf0: 61 75 73 65 20 2a 70 57 43 2c 20 50 61 72 73 65  ause *pWC, Parse
1d00: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 57 43   *pParse){.  pWC
1d10: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
1d20: 65 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  e;.  pWC->nTerm 
1d30: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
1d40: 74 20 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57  t = ARRAYSIZE(pW
1d50: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
1d60: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
1d70: 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  atic;.}../*.** D
1d80: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
1d90: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1da0: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
1db0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
1dc0: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
1dd0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
1de0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
1df0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
1e00: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
1e10: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
1e20: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
1e30: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
1e40: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
1e50: 20 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43   *a;.  for(i=pWC
1e60: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
1e70: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
1e80: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
1e90: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
1ea0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
1eb0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ec0: 28 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  (a->pExpr);.    
1ed0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d  }.  }.  if( pWC-
1ee0: 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  >a!=pWC->aStatic
1ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1f00: 65 65 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  ee(pWC->a);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
1f20: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
1f30: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1f40: 72 75 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61  ructure.  Increa
1f50: 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  se the allocated
1f60: 0a 2a 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63  .** space as nec
1f70: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 57 41  essary..**.** WA
1f80: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
1f90: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
1fa0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
1fb0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
1fc0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
1fd0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
1fe0: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
1ff0: 62 65 20 69 6e 76 61 6c 69 64 65 64 20 61 66 74  be invalided aft
2000: 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  er.** calling th
2010: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63  is routine.  Suc
2020: 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62  h pointers may b
2030: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  e reinitialized 
2040: 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  by referencing.*
2050: 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  * the pWC->a[] a
2060: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
2070: 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49  int whereClauseI
2080: 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73  nsert(WhereClaus
2090: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c  e *pWC, Expr *p,
20a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 57   int flags){.  W
20b0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
20c0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
20d0: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57  ( pWC->nTerm>=pW
20e0: 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20  C->nSlot ){.    
20f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20  WhereTerm *pOld 
2100: 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57  = pWC->a;.    pW
2110: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  C->a = sqliteMal
2120: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 57 43 2d  loc( sizeof(pWC-
2130: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
2140: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
2150: 57 43 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72  WC->a==0 ) retur
2160: 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  n 0;.    memcpy(
2170: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
2180: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
2190: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
21a0: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
21b0: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
21c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 6c 64   sqliteFree(pOld
21d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
21e0: 2d 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20  ->nSlot *= 2;.  
21f0: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
2200: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
2210: 54 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54  Term];.  pWC->nT
2220: 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e  erm++;.  pTerm->
2230: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
2240: 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  rm->flags = flag
2250: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
2260: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
2270: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
2280: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
2290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22a0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
22b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
22c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22d0: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
22e0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
22f0: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
2300: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
2310: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
2320: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
2330: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
2340: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
2350: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2360: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
2370: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
2380: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
2390: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
23a0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
23b0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
23c0: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
23d0: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
23e0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
23f0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
2400: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
2410: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
2420: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
2430: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
2440: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2450: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
2460: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
2470: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
2480: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
2490: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
24a0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
24b0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
24c0: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
24d0: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
24e0: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
24f0: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
2500: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
2510: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
2520: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
2530: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
2540: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
2550: 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 61  ] array.  This a
2560: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
2570: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
2580: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
2590: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b0: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
25c0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
25d0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
25e0: 70 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  p){.  if( pExpr=
25f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2600: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  f( pExpr->op!=op
2610: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
2620: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
2630: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Expr, 0);.  }els
2640: 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  e{.    whereSpli
2650: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c  t(pWC, pExpr->pL
2660: 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68  eft, op);.    wh
2670: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
2680: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29  xpr->pRight, op)
2690: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
26a0: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70  nitialize an exp
26b0: 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
26c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
26d0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
26e0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
26f0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
2700: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
2710: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
2720: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
2730: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
2740: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
2750: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
2760: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
2770: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2780: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
2790: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
27a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
27b0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
27c0: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
27d0: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
27e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27f0: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
2800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2810: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2820: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
2830: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
2840: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
2850: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
2860: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2870: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2880: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2890: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
28a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
28b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
28c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
28d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
28f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2900: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
2910: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
2920: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
2930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
2940: 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b  ateMask(ExprMask
2950: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
2960: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2970: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2980: 3e 6e 20 3c 20 41 52 52 41 59 53 49 5a 45 28 70  >n < ARRAYSIZE(p
2990: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
29a0: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
29b0: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
29c0: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
29d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
29e0: 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c  alks (recursivel
29f0: 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  y) an expression
2a00: 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61   tree and genera
2a10: 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  tes.** a bitmask
2a20: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
2a30: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
2a40: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
2a50: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a  sion.** tree..**
2a60: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
2a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2a80: 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69   work, the calli
2a90: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
2aa0: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
2ab0: 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69  sly invoked sqli
2ac0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
2ad0: 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70  mes() on the exp
2ae0: 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a  ression.  See.**
2af0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
2b00: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
2b10: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
2b20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2b30: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
2b40: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
2b50: 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20   routines looks 
2b60: 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  for column names
2b70: 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65   and.** sets the
2b80: 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b  ir opcodes to TK
2b90: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69  _COLUMN and thei
2ba0: 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  r Expr.iTable fi
2bb0: 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56  elds to.** the V
2bc0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2bd0: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  r of the table. 
2be0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2bf0: 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61  st has to.** tra
2c00: 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f  nslate the curso
2c10: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
2c20: 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e  itmask values an
2c30: 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  d OR all.** the 
2c40: 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65  bitmasks togethe
2c50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  r..*/.static Bit
2c60: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
2c70: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
2c80: 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  Set*, ExprList*)
2c90: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
2ca0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2cb0: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2cc0: 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74  t*, Select*);.st
2cd0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2ce0: 72 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72  rTableUsage(Expr
2cf0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2d00: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2d10: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2d20: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2d30: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
2d40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2d50: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
2d60: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2d70: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2d80: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2d90: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2db0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2dc0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2de0: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61   p->pLeft);.  ma
2df0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
2e00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2e10: 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  t, p->pList);.  
2e20: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
2e30: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
2e40: 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63  skSet, p->pSelec
2e50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73  t);.  return mas
2e60: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2e70: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
2e80: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
2e90: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2ea0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2eb0: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2ec0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2ed0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2ee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
2ef0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2f00: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
2f10: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2f20: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
2f30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2f50: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2f60: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2f70: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
2f80: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2f90: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
2fa0: 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69  itmask mask;.  i
2fb0: 66 28 20 70 53 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pS==0 ){.    
2fc0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  mask = 0;.  }els
2fd0: 65 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 65 78  e{.    mask = ex
2fe0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2ff0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
3000: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
3010: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3020: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3030: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
3040: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3050: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3060: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
3070: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
3080: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
3090: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
30a0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
30b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
30c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
30d0: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d  S->pHaving);.  }
30e0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3100: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
3110: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
3120: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
3130: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
3140: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
3150: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
3160: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
3170: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
3180: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
3190: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
31a0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
31b0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
31c0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
31d0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
31e0: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
31f0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3200: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
3210: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
3220: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
3230: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
3240: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3250: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
3260: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
3270: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
3280: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
3290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
32a0: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
32b0: 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ype T..*/.#defin
32c0: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
32d0: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
32e0: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
32f0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
3300: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45  ion operator.  E
3310: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
3320: 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a  e form "X op Y".
3330: 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ** are converted
3340: 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a   into "Y op X"..
3350: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
3360: 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20  xprCommute(Expr 
3370: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
3380: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
3390: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
33a0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
33b0: 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70   SWAP(CollSeq*,p
33c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
33d0: 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  oll,pExpr->pLeft
33e0: 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50  ->pColl);.  SWAP
33f0: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3400: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3410: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3420: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3430: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3440: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3450: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3460: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
3470: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
3480: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
3490: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
34a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
34b0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
34c0: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
34d0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
34e0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
34f0: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3500: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3510: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3520: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3530: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3540: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72  .static int oper
3550: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3560: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73  {.  int c;.  ass
3570: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
3580: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
3590: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
35a0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b   WO_IN;.  }else{
35b0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c  .    c = WO_EQ<<
35c0: 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a  (op-TK_EQ);.  }.
35d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
35e0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
35f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3600: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
3610: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
3620: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
3630: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
3640: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
3650: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
3660: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
3670: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
3680: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3690: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
36a0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
36b0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
36c0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
36d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
36e0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
36f0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3700: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
3710: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
3720: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
3730: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
3740: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
3750: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
3760: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
3770: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
3780: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
3790: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37a0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
37b0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
37c0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
37d0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
37e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
37f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
3800: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
3810: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
3820: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
3830: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3840: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3850: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
3860: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
3870: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
3880: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
3890: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
38a0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
38b0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
38c0: 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20   */.  u16 op,   
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
38e0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
38f0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
3900: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
3910: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
3920: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
3930: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
3940: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
3950: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
3960: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
3970: 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70    int k;.  for(p
3980: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
3990: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
39a0: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
39b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
39c0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
39d0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
39e0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
39f0: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
3a00: 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43   && pTerm->leftC
3a10: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
3a20: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
3a30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29  >eOperator & op)
3a40: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
3a50: 20 69 66 28 20 69 43 75 72 3e 3d 30 20 26 26 20   if( iCur>=0 && 
3a60: 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
3a70: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
3a80: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
3a90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
3aa0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
3ab0: 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e  xaff;.        in
3ac0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72  t j;.        Par
3ad0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3ae0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20  ->pParse;..     
3af0: 20 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78     idxaff = pIdx
3b00: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
3b10: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
3b20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
3b30: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
3b40: 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66  ityOk(pX, idxaff
3b50: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3b60: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
3b70: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
3b80: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
3b90: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
3ba0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
3bb0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 52 69       if( pX->pRi
3bc0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ght ){.         
3bd0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3be0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
3bf0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
3c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
3c10: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
3c20: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
3c30: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
3c40: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
3c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3c70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
3c80: 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78  >nColumn && pIdx
3c90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
3ca0: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20  Column; j++){}. 
3cb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
3cc0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
3cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
3ce0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
3cf0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
3d00: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
3d10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
3d20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65        return pTe
3d30: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rm;.    }.  }.  
3d40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
3d50: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
3d60: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
3d70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63   exprAnalyze(Src
3d80: 4c 69 73 74 2a 2c 20 45 78 70 72 4d 61 73 6b 53  List*, ExprMaskS
3d90: 65 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  et*, WhereClause
3da0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3db0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
3dc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
3dd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
3de0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
3df0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
3e00: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
3e10: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
3e20: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
3e30: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
3e40: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
3e50: 2c 20 20 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73  ,   /* table mas
3e60: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
3e70: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
3e80: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
3e90: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
3ea0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
3eb0: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
3ec0: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
3ed0: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
3ee0: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
3ef0: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 29  MaskSet, pWC, i)
3f00: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
3f20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
3f30: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
3f40: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
3f50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
3f60: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
3f70: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
3f80: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
3f90: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
3fa0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
3fb0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
3fc0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
3fd0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
3fe0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
3ff0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
4000: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
4010: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
4020: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
4030: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
4040: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
4050: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
4060: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
4070: 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ob(.  sqlite3 *d
4080: 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b,      /* The d
4090: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78 70  atabase */.  Exp
40a0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
40b0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
40c0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
40d0: 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a  *pnPattern,   /*
40e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
40f0: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
4100: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69  haracters */.  i
4110: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20  nt *pisComplete 
4120: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4130: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
4140: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
4150: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
4160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4170: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
4180: 2a 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c 69  *pLeft;.  ExprLi
4190: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  st *pList;.  int
41a0: 20 63 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 6e   c, cnt;.  int n
41b0: 6f 43 61 73 65 3b 0a 20 20 63 68 61 72 20 77 63  oCase;.  char wc
41c0: 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  [3];.  CollSeq *
41d0: 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21 73  pColl;..  if( !s
41e0: 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63  qlite3IsLikeFunc
41f0: 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20  tion(db, pExpr, 
4200: 26 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a  &noCase, wc) ){.
4210: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4220: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
4230: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67  r->pList;.  pRig
4240: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
4250: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52  .pExpr;.  if( pR
4260: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ight->op!=TK_STR
4270: 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ING ){.    retur
4280: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74  n 0;.  }.  pLeft
4290: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70   = pList->a[1].p
42a0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
42b0: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
42c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
42d0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
42e0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pLeft->pColl;.  
42f0: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  if( pColl==0 ){.
4300: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
4310: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20  pDfltColl;.  }. 
4320: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70   if( (pColl->typ
4330: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  e!=SQLITE_COLL_B
4340: 49 4e 41 52 59 20 7c 7c 20 6e 6f 43 61 73 65 29  INARY || noCase)
4350: 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c   &&.      (pColl
4360: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4370: 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 6e  OLL_NOCASE || !n
4380: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65  oCase) ){.    re
4390: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
43a0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
43b0: 28 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d 20  (pRight);.  z = 
43c0: 28 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d 3e  (char *)pRight->
43d0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f 72 28 63  token.z;.  for(c
43e0: 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e 74 5d 29  nt=0; (c=z[cnt])
43f0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
4400: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
4410: 21 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b 2b 29 7b  !=wc[2]; cnt++){
4420: 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c  }.  if( cnt==0 |
4430: 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74  | 255==(u8)z[cnt
4440: 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ] ){.    return 
4450: 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d  0;.  }.  *pisCom
4460: 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d  plete = z[cnt]==
4470: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
4480: 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65  ]==0;.  *pnPatte
4490: 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75  rn = cnt;.  retu
44a0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
44b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
44c0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
44d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  */../*.** Check 
44e0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
44f0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
4500: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
4510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
4520: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
4530: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
4540: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
4550: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
4560: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
4570: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
4580: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
4590: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
45a0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
45b0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
45c0: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
45d0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
45e0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
45f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
4600: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
4610: 21 3d 35 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  !=5 || sqlite3St
4620: 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
4630: 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29  ken.z,"match",5)
4640: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
4650: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
4660: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
4670: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
4680: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
4690: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
46a0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
46b0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
46c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
46d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
46e0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
46f0: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
4700: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
4710: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
4720: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
4730: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
4740: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
4750: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
4760: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4780: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
4790: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
47a0: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
47b0: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
47c0: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
47d0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
47e0: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
47f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
4800: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
4810: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 0a 2f  JoinTable;.}.../
4820: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
4830: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
4840: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
4850: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
4860: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
4870: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
4880: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
4890: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
48a0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
48b0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
48c0: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
48d0: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
48e0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
48f0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
4900: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
4910: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
4920: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
4930: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
4940: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
4950: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
4960: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
4970: 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  >".  If the expr
4980: 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20  ession is of.** 
4990: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
49a0: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
49b0: 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d   and Y are colum
49c0: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
49d0: 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73  ginal.** express
49e0: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
49f0: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
4a00: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  al expression of
4a10: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4a20: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
4a30: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
4a40: 61 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65  ause and analyze
4a50: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  d separately..*/
4a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4a70: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
4a80: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
4a90: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
4aa0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  M clause */.  Ex
4ab0: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
4ac0: 53 65 74 2c 20 20 20 20 2f 2a 20 74 61 62 6c 65  Set,    /* table
4ad0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72   masks */.  Wher
4ae0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4af0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
4b00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
4b10: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
4b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
4b30: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
4b40: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
4b50: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
4b60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
4b70: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70 72  idxTerm];.  Expr
4b80: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
4b90: 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61 73  >pExpr;.  Bitmas
4ba0: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  k prereqLeft;.  
4bb0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
4bc0: 6c 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  l;.  int nPatter
4bd0: 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  n;.  int isCompl
4be0: 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  ete;..  if( sqli
4bf0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
4c00: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72  ) ) return;.  pr
4c10: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
4c20: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4c30: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
4c40: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
4c50: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
4c60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4c70: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
4c80: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
4c90: 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ght = exprListTa
4ca0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4cb0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  t, pExpr->pList)
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4cd0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70             | exp
4ce0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4cf0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
4d00: 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  r->pSelect);.  }
4d10: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
4d20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
4d30: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4d40: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
4d50: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
4d60: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
4d70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4d80: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
4d90: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4da0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
4db0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 72 65 72  oin) ){.    prer
4dc0: 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73 6b  eqAll |= getMask
4dd0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4de0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
4df0: 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d  e);.  }.  pTerm-
4e00: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
4e10: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
4e20: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
4e30: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
4e40: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
4e50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
4e60: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
4e70: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28  (pExpr->op) && (
4e80: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4e90: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
4eb0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4ec0: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
4ed0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
4ee0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
4ef0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
4f00: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
4f10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4f20: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
4f30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  ;.      pTerm->l
4f40: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
4f50: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
4f60: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
4f70: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
4f80: 6b 28 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20  k(pExpr->op);.  
4f90: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
4fa0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
4fb0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
4fc0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
4fd0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
4fe0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
4ff0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
5000: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
5010: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
5020: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
5030: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
5040: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  r);.        idxN
5050: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
5060: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
5070: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
5080: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
5090: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
50a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
50b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
50c0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
50d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
50e0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
50f0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
5100: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
5110: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
5120: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
5130: 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
5140: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
5150: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5160: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
5170: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
5180: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
5190: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
51a0: 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ute(pDup);.     
51b0: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
51c0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
51d0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
51e0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
51f0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f      pNew->leftCo
5200: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
5210: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
5220: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
5230: 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20   prereqLeft;.   
5240: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
5250: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
5260: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
5270: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
5280: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a  Mask(pDup->op);.
5290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
52a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
52b0: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
52c0: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
52d0: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
52e0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
52f0: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
5300: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
5310: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
5320: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
5330: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
5340: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
5350: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
5360: 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78  ETWEEN ){.    Ex
5370: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5380: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
5390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
53a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
53b0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
53c0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
53d0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
53e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
53f0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
5400: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
5410: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
5420: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
5430: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
5440: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
5450: 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c  ite3Expr(ops[i],
5460: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5470: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20  pExpr->pLeft),. 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
54a0: 74 65 33 45 78 70 72 44 75 70 28 70 4c 69 73 74  te3ExprDup(pList
54b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30  ->a[i].pExpr), 0
54c0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
54d0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
54e0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
54f0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
5500: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
5510: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
5520: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
5530: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
5540: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
5550: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
5560: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5570: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
5580: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
5590: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
55a0: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
55b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
55c0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
55d0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
55e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
55f0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
5600: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5610: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5620: 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  Y).  /* Attempt 
5630: 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f  to convert OR-co
5640: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e  nnected terms in
5650: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
5660: 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74  r so that.  ** t
5670: 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65  hey can make use
5680: 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 45 78   of indices.  Ex
5690: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
56a0: 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20        x = expr1 
56b0: 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20   OR  expr2 = x  
56c0: 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 20 20  OR  x = expr3.  
56d0: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
56e0: 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 0a 20  rted into.  **. 
56f0: 20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65   **      x IN (e
5700: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
5710: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ).  **.  ** This
5720: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75   optimization mu
5730: 73 74 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66  st be omitted if
5740: 20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 69   OMIT_SUBQUERY i
5750: 73 20 64 65 66 69 6e 65 64 20 62 65 63 61 75 73  s defined becaus
5760: 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 69  e.  ** the compi
5770: 6c 65 72 20 66 6f 72 20 74 68 65 20 74 68 65 20  ler for the the 
5780: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 70  IN operator is p
5790: 61 72 74 20 6f 66 20 73 75 62 2d 71 75 65 72 69  art of sub-queri
57a0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  es..  */.  else 
57b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
57c0: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20  K_OR ){.    int 
57d0: 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  ok;.    int i, j
57e0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  ;.    int iColum
57f0: 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  n, iCursor;.    
5800: 57 68 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b  WhereClause sOr;
5810: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
5820: 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73  pOrTerm;..    as
5830: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
5840: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
5850: 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68  IC)==0 );.    wh
5860: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73  ereClauseInit(&s
5870: 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 29  Or, pWC->pParse)
5880: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
5890: 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b  (&sOr, pExpr, TK
58a0: 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  _OR);.    exprAn
58b0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
58c0: 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a  MaskSet, &sOr);.
58d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e      assert( sOr.
58e0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a  nTerm>0 );.    j
58f0: 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 0;.    do{.  
5900: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f      iColumn = sO
5910: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d  r.a[j].leftColum
5920: 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72  n;.      iCursor
5930: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
5940: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b  Cursor;.      ok
5950: 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20   = iCursor>=0;. 
5960: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
5970: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
5980: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
5990: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
59a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
59b0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
59c0: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
59d0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e         goto or_n
59e0: 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20  ot_possible;.   
59f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5a00: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
5a10: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
5a20: 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  && pOrTerm->left
5a30: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
5a40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
5a50: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
5a60: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
5a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
5a80: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5a90: 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c  ERM_COPIED)!=0 |
5aa0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
5ab0: 20 20 20 20 20 20 28 28 70 4f 72 54 65 72 6d 2d        ((pOrTerm-
5ac0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  >flags & TERM_VI
5ad0: 52 54 55 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  RTUAL)!=0 &&.   
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d    (sOr.a[pOrTerm
5b00: 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73  ->iParent].flags
5b10: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d   & TERM_OR_OK)!=
5b20: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
5b30: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5b40: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
5b50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5b60: 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a          ok = 0;.
5b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b80: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f  }.    }while( !o
5b90: 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d  k && (sOr.a[j++]
5ba0: 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  .flags & TERM_CO
5bb0: 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f  PIED)!=0 && j<sO
5bc0: 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  r.nTerm );.    i
5bd0: 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45  f( ok ){.      E
5be0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5bf0: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
5c00: 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20  pNew, *pDup;.   
5c10: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
5c20: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
5c30: 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b  r.a; i>=0 && ok;
5c40: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
5c50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
5c60: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  OrTerm->flags & 
5c70: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
5c80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5c90: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
5ca0: 33 45 78 70 72 44 75 70 28 70 4f 72 54 65 72 6d  3ExprDup(pOrTerm
5cb0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
5cc0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
5cd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ce0: 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 70  tAppend(pList, p
5cf0: 44 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Dup, 0);.      }
5d00: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
5d10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c  lite3Expr(TK_COL
5d20: 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  UMN, 0, 0, 0);. 
5d30: 20 20 20 20 20 69 66 28 20 70 44 75 70 20 29 7b       if( pDup ){
5d40: 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69  .        pDup->i
5d50: 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
5d60: 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69  .        pDup->i
5d70: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e  Column = iColumn
5d80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d90: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
5da0: 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  pr(TK_IN, pDup, 
5db0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
5dc0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
5dd0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
5de0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
5df0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
5e00: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
5e10: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c  pNew->pList = pL
5e20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
5e30: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
5e40: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
5e50: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
5e60: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
5e70: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
5e80: 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ze(pSrc, pMaskSe
5e90: 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  t, pWC, idxNew);
5ea0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
5eb0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
5ec0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
5ed0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
5ee0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
5ef0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
5f00: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
5f10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5f20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5f30: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
5f40: 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f   }.    }.or_not_
5f50: 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 77 68  possible:.    wh
5f60: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
5f70: 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sOr);.  }.#endif
5f80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5f90: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
5fa0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
5fb0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
5fc0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
5fd0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
5fe0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
5ff0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
6000: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
6010: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
6020: 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c    if( isLikeOrGl
6030: 6f 62 28 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e  ob(pWC->pParse->
6040: 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50 61 74  db, pExpr, &nPat
6050: 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65 74  tern, &isComplet
6060: 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  e) ){.    Expr *
6070: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
6080: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31 2c      Expr *pStr1,
6090: 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78 70   *pStr2;.    Exp
60a0: 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a 70  r *pNewExpr1, *p
60b0: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
60c0: 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e 65  t idxNew1, idxNe
60d0: 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d  w2;..    pLeft =
60e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
60f0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
6100: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
6110: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
6120: 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73 71  ;.    pStr1 = sq
6130: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 53 54 52  lite3Expr(TK_STR
6140: 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ING, 0, 0, 0);. 
6150: 20 20 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a     if( pStr1 ){.
6160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
6170: 65 6e 43 6f 70 79 28 26 70 53 74 72 31 2d 3e 74  enCopy(&pStr1->t
6180: 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74  oken, &pRight->t
6190: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74  oken);.      pSt
61a0: 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50  r1->token.n = nP
61b0: 61 74 74 65 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  attern;.    }.  
61c0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
61d0: 33 45 78 70 72 44 75 70 28 70 53 74 72 31 29 3b  3ExprDup(pStr1);
61e0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 32 20 29  .    if( pStr2 )
61f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6200: 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pStr2->token.dyn
6210: 20 29 3b 0a 20 20 20 20 20 20 2b 2b 2a 28 75 38   );.      ++*(u8
6220: 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e  *)&pStr2->token.
6230: 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20  z[nPattern-1];. 
6240: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 78 70     }.    pNewExp
6250: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
6260: 28 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45  (TK_GE, sqlite3E
6270: 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20 70  xprDup(pLeft), p
6280: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str1, 0);.    id
6290: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
62a0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
62b0: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
62c0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
62d0: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
62e0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
62f0: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
6300: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
6310: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
6320: 28 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45  (TK_LT, sqlite3E
6330: 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20 70  xprDup(pLeft), p
6340: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
6350: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
6360: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
6370: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
6380: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
6390: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
63a0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
63b0: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
63c0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
63d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
63e0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
63f0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
6400: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
6410: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6420: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
6430: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
6440: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
6450: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
6460: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
6470: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6480: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
6490: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
64a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
64b0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
64c0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
64d0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
64e0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
64f0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
6500: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
6510: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6520: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
6530: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
6540: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
6550: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
6560: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
6570: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
6580: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
6590: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
65a0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
65b0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
65c0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
65d0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
65e0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
65f0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
6600: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
6610: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
6620: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
6630: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
6640: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
6650: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
6660: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
6670: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
6680: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
6690: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
66a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
66b0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72  1].pExpr;.    pr
66c0: 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54  ereqExpr = exprT
66d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
66e0: 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  et, pRight);.   
66f0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20   prereqColumn = 
6700: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
6710: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b  MaskSet, pLeft);
6720: 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71  .    if( (prereq
6730: 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c  Expr & prereqCol
6740: 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  umn)==0 ){.     
6750: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
6760: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
6770: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6780: 5f 4d 41 54 43 48 2c 20 30 2c 20 73 71 6c 69 74  _MATCH, 0, sqlit
6790: 65 33 45 78 70 72 44 75 70 28 70 52 69 67 68 74  e3ExprDup(pRight
67a0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
67b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
67c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
67d0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
67e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
67f0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
6800: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
6810: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
6820: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
6830: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
6840: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
6850: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
6860: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
6870: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
6880: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
6890: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
68a0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
68b0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
68c0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
68d0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
68e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
68f0: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
6900: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
6910: 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  hild = 1;.      
6920: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
6930: 54 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20  TERM_COPIED;.   
6940: 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65     pNewTerm->pre
6950: 72 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e  reqAll = pTerm->
6960: 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d  prereqAll;.    }
6970: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
6980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
6990: 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 0a 2f  ALTABLE */.}.../
69a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
69b0: 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64  e decides if pId
69c0: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  x can be used to
69d0: 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44   satisfy the ORD
69e0: 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e  ER BY.** clause.
69f0: 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20    If it can, it 
6a00: 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70  returns 1.  If p
6a10: 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  Idx cannot satis
6a20: 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  fy the.** ORDER 
6a30: 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20  BY clause, this 
6a40: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6a50: 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  0..**.** pOrderB
6a60: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
6a70: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53   clause from a S
6a80: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
6a90: 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a    pTab is the.**
6aa0: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
6ab0: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6ac0: 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65  use of that same
6ad0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
6ae0: 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62  t and.** the tab
6af0: 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20  le has a cursor 
6b00: 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22  number of "base"
6b10: 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e  .  pIdx is an in
6b20: 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a  dex on pTab..**.
6b30: 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65  ** nEqCol is the
6b40: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
6b50: 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20  ns of pIdx that 
6b60: 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61  are used as equa
6b70: 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69  lity.** constrai
6b80: 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65  nts.  Any of the
6b90: 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  se columns may b
6ba0: 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74  e missing from t
6bb0: 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63  he ORDER BY.** c
6bc0: 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61  lause and the ma
6bd0: 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65  tch can still be
6be0: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
6bf0: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
6c00: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
6c10: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
6c20: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
6c30: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
6c40: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
6c50: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
6c60: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
6c70: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
6c80: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
6c90: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
6ca0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
6cb0: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
6cc0: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
6cd0: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
6ce0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
6cf0: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
6d00: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
6d10: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
6d20: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
6d30: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
6d40: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
6d50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
6d60: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
6d70: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
6d80: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
6d90: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
6da0: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
6db0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65  ng */.  int base
6dc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
6dd0: 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72  /* Cursor number
6de0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74   for the table t
6df0: 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20  o be sorted */. 
6e00: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
6e10: 72 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  rBy,     /* The 
6e20: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6e30: 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c  */.  int nEqCol,
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6e50: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20  Number of index 
6e60: 63 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20  columns with == 
6e70: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
6e80: 20 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20   int *pbRev     
6e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
6ea0: 74 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59  to 1 if ORDER BY
6eb0: 20 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20   is DESC */.){. 
6ec0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
6ef0: 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f  s */.  int sortO
6f00: 72 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  rder = 0;       
6f10: 20 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66         /* XOR of
6f20: 20 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52   index and ORDER
6f30: 20 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69   BY sort directi
6f40: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72  on */.  int nTer
6f50: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
6f60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6f70: 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65  r of ORDER BY te
6f80: 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  rms */.  struct 
6f90: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
6fa0: 54 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65  Term;    /* A te
6fb0: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
6fc0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73  BY clause */.  s
6fd0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
6fe0: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65  rse->db;..  asse
6ff0: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
7000: 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72  );.  nTerm = pOr
7010: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20  derBy->nExpr;.  
7020: 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20  assert( nTerm>0 
7030: 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74  );..  /* Match t
7040: 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45  erms of the ORDE
7050: 52 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69  R BY clause agai
7060: 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20  nst columns of. 
7070: 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20   ** the index.. 
7080: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c   */.  for(i=j=0,
7090: 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d   pTerm=pOrderBy-
70a0: 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69  >a; j<nTerm && i
70b0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
70c0: 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  i++){.    Expr *
70d0: 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20  pExpr;       /* 
70e0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f  The expression o
70f0: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70  f the ORDER BY p
7100: 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c  Term */.    Coll
7110: 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f  Seq *pColl;    /
7120: 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20  * The collating 
7130: 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70  sequence of pExp
7140: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72  r */.    int ter
7150: 6d 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53  mSortOrder; /* S
7160: 6f 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68  ort order for th
7170: 69 73 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20  is term */..    
7180: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
7190: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
71a0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
71b0: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
71c0: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
71d0: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
71e0: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
71f0: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
7200: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
7210: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
7220: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
7230: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
7240: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  use */.      ret
7250: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
7260: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
7270: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
7280: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
7290: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
72a0: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
72b0: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  ll;.    if( pExp
72c0: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78  r->iColumn!=pIdx
72d0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c  ->aiColumn[i] ||
72e0: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
72f0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e  3StrICmp(pColl->
7300: 7a 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43  zName, pIdx->azC
7310: 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  oll[i]) ){.     
7320: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
7330: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7340: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
7350: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
7360: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
7370: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
7380: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
7390: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
73a0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
73b0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
73c0: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
73d0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
73e0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
73f0: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
7400: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
7410: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
7420: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
7430: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
7440: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
7450: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
7460: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
7470: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
7480: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
7490: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
74a0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
74b0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
74c0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
74d0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
74e0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
74f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7500: 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72  t( pIdx->aSortOr
7510: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73  der!=0 );.    as
7520: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72  sert( pTerm->sor
7530: 74 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65  tOrder==0 || pTe
7540: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31  rm->sortOrder==1
7550: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7560: 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72  pIdx->aSortOrder
7570: 5b 69 5d 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e  [i]==0 || pIdx->
7580: 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 31  aSortOrder[i]==1
7590: 20 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74   );.    termSort
75a0: 4f 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53  Order = pIdx->aS
75b0: 6f 72 74 4f 72 64 65 72 5b 69 5d 20 5e 20 70 54  ortOrder[i] ^ pT
75c0: 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a  erm->sortOrder;.
75d0: 20 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c      if( i>nEqCol
75e0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65   ){.      if( te
75f0: 72 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72  rmSortOrder!=sor
7600: 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20  tOrder ){.      
7610: 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e    /* Indices can
7620: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66   only be used if
7630: 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65   all ORDER BY te
7640: 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20  rms past the.   
7650: 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79       ** equality
7660: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65   constraints are
7670: 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43   all either DESC
7680: 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20   or ASC. */.    
7690: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
76a0: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
76b0: 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72  .      sortOrder
76c0: 20 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72   = termSortOrder
76d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
76e0: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
76f0: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
7700: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
7710: 72 20 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c  r sorting if all
7720: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
7730: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
7740: 2a 2a 20 61 72 65 20 63 6f 76 65 72 65 64 2e 0a  ** are covered..
7750: 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54    */.  if( j>=nT
7760: 65 72 6d 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  erm ){.    *pbRe
7770: 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30  v = sortOrder!=0
7780: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
7790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
77a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
77b0: 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74  able to see if t
77c0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
77d0: 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63  se in pOrderBy c
77e0: 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a  an be satisfied.
77f0: 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e  ** by sorting in
7800: 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e   order of ROWID.
7810: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
7820: 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52   so and set *pbR
7830: 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65  ev to be.** true
7840: 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57   for reverse ROW
7850: 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  ID and false for
7860: 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f   forward ROWID o
7870: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
7880: 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  int sortableByRo
7890: 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c  wid(.  int base,
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
78b0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
78c0: 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20  for table to be 
78d0: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
78e0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
78f0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
7900: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
7910: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
7920: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
7930: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
7940: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
7950: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
7960: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
7970: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
7980: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
7990: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
79a0: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
79b0: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  if( pOrderBy->nE
79c0: 78 70 72 3d 3d 31 20 26 26 20 70 2d 3e 6f 70 3d  xpr==1 && p->op=
79d0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d  =TK_COLUMN && p-
79e0: 3e 69 54 61 62 6c 65 3d 3d 62 61 73 65 0a 20 20  >iTable==base.  
79f0: 20 20 20 20 20 20 20 20 26 26 20 70 2d 3e 69 43          && p->iC
7a00: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20  olumn==-1 ){.   
7a10: 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72   *pbRev = pOrder
7a20: 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
7a30: 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  er;.    return 1
7a40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61  ;.}../*.** Prepa
7a60: 72 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d  re a crude estim
7a70: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72  ate of the logar
7a80: 69 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75  ithm of the inpu
7a90: 74 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  t value..** The 
7aa0: 72 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74  results need not
7ab0: 20 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73   be exact.  This
7ac0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
7ad0: 72 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20  r estimating.** 
7ae0: 74 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f  the total cost o
7af0: 66 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65  f performing ope
7b00: 72 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c  ratings with O(l
7b10: 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29  ogN) or O(NlogN)
7b20: 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20  .** complexity. 
7b30: 20 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75   Because N is ju
7b40: 73 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69  st a guess, it i
7b50: 73 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65  s no great trage
7b60: 64 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73  dy if.** logN is
7b70: 20 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a   a little off..*
7b80: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
7b90: 65 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29  estLog(double N)
7ba0: 7b 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20  {.  double logN 
7bb0: 3d 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20  = 1;.  double x 
7bc0: 3d 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e  = 10;.  while( N
7bd0: 3e 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b  >x ){.    logN +
7be0: 3d 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30  = 1;.    x *= 10
7bf0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c  ;.  }.  return l
7c00: 6f 67 4e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77  ogN;.}../*.** Tw
7c10: 6f 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70  o routines for p
7c20: 72 69 6e 74 69 6e 67 20 74 68 65 20 63 6f 6e 74  rinting the cont
7c30: 65 6e 74 20 6f 66 20 61 6e 20 73 71 6c 69 74 65  ent of an sqlite
7c40: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 0a 2a 2a 20  3_index_info.** 
7c50: 73 74 72 75 63 74 75 72 65 2e 20 20 55 73 65 64  structure.  Used
7c60: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
7c70: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
7c80: 20 20 49 66 20 6e 65 69 74 68 65 72 0a 2a 2a 20    If neither.** 
7c90: 53 51 4c 49 54 45 5f 54 45 53 54 20 6f 72 20 53  SQLITE_TEST or S
7ca0: 51 4c 49 54 45 5f 44 45 42 55 47 20 61 72 65 20  QLITE_DEBUG are 
7cb0: 64 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 74 68  defined, then th
7cc0: 65 73 65 20 72 6f 75 74 69 6e 65 73 0a 2a 2a 20  ese routines.** 
7cd0: 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 2a 2f 0a 23  are no-ops..*/.#
7ce0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7cf0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7d00: 41 42 4c 45 29 20 26 26 20 5c 0a 20 20 20 20 20  ABLE) && \.     
7d10: 20 20 20 28 64 65 66 69 6e 65 64 28 53 51 4c 49     (defined(SQLI
7d20: 54 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69  TE_TEST) || defi
7d30: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
7d40: 29 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 54  )).static void T
7d50: 52 41 43 45 5f 49 44 58 5f 49 4e 50 55 54 53 28  RACE_IDX_INPUTS(
7d60: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7d70: 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  fo *p){.  int i;
7d80: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f  .  if( !sqlite3_
7d90: 77 68 65 72 65 5f 74 72 61 63 65 20 29 20 72 65  where_trace ) re
7da0: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  turn;.  for(i=0;
7db0: 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e   i<p->nConstrain
7dc0: 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  t; i++){.    sql
7dd0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
7de0: 22 20 20 63 6f 6e 73 74 72 61 69 6e 74 5b 25 64  "  constraint[%d
7df0: 5d 3a 20 63 6f 6c 3d 25 64 20 74 65 72 6d 69 64  ]: col=%d termid
7e00: 3d 25 64 20 6f 70 3d 25 64 20 75 73 61 62 6c 65  =%d op=%d usable
7e10: 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d=%d\n",.       
7e20: 69 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f  i,.       p->aCo
7e30: 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 43 6f 6c  nstraint[i].iCol
7e40: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61  umn,.       p->a
7e50: 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d 2e 69 54  Constraint[i].iT
7e60: 65 72 6d 4f 66 66 73 65 74 2c 0a 20 20 20 20 20  ermOffset,.     
7e70: 20 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74    p->aConstraint
7e80: 5b 69 5d 2e 6f 70 2c 0a 20 20 20 20 20 20 20 70  [i].op,.       p
7e90: 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 5b 69 5d  ->aConstraint[i]
7ea0: 2e 75 73 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  .usable);.  }.  
7eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
7ec0: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
7ed0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
7ee0: 69 6e 74 66 28 22 20 20 6f 72 64 65 72 62 79 5b  intf("  orderby[
7ef0: 25 64 5d 3a 20 63 6f 6c 3d 25 64 20 64 65 73 63  %d]: col=%d desc
7f00: 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69  =%d\n",.       i
7f10: 2c 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64  ,.       p->aOrd
7f20: 65 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 2c  erBy[i].iColumn,
7f30: 0a 20 20 20 20 20 20 20 70 2d 3e 61 4f 72 64 65  .       p->aOrde
7f40: 72 42 79 5b 69 5d 2e 64 65 73 63 29 3b 0a 20 20  rBy[i].desc);.  
7f50: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
7f60: 54 52 41 43 45 5f 49 44 58 5f 4f 55 54 50 55 54  TRACE_IDX_OUTPUT
7f70: 53 28 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  S(sqlite3_index_
7f80: 69 6e 66 6f 20 2a 70 29 7b 0a 20 20 69 6e 74 20  info *p){.  int 
7f90: 69 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  i;.  if( !sqlite
7fa0: 33 5f 77 68 65 72 65 5f 74 72 61 63 65 20 29 20  3_where_trace ) 
7fb0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
7fc0: 30 3b 20 69 3c 70 2d 3e 6e 43 6f 6e 73 74 72 61  0; i<p->nConstra
7fd0: 69 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  int; i++){.    s
7fe0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
7ff0: 66 28 22 20 20 75 73 61 67 65 5b 25 64 5d 3a 20  f("  usage[%d]: 
8000: 61 72 67 76 49 64 78 3d 25 64 20 6f 6d 69 74 3d  argvIdx=%d omit=
8010: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 69 2c  %d\n",.       i,
8020: 0a 20 20 20 20 20 20 20 70 2d 3e 61 43 6f 6e 73  .       p->aCons
8030: 74 72 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 61  traintUsage[i].a
8040: 72 67 76 49 6e 64 65 78 2c 0a 20 20 20 20 20 20  rgvIndex,.      
8050: 20 70 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55   p->aConstraintU
8060: 73 61 67 65 5b 69 5d 2e 6f 6d 69 74 29 3b 0a 20  sage[i].omit);. 
8070: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75   }.  sqlite3Debu
8080: 67 50 72 69 6e 74 66 28 22 20 20 69 64 78 4e 75  gPrintf("  idxNu
8090: 6d 3d 25 64 5c 6e 22 2c 20 70 2d 3e 69 64 78 4e  m=%d\n", p->idxN
80a0: 75 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  um);.  sqlite3De
80b0: 62 75 67 50 72 69 6e 74 66 28 22 20 20 69 64 78  bugPrintf("  idx
80c0: 53 74 72 3d 25 73 5c 6e 22 2c 20 70 2d 3e 69 64  Str=%s\n", p->id
80d0: 78 53 74 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  xStr);.  sqlite3
80e0: 44 65 62 75 67 50 72 69 6e 74 66 28 22 20 20 6f  DebugPrintf("  o
80f0: 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 3d 25  rderByConsumed=%
8100: 64 5c 6e 22 2c 20 70 2d 3e 6f 72 64 65 72 42 79  d\n", p->orderBy
8110: 43 6f 6e 73 75 6d 65 64 29 3b 0a 20 20 73 71 6c  Consumed);.  sql
8120: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
8130: 22 20 20 65 73 74 69 6d 61 74 65 64 43 6f 73 74  "  estimatedCost
8140: 3d 25 67 5c 6e 22 2c 20 70 2d 3e 65 73 74 69 6d  =%g\n", p->estim
8150: 61 74 65 64 43 6f 73 74 29 3b 0a 7d 0a 23 65 6c  atedCost);.}.#el
8160: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
8170: 5f 49 44 58 5f 49 4e 50 55 54 53 28 41 29 0a 23  _IDX_INPUTS(A).#
8180: 64 65 66 69 6e 65 20 54 52 41 43 45 5f 49 44 58  define TRACE_IDX
8190: 5f 4f 55 54 50 55 54 53 28 41 29 0a 23 65 6e 64  _OUTPUTS(A).#end
81a0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
81b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
81c0: 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ABLE./*.** Compu
81d0: 74 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  te the best inde
81e0: 78 20 66 6f 72 20 61 20 76 69 72 74 75 61 6c 20  x for a virtual 
81f0: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  table..**.** The
8200: 20 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 63   best index is c
8210: 6f 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 78  omputed by the x
8220: 42 65 73 74 49 6e 64 65 78 20 6d 65 74 68 6f 64  BestIndex method
8230: 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 0a   of the virtual.
8240: 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75 6c 65 2e  ** table module.
8250: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
8260: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
8270: 77 72 61 70 70 65 72 20 74 68 61 74 20 73 65 74  wrapper that set
8280: 73 20 75 70 0a 2a 2a 20 74 68 65 20 73 71 6c 69  s up.** the sqli
8290: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
82a0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
82b0: 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d 75 6e 69   used to communi
82c0: 63 61 74 65 20 77 69 74 68 0a 2a 2a 20 78 42 65  cate with.** xBe
82d0: 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 49  stIndex..**.** I
82e0: 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69 73 20 72  n a join, this r
82f0: 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 62 65 20  outine might be 
8300: 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70 6c 65 20  called multiple 
8310: 74 69 6d 65 73 20 66 6f 72 20 74 68 65 0a 2a 2a  times for the.**
8320: 20 73 61 6d 65 20 76 69 72 74 75 61 6c 20 74 61   same virtual ta
8330: 62 6c 65 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ble.  The sqlite
8340: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8350: 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74 65  ucture is create
8360: 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  d.** and initial
8370: 69 7a 65 64 20 6f 6e 20 74 68 65 20 66 69 72 73  ized on the firs
8380: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61 6e 64  t invocation and
8390: 20 72 65 75 73 65 64 20 6f 6e 20 61 6c 6c 20 73   reused on all s
83a0: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 76  ubsequent.** inv
83b0: 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 65 20 73  ocations.  The s
83c0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
83d0: 6f 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  o structure is a
83e0: 6c 73 6f 20 75 73 65 64 20 77 68 65 6e 0a 2a 2a  lso used when.**
83f0: 20 63 6f 64 65 20 69 73 20 67 65 6e 65 72 61 74   code is generat
8400: 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
8410: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e 20   virtual table. 
8420: 20 54 68 65 20 77 68 65 72 65 49 6e 66 6f 44 65   The whereInfoDe
8430: 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f 75 74 69  lete() .** routi
8440: 6e 65 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ne takes care of
8450: 20 66 72 65 65 69 6e 67 20 74 68 65 20 73 71 6c   freeing the sql
8460: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8470: 73 74 72 75 63 74 75 72 65 20 61 66 74 65 72 0a  structure after.
8480: 2a 2a 20 65 76 65 72 79 62 6f 64 79 20 68 61 73  ** everybody has
8490: 20 66 69 6e 69 73 68 65 64 20 77 69 74 68 20 69   finished with i
84a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  t..*/.static dou
84b0: 62 6c 65 20 62 65 73 74 56 69 72 74 75 61 6c 49  ble bestVirtualI
84c0: 6e 64 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70  ndex(.  Parse *p
84d0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20  Parse,          
84e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
84f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
8500: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
8510: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  pWC,            
8520: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
8530: 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74 72 75 63  lause */.  struc
8540: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
8550: 70 53 72 63 2c 20 20 20 20 20 2f 2a 20 54 68 65  pSrc,     /* The
8560: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74 65 72   FROM clause ter
8570: 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20  m to search */. 
8580: 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64   Bitmask notRead
8590: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
85a0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
85b0: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
85c0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
85d0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
85e0: 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y,            /*
85f0: 20 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c   The order by cl
8600: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  ause */.  int or
8610: 64 65 72 42 79 55 73 61 62 6c 65 2c 20 20 20 20  derByUsable,    
8620: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
8630: 20 69 66 20 77 65 20 63 61 6e 20 70 6f 74 65 6e   if we can poten
8640: 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a 20 20 73  tial sort */.  s
8650: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8660: 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f 20 2f 2a  o **ppIdxInfo /*
8670: 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d 61 74 69   Index informati
8680: 6f 6e 20 70 61 73 73 65 64 20 74 6f 20 78 42 65  on passed to xBe
8690: 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  stIndex */.){.  
86a0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 53  Table *pTab = pS
86b0: 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73 71 6c 69  rc->pTab;.  sqli
86c0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a  te3_index_info *
86d0: 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73 74 72 75  pIdxInfo;.  stru
86e0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
86f0: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a 70 49 64  _constraint *pId
8700: 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75 63 74 20  xCons;.  struct 
8710: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72  sqlite3_index_or
8720: 64 65 72 62 79 20 2a 70 49 64 78 4f 72 64 65 72  derby *pIdxOrder
8730: 42 79 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c  By;.  struct sql
8740: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8750: 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 70 55 73  raint_usage *pUs
8760: 61 67 65 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  age;.  WhereTerm
8770: 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74 20 69   *pTerm;.  int i
8780: 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f 72 64 65  , j;.  int nOrde
8790: 72 42 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  rBy;.  int rc;..
87a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c 69    /* If the sqli
87b0: 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73  te3_index_info s
87c0: 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f 74  tructure has not
87d0: 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
87e0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  .  ** allocated 
87f0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  and initialized 
8800: 66 6f 72 20 74 68 69 73 20 76 69 72 74 75 61 6c  for this virtual
8810: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c 6c   table, then all
8820: 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20 69  ocate.  ** and i
8830: 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f 77  nitialize it now
8840: 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66 6f  .  */.  pIdxInfo
8850: 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a 20   = *ppIdxInfo;. 
8860: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30   if( pIdxInfo==0
8870: 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65 72   ){.    WhereTer
8880: 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 69 6e  m *pTerm;.    in
8890: 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 54 52 41  t nTerm;.    TRA
88a0: 43 45 28 28 22 52 65 63 6f 6d 70 75 74 69 6e 67  CE(("Recomputing
88b0: 20 69 6e 64 65 78 20 69 6e 66 6f 20 66 6f 72 20   index info for 
88c0: 25 73 2e 2e 2e 5c 6e 22 2c 20 70 54 61 62 2d 3e  %s...\n", pTab->
88d0: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
88e0: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
88f0: 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57 48  r of possible WH
8900: 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73 74  ERE clause const
8910: 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e 67  raints referring
8920: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  .    ** to this 
8930: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
8940: 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72 6d  .    for(i=nTerm
8950: 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61  =0, pTerm=pWC->a
8960: 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20  ; i<pWC->nTerm; 
8970: 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  i++, pTerm++){. 
8980: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
8990: 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70 53  leftCursor != pS
89a0: 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63 6f  rc->iCursor ) co
89b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
89c0: 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  ( pTerm->eOperat
89d0: 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74  or==WO_IN ) cont
89e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65 72  inue;.      nTer
89f0: 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  m++;.    }..    
8a00: 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52 20  /* If the ORDER 
8a10: 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61 69  BY clause contai
8a20: 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73 20  ns only columns 
8a30: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a  in the current .
8a40: 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74      ** virtual t
8a50: 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63 61  able then alloca
8a60: 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
8a70: 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20 6f   aOrderBy part o
8a80: 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71 6c  f.    ** the sql
8a90: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8aa0: 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20 2a  structure..    *
8ab0: 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d  /.    nOrderBy =
8ac0: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72 64   0;.    if( pOrd
8ad0: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66 6f  erBy ){.      fo
8ae0: 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42  r(i=0; i<pOrderB
8af0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  y->nExpr; i++){.
8b00: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45          Expr *pE
8b10: 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e  xpr = pOrderBy->
8b20: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
8b30: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
8b40: 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20  p!=TK_COLUMN || 
8b50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 70  pExpr->iTable!=p
8b60: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 62  Src->iCursor ) b
8b70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8b80: 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64 65      if( i==pOrde
8b90: 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  rBy->nExpr ){.  
8ba0: 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20 3d        nOrderBy =
8bb0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
8bc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8bd0: 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
8be0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
8bf0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8c00: 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 64  e.    */.    pId
8c10: 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61  xInfo = sqliteMa
8c20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49  lloc( sizeof(*pI
8c30: 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20 20  dxInfo).        
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c50: 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28 2a       + (sizeof(*
8c60: 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a 65  pIdxCons) + size
8c70: 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54 65  of(*pUsage))*nTe
8c80: 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  rm.             
8c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ca0: 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f 72  + sizeof(*pIdxOr
8cb0: 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79 20  derBy)*nOrderBy 
8cc0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 49  );.    if( pIdxI
8cd0: 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nfo==0 ){.      
8ce0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8cf0: 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66 20  pParse, "out of 
8d00: 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20 20  memory");.      
8d10: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20  return 0.0;.    
8d20: 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66 6f  }.    *ppIdxInfo
8d30: 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20 20   = pIdxInfo;..  
8d40: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
8d50: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
8d60: 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  The sqlite3_inde
8d70: 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  x_info structure
8d80: 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a 2a   contains.    **
8d90: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68 61   many fields tha
8da0: 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 22  t are declared "
8db0: 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65 6e  const" to preven
8dc0: 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72 6f  t xBestIndex fro
8dd0: 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69 6e  m.    ** changin
8de0: 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76 65  g them.  We have
8df0: 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e 6b   to do some funk
8e00: 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72 64  y casting in ord
8e10: 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e 69  er to.    ** ini
8e20: 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66 69  tialize those fi
8e30: 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  elds..    */.   
8e40: 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74 72   pIdxCons = (str
8e50: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
8e60: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26 70  x_constraint*)&p
8e70: 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20 20  IdxInfo[1];.    
8e80: 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28 73  pIdxOrderBy = (s
8e90: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8ea0: 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70 49  dex_orderby*)&pI
8eb0: 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a 20  dxCons[nTerm];. 
8ec0: 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74 72     pUsage = (str
8ed0: 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65  uct sqlite3_inde
8ee0: 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61  x_constraint_usa
8ef0: 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42 79  ge*)&pIdxOrderBy
8f00: 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20 20  [nOrderBy];.    
8f10: 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  *(int*)&pIdxInfo
8f20: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  ->nConstraint = 
8f30: 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e 74  nTerm;.    *(int
8f40: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72  *)&pIdxInfo->nOr
8f50: 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79  derBy = nOrderBy
8f60: 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20 73  ;.    *(struct s
8f70: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8f80: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
8f90: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8fa0: 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20 20   = pIdxCons;.   
8fb0: 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74 65   *(struct sqlite
8fc0: 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a  3_index_orderby*
8fd0: 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f 72  *)&pIdxInfo->aOr
8fe0: 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64 65  derBy = pIdxOrde
8ff0: 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63  rBy;.    *(struc
9000: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
9010: 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65  constraint_usage
9020: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
9030: 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20 3d  onstraintUsage =
9040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9080: 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a 20        pUsage;.. 
9090: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70 54     for(i=j=0, pT
90a0: 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57  erm=pWC->a; i<pW
90b0: 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70  C->nTerm; i++, p
90c0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
90d0: 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75  f( pTerm->leftCu
90e0: 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43  rsor != pSrc->iC
90f0: 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65  ursor ) continue
9100: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
9110: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f  m->eOperator==WO
9120: 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  _IN ) continue;.
9130: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
9140: 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65 72  ].iColumn = pTer
9150: 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a 20  m->leftColumn;. 
9160: 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a 5d       pIdxCons[j]
9170: 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20 69  .iTermOffset = i
9180: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
9190: 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d 3e  [j].op = pTerm->
91a0: 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20 20  eOperator;.     
91b0: 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 20 61   /* The direct a
91c0: 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20 74 68 65  ssignment in the
91d0: 20 70 72 65 76 69 6f 75 73 20 6c 69 6e 65 20 69   previous line i
91e0: 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e 6c 79 20  s possible only 
91f0: 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a 2a  because.      **
9200: 20 74 68 65 20 57 4f 5f 20 61 6e 64 20 53 51 4c   the WO_ and SQL
9210: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
9220: 41 49 4e 54 5f 20 63 6f 64 65 73 20 61 72 65 20  AINT_ codes are 
9230: 69 64 65 6e 74 69 63 61 6c 2e 20 20 54 68 65 0a  identical.  The.
9240: 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69        ** followi
9250: 6e 67 20 61 73 73 65 72 74 73 20 76 65 72 69 66  ng asserts verif
9260: 79 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a  y this fact. */.
9270: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f        assert( WO
9280: 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45  _EQ==SQLITE_INDE
9290: 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 45 51 20  X_CONSTRAINT_EQ 
92a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
92b0: 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54 45 5f 49   WO_LT==SQLITE_I
92c0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
92d0: 4c 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  LT );.      asse
92e0: 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54  rt( WO_LE==SQLIT
92f0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
9300: 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20 61  NT_LE );.      a
9310: 73 73 65 72 74 28 20 57 4f 5f 47 54 3d 3d 53 51  ssert( WO_GT==SQ
9320: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
9330: 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20 20 20 20  RAINT_GT );.    
9340: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 45 3d    assert( WO_GE=
9350: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
9360: 4e 53 54 52 41 49 4e 54 5f 47 45 20 29 3b 0a 20  NSTRAINT_GE );. 
9370: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
9380: 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45 5f 49 4e  MATCH==SQLITE_IN
9390: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4d  DEX_CONSTRAINT_M
93a0: 41 54 43 48 20 29 3b 0a 20 20 20 20 20 20 61 73  ATCH );.      as
93b0: 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 65 4f 70  sert( pTerm->eOp
93c0: 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 45 51 7c  erator & (WO_EQ|
93d0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
93e0: 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41 54 43 48  T|WO_GE|WO_MATCH
93f0: 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ) );.      j++;.
9400: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
9410: 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79 3b 20 69  0; i<nOrderBy; i
9420: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
9430: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
9440: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
9450: 20 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79       pIdxOrderBy
9460: 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45  [i].iColumn = pE
9470: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20  xpr->iColumn;.  
9480: 20 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 5b      pIdxOrderBy[
9490: 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72 64 65 72  i].desc = pOrder
94a0: 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64  By->a[i].sortOrd
94b0: 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  er;.    }.  }.. 
94c0: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
94d0: 74 2c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  t, the sqlite3_i
94e0: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
94f0: 75 72 65 20 74 68 61 74 20 70 49 64 78 49 6e 66  ure that pIdxInf
9500: 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20 74 6f  o points.  ** to
9510: 20 77 69 6c 6c 20 68 61 76 65 20 62 65 65 6e 20   will have been 
9520: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 65 69 74  initialized, eit
9530: 68 65 72 20 64 75 72 69 6e 67 20 74 68 65 20 63  her during the c
9540: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
9550: 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72 69 6e 67  n or.  ** during
9560: 20 73 6f 6d 65 20 70 72 69 6f 72 20 69 6e 76 6f   some prior invo
9570: 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20 77 65 20  cation.  Now we 
9580: 6a 75 73 74 20 68 61 76 65 20 74 6f 20 63 75 73  just have to cus
9590: 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20 2a 2a 20  tomize the.  ** 
95a0: 64 65 74 61 69 6c 73 20 6f 66 20 70 49 64 78 49  details of pIdxI
95b0: 6e 66 6f 20 66 6f 72 20 74 68 65 20 63 75 72 72  nfo for the curr
95c0: 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 61  ent invocation a
95d0: 6e 64 20 70 61 73 73 20 69 74 20 74 6f 0a 20 20  nd pass it to.  
95e0: 2a 2a 20 78 42 65 73 74 49 6e 64 65 78 2e 0a 20  ** xBestIndex.. 
95f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 6f   */..  /* The mo
9600: 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73 74 20 62  dule name must b
9610: 65 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 61  e defined */.  a
9620: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 61 7a 4d  ssert( pTab->azM
9630: 6f 64 75 6c 65 41 72 67 20 26 26 20 70 54 61 62  oduleArg && pTab
9640: 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30 5d  ->azModuleArg[0]
9650: 20 29 3b 0a 20 20 69 66 28 20 70 54 61 62 2d 3e   );.  if( pTab->
9660: 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20  pVtab==0 ){.    
9670: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9680: 70 50 61 72 73 65 2c 20 22 75 6e 64 65 66 69 6e  pParse, "undefin
9690: 65 64 20 6d 6f 64 75 6c 65 20 25 73 20 66 6f 72  ed module %s for
96a0: 20 74 61 62 6c 65 20 25 73 22 2c 0a 20 20 20 20   table %s",.    
96b0: 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d 6f 64 75      pTab->azModu
96c0: 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61 62 2d 3e  leArg[0], pTab->
96d0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75  zName);.    retu
96e0: 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f  rn 0.0;.  }..  /
96f0: 2a 20 53 65 74 20 74 68 65 20 61 43 6f 6e 73 74  * Set the aConst
9700: 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65 20 66  raint[].usable f
9710: 69 65 6c 64 73 20 61 6e 64 20 69 6e 69 74 69 61  ields and initia
9720: 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a 2a 20 6f  lize all .  ** o
9730: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
9740: 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  to zero..  **.  
9750: 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  ** aConstraint[]
9760: 2e 75 73 61 62 6c 65 20 69 73 20 74 72 75 65 20  .usable is true 
9770: 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  for constraints 
9780: 77 68 65 72 65 20 74 68 65 20 72 69 67 68 74 2d  where the right-
9790: 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64 65 20 63  hand.  ** side c
97a0: 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 72 65 66  ontains only ref
97b0: 65 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65  erences to table
97c0: 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  s to the left of
97d0: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a   the current.  *
97e0: 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 74 68  * table.  In oth
97f0: 65 72 20 77 6f 72 64 73 2c 20 69 66 20 74 68 65  er words, if the
9800: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6f   constraint is o
9810: 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20 20 2a 2a  f the form:.  **
9820: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
9830: 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72 0a 20 20  column = expr.  
9840: 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77 65 20 61  **.  ** and we a
9850: 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20 61 20  re evaluating a 
9860: 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  join, then the c
9870: 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20 63 6f 6c  onstraint on col
9880: 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20 6f 6e 6c  umn is .  ** onl
9890: 79 20 76 61 6c 69 64 20 69 66 20 61 6c 6c 20 74  y valid if all t
98a0: 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64  ables referenced
98b0: 20 69 6e 20 65 78 70 72 20 6f 63 63 75 72 20 74   in expr occur t
98c0: 6f 20 74 68 65 20 6c 65 66 74 0a 20 20 2a 2a 20  o the left.  ** 
98d0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 63 6f 6e  of the table con
98e0: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2e 0a  taining column..
98f0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 61 43    **.  ** The aC
9900: 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20 61 72 72  onstraints[] arr
9910: 61 79 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  ay contains entr
9920: 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73  ies for all cons
9930: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 6f 6e 20  traints.  ** on 
9940: 74 68 65 20 63 75 72 72 65 6e 74 20 74 61 62 6c  the current tabl
9950: 65 2e 20 20 54 68 61 74 20 77 61 79 20 77 65 20  e.  That way we 
9960: 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20 63 6f 6d  only have to com
9970: 70 75 74 65 20 69 74 20 6f 6e 63 65 0a 20 20 2a  pute it once.  *
9980: 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 77 65  * even though we
9990: 20 6d 69 67 68 74 20 74 72 79 20 74 6f 20 70 69   might try to pi
99a0: 63 6b 20 74 68 65 20 62 65 73 74 20 69 6e 64 65  ck the best inde
99b0: 78 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  x multiple times
99c0: 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61 63 68 20  ..  ** For each 
99d0: 61 74 74 65 6d 70 74 20 61 74 20 70 69 63 6b 69  attempt at picki
99e0: 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20 74 68 65  ng an index, the
99f0: 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
9a00: 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 69   in the.  ** joi
9a10: 6e 20 6d 69 67 68 74 20 62 65 20 64 69 66 66 65  n might be diffe
9a20: 72 65 6e 74 20 73 6f 20 77 65 20 68 61 76 65 20  rent so we have 
9a30: 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65  to recompute the
9a40: 20 75 73 61 62 6c 65 20 66 6c 61 67 0a 20 20 2a   usable flag.  *
9a50: 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a 20 20 2a  * each time..  *
9a60: 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 2a  /.  pIdxCons = *
9a70: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
9a80: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
9a90: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
9aa0: 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 70 55 73  onstraint;.  pUs
9ab0: 61 67 65 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e  age = pIdxInfo->
9ac0: 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65  aConstraintUsage
9ad0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
9ae0: 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72  IdxInfo->nConstr
9af0: 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49 64 78 43  aint; i++, pIdxC
9b00: 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a 20 3d 20  ons++){.    j = 
9b10: 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65 72 6d 4f  pIdxCons->iTermO
9b20: 66 66 73 65 74 3b 0a 20 20 20 20 70 54 65 72 6d  ffset;.    pTerm
9b30: 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d 3b 0a 20   = &pWC->a[j];. 
9b40: 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e 75 73 61     pIdxCons->usa
9b50: 62 6c 65 20 3d 20 20 28 70 54 65 72 6d 2d 3e 70  ble =  (pTerm->p
9b60: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
9b70: 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20 7d 0a 20  Ready)==0;.  }. 
9b80: 20 6d 65 6d 73 65 74 28 70 55 73 61 67 65 2c 20   memset(pUsage, 
9b90: 30 2c 20 73 69 7a 65 6f 66 28 70 55 73 61 67 65  0, sizeof(pUsage
9ba0: 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f 2d 3e 6e  [0])*pIdxInfo->n
9bb0: 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a 20 20 69  Constraint);.  i
9bc0: 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65 65  f( pIdxInfo->nee
9bd0: 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b  dToFreeIdxStr ){
9be0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
9bf0: 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  e(pIdxInfo->idxS
9c00: 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49 64 78 49  tr);.  }.  pIdxI
9c10: 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d 20 30 3b  nfo->idxStr = 0;
9c20: 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78  .  pIdxInfo->idx
9c30: 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49 64 78 49  Num = 0;.  pIdxI
9c40: 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49  nfo->needToFreeI
9c50: 64 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64  dxStr = 0;.  pId
9c60: 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
9c70: 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20 20 70 49  nsumed = 0;.  pI
9c80: 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d 61 74 65  dxInfo->estimate
9c90: 64 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  dCost = SQLITE_B
9ca0: 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b 0a 20 20  IG_DBL / 2.0;.  
9cb0: 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 49  nOrderBy = pIdxI
9cc0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a 20  nfo->nOrderBy;. 
9cd0: 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e 6e   if( pIdxInfo->n
9ce0: 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72 64 65  OrderBy && !orde
9cf0: 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20 20 20  rByUsable ){.   
9d00: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
9d10: 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30 3b  o->nOrderBy = 0;
9d20: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 53  .  }..  sqlite3S
9d30: 61 66 65 74 79 4f 66 66 28 70 50 61 72 73 65 2d  afetyOff(pParse-
9d40: 3e 64 62 29 3b 0a 20 20 54 52 41 43 45 28 28 22  >db);.  TRACE(("
9d50: 78 42 65 73 74 49 6e 64 65 78 20 66 6f 72 20 25  xBestIndex for %
9d60: 73 5c 6e 22 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d  s\n", pTab->zNam
9d70: 65 29 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58  e));.  TRACE_IDX
9d80: 5f 49 4e 50 55 54 53 28 70 49 64 78 49 6e 66 6f  _INPUTS(pIdxInfo
9d90: 29 3b 0a 20 20 72 63 20 3d 20 70 54 61 62 2d 3e  );.  rc = pTab->
9da0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
9db0: 78 42 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d  xBestIndex(pTab-
9dc0: 3e 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f  >pVtab, pIdxInfo
9dd0: 29 3b 0a 20 20 54 52 41 43 45 5f 49 44 58 5f 4f  );.  TRACE_IDX_O
9de0: 55 54 50 55 54 53 28 70 49 64 78 49 6e 66 6f 29  UTPUTS(pIdxInfo)
9df0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9e00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
9e10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
9e20: 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  M ){.      sqlit
9e30: 65 33 46 61 69 6c 65 64 4d 61 6c 6c 6f 63 28 29  e3FailedMalloc()
9e40: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 7b 0a 20 20  ;.    }else {.  
9e50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
9e60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 22  Msg(pParse, "%s"
9e70: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
9e80: 72 63 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rc));.    }.    
9e90: 73 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28  sqlite3SafetyOn(
9ea0: 70 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d  pParse->db);.  }
9eb0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
9ec0: 71 6c 69 74 65 33 53 61 66 65 74 79 4f 6e 28 70  qlite3SafetyOn(p
9ed0: 50 61 72 73 65 2d 3e 64 62 29 3b 0a 20 20 7d 0a  Parse->db);.  }.
9ee0: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
9ef0: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 6e  fo->nOrderBy = n
9f00: 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74 75 72  OrderBy;.  retur
9f10: 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69  n pIdxInfo->esti
9f20: 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65 6e  matedCost;.}.#en
9f30: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
9f40: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
9f50: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  */../*.** Find t
9f60: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66 6f  he best index fo
9f70: 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70 61  r accessing a pa
9f80: 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e 20  rticular table. 
9f90: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
9fa0: 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64 65  r.** to the inde
9fb0: 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64 65  x, flags that de
9fc0: 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20 69  scribe how the i
9fd0: 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 75  ndex should be u
9fe0: 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d 62  sed, the.** numb
9ff0: 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20 63  er of equality c
a000: 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64 20  onstraints, and 
a010: 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20 74  the "cost" for t
a020: 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  his index..**.**
a030: 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74   The lowest cost
a040: 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54 68   index wins.  Th
a050: 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73 74  e cost is an est
a060: 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d 6f  imate of the amo
a070: 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61 6e  unt of.** CPU an
a080: 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64 20  d disk I/O need 
a090: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 72  to process the r
a0a0: 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68 65  equest using the
a0b0: 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78 2e   selected index.
a0c0: 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61 74  .** Factors that
a0d0: 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74 20   influence cost 
a0e0: 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20 20  include:.**.**  
a0f0: 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61 74    *  The estimat
a100: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  ed number of row
a110: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
a120: 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65 0a  etrieved.  (The.
a130: 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20 74  **       fewer t
a140: 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a 2a  he better.).**.*
a150: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
a160: 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20 6d  or not sorting m
a170: 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a  ust occur..**.**
a180: 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20 6f      *  Whether o
a190: 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73 74  r not there must
a1a0: 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f 6f   be separate loo
a1b0: 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20 20  kups in the.**  
a1c0: 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20 69       index and i
a1d0: 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c 65  n the main table
a1e0: 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 64  ..**.*/.static d
a1f0: 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78 28  ouble bestIndex(
a200: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
a210: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a220: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
a230: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
a240: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
a250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
a260: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
a270: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
a280: 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20 54  tem *pSrc,  /* T
a290: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 74  he FROM clause t
a2a0: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a 2f  erm to search */
a2b0: 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52 65  .  Bitmask notRe
a2c0: 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ady,           /
a2d0: 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f 72  * Mask of cursor
a2e0: 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20 61  s that are not a
a2f0: 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45 78  vailable */.  Ex
a300: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
a310: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
a320: 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65   order by clause
a330: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70 70   */.  Index **pp
a340: 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20 20  Index,          
a350: 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e 64    /* Make *ppInd
a360: 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ex point to the 
a370: 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  best index */.  
a380: 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
a390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a3a0: 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69 62  ut flags describ
a3b0: 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65 20  ing this choice 
a3c0: 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20 20  in *pFlags */.  
a3d0: 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20 20  int *pnEq       
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
a3f0: 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ut the number of
a400: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
a410: 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  aints here */.){
a420: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
a430: 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62 65  erm;.  Index *be
a440: 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20 20  stIdx = 0;      
a450: 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74     /* Index that
a460: 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65 73   gives the lowes
a470: 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75 62  t cost */.  doub
a480: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
a490: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
a4a0: 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65 73  ost of using bes
a4b0: 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 65  tIdx */.  int be
a4c0: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
a4d0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
a4e0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 62  ssociated with b
a4f0: 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20  estIdx */.  int 
a500: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
a510: 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74 20          /* Best 
a520: 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a 2f  value for nEq */
a530: 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70 53  .  int iCur = pS
a540: 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 2f  rc->iCursor;   /
a550: 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20  * The cursor of 
a560: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65 20  the table to be 
a570: 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49 6e  accessed */.  In
a580: 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20 20  dex *pProbe;    
a590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
a5a0: 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76 61  index we are eva
a5b0: 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  luating */.  int
a5c0: 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20   rev;           
a5d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
a5e0: 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76 65   to scan in reve
a5f0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 69  rse order */.  i
a600: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
a610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
a620: 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ags associated w
a630: 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20 20  ith pProbe */.  
a640: 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20  int nEq;        
a650: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a660: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
a670: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f  N constraints */
a680: 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20  .  double cost; 
a690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a6a0: 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  * Cost of using 
a6b0: 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54 52 41  pProbe */..  TRA
a6c0: 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a 20  CE(("bestIndex: 
a6d0: 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79 3d  tbl=%s notReady=
a6e0: 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54 61  %x\n", pSrc->pTa
a6f0: 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65 61  b->zName, notRea
a700: 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43 6f  dy));.  lowestCo
a710: 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
a720: 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20 3d 20  DBL;.  pProbe = 
a730: 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e 64  pSrc->pTab->pInd
a740: 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ex;..  /* If the
a750: 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69 6e   table has no in
a760: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
a770: 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e 20  are no terms in 
a780: 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20 63  the where.  ** c
a790: 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65 72  lause that refer
a7a0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20 74   to the ROWID, t
a7b0: 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hen we will neve
a7c0: 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f 0a  r be able to do.
a7d0: 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f 74    ** anything ot
a7e0: 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c 20  her than a full 
a7f0: 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74 68  table scan on th
a800: 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d 69  is table.  We mi
a810: 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c 6c  ght as.  ** well
a820: 20 70 75 74 20 69 74 20 66 69 72 73 74 20 69 6e   put it first in
a830: 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72 2e   the join order.
a840: 20 20 54 68 61 74 20 77 61 79 2c 20 70 65 72 68    That way, perh
a850: 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20 20  aps it can be.  
a860: 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ** referenced by
a870: 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69 6e   other tables in
a880: 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f 0a   the join..  */.
a890: 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30 20    if( pProbe==0 
a8a0: 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72 6d  &&.     findTerm
a8b0: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
a8c0: 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c 57  0, WO_EQ|WO_IN|W
a8d0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
a8e0: 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26 0a  |WO_GE,0)==0 &&.
a8f0: 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d 3d       (pOrderBy==
a900: 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42 79  0 || !sortableBy
a910: 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72 64  Rowid(iCur, pOrd
a920: 65 72 42 79 2c 20 26 72 65 76 29 29 20 29 7b 0a  erBy, &rev)) ){.
a930: 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 30 3b      *pFlags = 0;
a940: 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d 20  .    *ppIndex = 
a950: 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20 30  0;.    *pnEq = 0
a960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30  ;.    return 0.0
a970: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
a980: 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45 58  k for a rowid=EX
a990: 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20 28  PR or rowid IN (
a9a0: 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73  ...) constraints
a9b0: 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d 20  .  */.  pTerm = 
a9c0: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
a9d0: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
a9e0: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30  , WO_EQ|WO_IN, 0
a9f0: 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20 29  );.  if( pTerm )
aa00: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70  {.    Expr *pExp
aa10: 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20  r;.    *ppIndex 
aa20: 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c 61  = 0;.    bestFla
aa30: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
aa40: 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54 65  _EQ;.    if( pTe
aa50: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
aa60: 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  WO_EQ ){.      /
aa70: 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c 77  * Rowid== is alw
aa80: 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69 63  ays the best pic
aa90: 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72 74  k.  Look no furt
aaa0: 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f 6e  her.  Because on
aab0: 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 69  ly.      ** a si
aac0: 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e 65  ngle row is gene
aad0: 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69 73  rated, output is
aae0: 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74 65   always in sorte
aaf0: 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  d order */.     
ab00: 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52 45   *pFlags = WHERE
ab10: 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45 52  _ROWID_EQ | WHER
ab20: 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20 20  E_UNIQUE;.      
ab30: 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  *pnEq = 1;.     
ab40: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65 73   TRACE(("... bes
ab50: 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29 3b  t is rowid\n"));
ab60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 2e  .      return 0.
ab70: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
ab80: 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   (pExpr = pTerm-
ab90: 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21 3d  >pExpr)->pList!=
aba0: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  0 ){.      /* Ro
abb0: 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20 63  wid IN (LIST): c
abc0: 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65  ost is NlogN whe
abd0: 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62  re N is the numb
abe0: 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20 20  er of list.     
abf0: 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20 2a   ** elements.  *
ac00: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
ac10: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
ac20: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
ac30: 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65 73  lowestCost *= es
ac40: 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74 29  tLog(lowestCost)
ac50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
ac60: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
ac70: 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69 73  SELECT): cost is
ac80: 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69   NlogN where N i
ac90: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
aca0: 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e  rows.      ** in
acb0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
acc0: 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74 2e  he inner select.
acd0: 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61 79    We have no way
ace0: 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20 20   to estimate.   
acf0: 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75 65     ** that value
ad00: 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64 20   so make a wild 
ad10: 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20 20  guess. */.      
ad20: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30 30  lowestCost = 200
ad30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
ad40: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49 4e  E(("... rowid IN
ad50: 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c 20   cost: %.9g\n", 
ad60: 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20 20  lowestCost));.  
ad70: 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74 65  }..  /* Estimate
ad80: 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20 74   the cost of a t
ad90: 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20 77  able scan.  If w
ada0: 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68 6f  e do not know ho
adb0: 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74 72  w many.  ** entr
adc0: 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20 74  ies are in the t
add0: 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c 6c  able, use 1 mill
ade0: 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e 0a  ion as a guess..
adf0: 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d 20 70 50    */.  cost = pP
ae00: 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e 61  robe ? pProbe->a
ae10: 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30 30  iRowEst[0] : 100
ae20: 30 30 30 30 3b 0a 20 20 54 52 41 43 45 28 28 22  0000;.  TRACE(("
ae30: 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20 62  ... table scan b
ae40: 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e  ase cost: %.9g\n
ae50: 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c 61  ", cost));.  fla
ae60: 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44  gs = WHERE_ROWID
ae70: 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43 68  _RANGE;..  /* Ch
ae80: 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61 69  eck for constrai
ae90: 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20 6f  nts on a range o
aea0: 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74 61  f rowids in a ta
aeb0: 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a 20  ble scan..  */. 
aec0: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
aed0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
aee0: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
aef0: 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f  |WO_LE|WO_GT|WO_
af00: 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54  GE, 0);.  if( pT
af10: 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20 66  erm ){.    if( f
af20: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
af30: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
af40: 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30 29   WO_LT|WO_LE, 0)
af50: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
af60: 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d  |= WHERE_TOP_LIM
af70: 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f  IT;.      cost /
af80: 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  = 3;  /* Guess t
af90: 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20 65  hat rowid<EXPR e
afa0: 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
afb0: 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f 0a  irds or rows */.
afc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 69      }.    if( fi
afd0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
afe0: 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
aff0: 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 20  WO_GT|WO_GE, 0) 
b000: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
b010: 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  = WHERE_BTM_LIMI
b020: 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f 3d  T;.      cost /=
b030: 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74 68   3;  /* Guess th
b040: 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65 6c  at rowid>EXPR el
b050: 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68 69  iminates two-thi
b060: 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a 20  rds of rows */. 
b070: 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
b080: 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67 65  "... rowid range
b090: 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f   reduces cost to
b0a0: 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29   %.9g\n", cost))
b0b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
b0c0: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lags = 0;.  }.. 
b0d0: 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
b0e0: 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20 73   scan does not s
b0f0: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
b100: 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63 72   BY clause, incr
b110: 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f  ease.  ** the co
b120: 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20 63  st by NlogN to c
b130: 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e 73 65  over the expense
b140: 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f 0a   of sorting. */.
b150: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29    if( pOrderBy )
b160: 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61 62  {.    if( sortab
b170: 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20  leByRowid(iCur, 
b180: 70 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29 20  pOrderBy, &rev) 
b190: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
b1a0: 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 7c  = WHERE_ORDERBY|
b1b0: 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
b1c0: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 76  E;.      if( rev
b1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
b1e0: 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52  s |= WHERE_REVER
b1f0: 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
b200: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 73  }else{.      cos
b210: 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67  t += cost*estLog
b220: 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54 52  (cost);.      TR
b230: 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69 6e  ACE(("... sortin
b240: 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73 74  g increases cost
b250: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
b260: 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
b270: 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74   if( cost<lowest
b280: 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77 65  Cost ){.    lowe
b290: 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20  stCost = cost;. 
b2a0: 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66     bestFlags = f
b2b0: 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lags;.  }..  /* 
b2c0: 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e 64  Look at each ind
b2d0: 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 3b  ex..  */.  for(;
b2e0: 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65 3d   pProbe; pProbe=
b2f0: 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b 0a  pProbe->pNext){.
b300: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
b310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b320: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b330: 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 69   */.    double i
b340: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31 3b  nMultiplier = 1;
b350: 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e  ..    TRACE(("..
b360: 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c 20  . index %s:\n", 
b370: 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29 3b  pProbe->zName));
b380: 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20 74  ..    /* Count t
b390: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
b3a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64 65  umns in the inde
b3b0: 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69 73  x that are satis
b3c0: 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 78  fied.    ** by x
b3d0: 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e 74  =EXPR constraint
b3e0: 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29 20  s or x IN (...) 
b3f0: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
b400: 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d 20   */.    flags = 
b410: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
b420: 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  i<pProbe->nColum
b430: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  n; i++){.      i
b440: 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt j = pProbe->a
b450: 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20 20  iColumn[i];.    
b460: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
b470: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c  rm(pWC, iCur, j,
b480: 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51   notReady, WO_EQ
b490: 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29 3b  |WO_IN, pProbe);
b4a0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
b4b0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b4c0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
b4d0: 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20 20  E_COLUMN_EQ;.   
b4e0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f     if( pTerm->eO
b4f0: 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e 20  perator & WO_IN 
b500: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
b510: 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e  *pExpr = pTerm->
b520: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 66  pExpr;.        f
b530: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
b540: 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20 20  LUMN_IN;.       
b550: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
b560: 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ect!=0 ){.      
b570: 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72      inMultiplier
b580: 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20 20   *= 25;.        
b590: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
b5a0: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
b5b0: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
b5c0: 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70 4c  ier *= pExpr->pL
b5d0: 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b 0a  ist->nExpr + 1;.
b5e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b5f0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73 74  }.    }.    cost
b600: 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f 77   = pProbe->aiRow
b610: 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74 69  Est[i] * inMulti
b620: 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28 69  plier * estLog(i
b630: 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20 20  nMultiplier);.  
b640: 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20 69    nEq = i;.    i
b650: 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72 72  f( pProbe->onErr
b660: 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20 28  or!=OE_None && (
b670: 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f  flags & WHERE_CO
b680: 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20 20  LUMN_IN)==0.    
b690: 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50 72       && nEq==pPr
b6a0: 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a  obe->nColumn ){.
b6b0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
b6c0: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
b6d0: 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e   }.    TRACE((".
b6e0: 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e 4d  ..... nEq=%d inM
b6f0: 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25 2e  ult=%.9g cost=%.
b700: 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d 75  9g\n", nEq, inMu
b710: 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29 29  ltiplier, cost))
b720: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  ;..    /* Look f
b730: 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72 61  or range constra
b740: 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ints.    */.    
b750: 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d 3e  if( nEq<pProbe->
b760: 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  nColumn ){.     
b770: 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d   int j = pProbe-
b780: 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b 0a  >aiColumn[nEq];.
b790: 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
b7a0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
b7b0: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
b7c0: 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54  O_LT|WO_LE|WO_GT
b7d0: 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29 3b  |WO_GE, pProbe);
b7e0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
b7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67   ){.        flag
b800: 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d  s |= WHERE_COLUM
b810: 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20 20  N_RANGE;.       
b820: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
b830: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
b840: 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  eady, WO_LT|WO_L
b850: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
b860: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
b870: 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49 54   WHERE_TOP_LIMIT
b880: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
b890: 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d   /= 3;.        }
b8a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
b8b0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
b8c0: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
b8d0: 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
b8e0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
b8f0: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 42  flags |= WHERE_B
b900: 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  TM_LIMIT;.      
b910: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
b920: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b930: 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20   TRACE(("...... 
b940: 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f  range reduces co
b950: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
b960: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
b970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 64     }..    /* Add
b980: 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 20   the additional 
b990: 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67 20  cost of sorting 
b9a0: 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61 63  if that is a fac
b9b0: 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tor..    */.    
b9c0: 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b 0a  if( pOrderBy ){.
b9d0: 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73        if( (flags
b9e0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
b9f0: 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 20  IN)==0 &&.      
ba00: 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49 6e       isSortingIn
ba10: 64 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f 62  dex(pParse,pProb
ba20: 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79 2c  e,iCur,pOrderBy,
ba30: 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20 20  nEq,&rev) ){.   
ba40: 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d 3d       if( flags==
ba50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
ba60: 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f 4c  lags = WHERE_COL
ba70: 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  UMN_RANGE;.     
ba80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c 61     }.        fla
ba90: 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45  gs |= WHERE_ORDE
baa0: 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28  RBY;.        if(
bab0: 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20   rev ){.        
bac0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
bad0: 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
bae0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
baf0: 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b 3d  .        cost +=
bb00: 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f 73   cost*estLog(cos
bb10: 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  t);.        TRAC
bb20: 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65 72  E(("...... order
bb30: 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  by increases cos
bb40: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
bb50: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
bb60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
bb70: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 63  k to see if we c
bb80: 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74 68  an get away with
bb90: 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20   using just the 
bba0: 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20  index without.  
bbb0: 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e    ** ever readin
bbc0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  g the table.  If
bbd0: 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
bbe0: 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74 68  e, then halve th
bbf0: 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f 66  e.    ** cost of
bc00: 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20 20   this index..   
bc10: 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61 67   */.    if( flag
bc20: 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55 73  s && pSrc->colUs
bc30: 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29  ed < (((Bitmask)
bc40: 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a  1)<<(BMS-1)) ){.
bc50: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 20        Bitmask m 
bc60: 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64 3b  = pSrc->colUsed;
bc70: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
bc80: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
bc90: 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  Probe->nColumn; 
bca0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  j++){.        in
bcb0: 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  t x = pProbe->ai
bcc0: 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20  Column[j];.     
bcd0: 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20 29     if( x<BMS-1 )
bce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26 3d  {.          m &=
bcf0: 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c   ~(((Bitmask)1)<
bd00: 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  <x);.        }. 
bd10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bd20: 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   m==0 ){.       
bd30: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
bd40: 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20 20  IDX_ONLY;.      
bd50: 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20 20    cost /= 2;.   
bd60: 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e       TRACE(("...
bd70: 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65 64  ... idx-only red
bd80: 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  uces cost to %.9
bd90: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
bda0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
bdb0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64 65   /* If this inde
bdc0: 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20 74  x has achieved t
bdd0: 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 73  he lowest cost s
bde0: 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65 20  o far, then use 
bdf0: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  it..    */.    i
be00: 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73 74  f( cost < lowest
be10: 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62 65  Cost ){.      be
be20: 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b 0a  stIdx = pProbe;.
be30: 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74        lowestCost
be40: 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 61   = cost;.      a
be50: 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d 30 20  ssert( flags!=0 
be60: 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c 61  );.      bestFla
be70: 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs = flags;.    
be80: 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b    bestNEq = nEq;
be90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
bea0: 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73 74   Report the best
beb0: 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20 2a   result.  */.  *
bec0: 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49 64  ppIndex = bestId
bed0: 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62 65 73  x;.  TRACE(("bes
bee0: 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20 63  t index is %s, c
bef0: 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73 3d  ost=%.9g, flags=
bf00: 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a 20  %x, nEq=%d\n",. 
bf10: 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3f         bestIdx ?
bf20: 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65 20   bestIdx->zName 
bf30: 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77 65  : "(none)", lowe
bf40: 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61 67  stCost, bestFlag
bf50: 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20 20  s, bestNEq));.  
bf60: 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  *pFlags = bestFl
bf70: 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d 20 62  ags;.  *pnEq = b
bf80: 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72 6e  estNEq;.  return
bf90: 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a 0a   lowestCost;.}..
bfa0: 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
bfb0: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
bfc0: 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63 65  RE clause.  Exce
bfd0: 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61 62  pt, do not disab
bfe0: 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20 69  le the term.** i
bff0: 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61 20  f it controls a 
c000: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 20  LEFT OUTER JOIN 
c010: 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20 6f  and it did not o
c020: 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65 20  riginate in the 
c030: 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20 63  ON.** or USING c
c040: 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a 6f  lause of that jo
c050: 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69 64  in..**.** Consid
c060: 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e 7a  er the term t2.z
c070: 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f 6c  ='ok' in the fol
c080: 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a 0a  lowing queries:.
c090: 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45 4c  **.**   (1)  SEL
c0a0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45  ECT * FROM t1 LE
c0b0: 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31  FT JOIN t2 ON t1
c0c0: 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74 32  .a=t2.x WHERE t2
c0d0: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32 29  .z='ok'.**   (2)
c0e0: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
c0f0: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
c100: 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  ON t1.a=t2.x AND
c110: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
c120: 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (3)  SELECT * FR
c130: 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45 20  OM t1, t2 WHERE 
c140: 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74 32  t1.a=t2.x AND t2
c150: 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54 68  .z='ok'.**.** Th
c160: 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20 64  e t2.z='ok' is d
c170: 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20 69  isabled in the i
c180: 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69 74  n (2) because it
c190: 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20 69   originates.** i
c1a0: 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65 2e  n the ON clause.
c1b0: 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64 69    The term is di
c1c0: 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62 65  sabled in (3) be
c1d0: 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  cause it is not 
c1e0: 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45 46  part.** of a LEF
c1f0: 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20 49  T OUTER JOIN.  I
c200: 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d 20  n (1), the term 
c210: 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64 2e  is not disabled.
c220: 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e 67  .**.** Disabling
c230: 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20 74   a term causes t
c240: 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74 20  hat term to not 
c250: 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68 65  be tested in the
c260: 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20 6f   inner loop.** o
c270: 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69 73  f the join.  Dis
c280: 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70 74  abling is an opt
c290: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65 6e  imization.  When
c2a0: 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69 73   terms are satis
c2b0: 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69 63  fied.** by indic
c2c0: 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20 74  es, we disable t
c2d0: 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20 72  hem to prevent r
c2e0: 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20 69  edundant tests i
c2f0: 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20 6c  n the inner.** l
c300: 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20 67  oop.  We would g
c310: 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  et the correct r
c320: 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e  esults if nothin
c330: 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73 61  g were ever disa
c340: 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f 69  bled,.** but joi
c350: 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c  ns might run a l
c360: 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20 54  ittle slower.  T
c370: 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64  he trick is to d
c380: 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a 2a  isable as much.*
c390: 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68  * as we can with
c3a0: 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74 6f  out disabling to
c3b0: 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64  o much.  If we d
c3c0: 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20  isabled in (1), 
c3d0: 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65 20  we'd get.** the 
c3e0: 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20 53  wrong answer.  S
c3f0: 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e 0a  ee ticket #813..
c400: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
c410: 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72 65  isableTerm(Where
c420: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 57  Level *pLevel, W
c430: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 29  hereTerm *pTerm)
c440: 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20 20  {.  if( pTerm.  
c450: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 66      && (pTerm->f
c460: 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44 45  lags & TERM_CODE
c470: 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20 28  D)==0.      && (
c480: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
c490: 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50  n==0 || ExprHasP
c4a0: 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e 70  roperty(pTerm->p
c4b0: 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69  Expr, EP_FromJoi
c4c0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54 65  n)).  ){.    pTe
c4d0: 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
c4e0: 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66 28  M_CODED;.    if(
c4f0: 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 3e   pTerm->iParent>
c500: 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72  =0 ){.      Wher
c510: 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d 20  eTerm *pOther = 
c520: 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b 70  &pTerm->pWC->a[p
c530: 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b 0a  Term->iParent];.
c540: 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f 74        if( (--pOt
c550: 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30 20  her->nChild)==0 
c560: 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  ){.        disab
c570: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
c580: 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  Other);.      }.
c590: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c5a0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
c5b0: 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20 70   that builds a p
c5c0: 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64 65  robe for an inde
c5d0: 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a 0a  x.  Details:.**.
c5e0: 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20 74  **    *  Check t
c5f0: 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65  he top nColumn e
c600: 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73 74  ntries on the st
c610: 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a 20  ack.  If any.** 
c620: 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20 65        of those e
c630: 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c 2c  ntries are NULL,
c640: 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65 6c   jump immediatel
c650: 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20 20  y to brk,.**    
c660: 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65 20     which is the 
c670: 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63 65  loop exit, since
c680: 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79 20   no index entry 
c690: 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20 20  will match.**   
c6a0: 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74 20      if any part 
c6b0: 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e 55  of the key is NU
c6c0: 4c 4c 2e 20 50 6f 70 20 28 6e 43 6f 6c 75 6d 6e  LL. Pop (nColumn
c6d0: 2b 6e 45 78 74 72 61 29 20 0a 2a 2a 20 20 20 20  +nExtra) .**    
c6e0: 20 20 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f 6d     elements from
c6f0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
c700: 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72 75 63  *    *  Construc
c710: 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72 79 20  t a probe entry 
c720: 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e 43 6f  from the top nCo
c730: 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69 6e 0a  lumn entries in.
c740: 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 74 61  **       the sta
c750: 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69 74 69  ck with affiniti
c760: 65 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  es appropriate f
c770: 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e 20 0a  or index pIdx. .
c780: 2a 2a 20 20 20 20 20 20 20 4f 6e 6c 79 20 6e 43  **       Only nC
c790: 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74 73 20 61  olumn elements a
c7a0: 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74  re popped from t
c7b0: 68 65 20 73 74 61 63 6b 20 69 6e 20 74 68 69 73  he stack in this
c7c0: 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 28   case.**       (
c7d0: 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  by OP_MakeRecord
c7e0: 29 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  )..**.*/.static 
c7f0: 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78 50  void buildIndexP
c800: 72 6f 62 65 28 0a 20 20 56 64 62 65 20 2a 76 2c  robe(.  Vdbe *v,
c810: 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c   .  int nColumn,
c820: 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20   .  int nExtra, 
c830: 0a 20 20 69 6e 74 20 62 72 6b 2c 20 0a 20 20 49  .  int brk, .  I
c840: 6e 64 65 78 20 2a 70 49 64 78 0a 29 7b 0a 20 20  ndex *pIdx.){.  
c850: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c860: 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20  (v, OP_NotNull, 
c870: 2d 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65  -nColumn, sqlite
c880: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c890: 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65  (v)+3);.  sqlite
c8a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c8b0: 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 6e 45  _Pop, nColumn+nE
c8c0: 78 74 72 61 2c 20 30 29 3b 0a 20 20 73 71 6c 69  xtra, 0);.  sqli
c8d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c8e0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29  OP_Goto, 0, brk)
c8f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c900: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
c910: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
c920: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64  0);.  sqlite3Ind
c930: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
c940: 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   pIdx);.}.../*.*
c950: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
c960: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71 75  for a single equ
c970: 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
c980: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
c990: 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
c9a0: 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
c9b0: 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20 49  er X=expr or X I
c9c0: 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d  N (...).   pTerm
c9d0: 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f 20   is the term to 
c9e0: 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a 2a  be .** coded..**
c9f0: 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20  .** The current 
ca00: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63 6f  value for the co
ca10: 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66 74  nstraint is left
ca20: 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74   on the top of t
ca30: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  he stack..**.** 
ca40: 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e 74  For a constraint
ca50: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d 65   of the form X=e
ca60: 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73 73  xpr, the express
ca70: 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65 64  ion is evaluated
ca80: 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73 75   and its.** resu
ca90: 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68  lt is left on th
caa0: 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63 6f  e stack.  For co
cab0: 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68 65  nstraints of the
cac0: 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e 29   form X IN (...)
cad0: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
cae0: 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70 20   sets up a loop 
caf0: 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61 74  that will iterat
cb00: 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65  e over all value
cb10: 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  s of X..*/.stati
cb20: 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c  c void codeEqual
cb30: 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65  ityTerm(.  Parse
cb40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f   *pParse,      /
cb50: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
cb60: 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65  ntext */.  Where
cb70: 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 2f  Term *pTerm,   /
cb80: 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
cb90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
cba0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
cbb0: 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20  int brk,        
cbc0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
cbd0: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
cbe0: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c  loop */.  WhereL
cbf0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a  evel *pLevel  /*
cc00: 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
cc10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
cc20: 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
cc30: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
cc40: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  X = pTerm->pExpr
cc50: 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d  ;.  if( pX->op!=
cc60: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73  TK_IN ){.    ass
cc70: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
cc80: 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  EQ );.    sqlite
cc90: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cca0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23  , pX->pRight);.#
ccb0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ccc0: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65  IT_SUBQUERY.  }e
ccd0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61  lse{.    int iTa
cce0: 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e 3b  b;.    int *aIn;
ccf0: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
cd00: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
cd10: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
cd20: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
cd30: 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20  pX);.    iTab = 
cd40: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
cd50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cd60: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
cd70: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64 62  Tab, 0);.    Vdb
cd80: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
cd90: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
cda0: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
cdb0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e  .    pLevel->nIn
cdc0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 65  ++;.    sqliteRe
cdd0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f 69  allocOrFree((voi
cde0: 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e 61 49 6e  d**)&pLevel->aIn
cdf0: 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  Loop,.          
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 4c         sizeof(pL
ce20: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30 5d  evel->aInLoop[0]
ce30: 29 2a 32 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e 29  )*2*pLevel->nIn)
ce40: 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70 4c 65 76  ;.    aIn = pLev
ce50: 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20 20  el->aInLoop;.   
ce60: 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20 20 20   if( aIn ){.    
ce70: 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c 2d    aIn += pLevel-
ce80: 3e 6e 49 6e 2a 32 20 2d 20 32 3b 0a 20 20 20 20  >nIn*2 - 2;.    
ce90: 20 20 61 49 6e 5b 30 5d 20 3d 20 69 54 61 62 3b    aIn[0] = iTab;
cea0: 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d 20  .      aIn[1] = 
ceb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
cec0: 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69  (v, OP_Column, i
ced0: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Tab, 0);.    }el
cee0: 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  se{.      pLevel
cef0: 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  ->nIn = 0;.    }
cf00: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64 69  .#endif.  }.  di
cf10: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
cf20: 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  , pTerm);.}../*.
cf30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cf40: 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c 75   that will evalu
cf50: 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20 49  ate all == and I
cf60: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f  N constraints fo
cf70: 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20 20  r an.** index.  
cf80: 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20 61  The values for a
cf90: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
cfa0: 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20 73  re left on the s
cfb0: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  tack..**.** For 
cfc0: 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64 65  example, conside
cfd0: 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c 63  r table t1(a,b,c
cfe0: 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e 64  ,d,e,f) with ind
cff0: 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a 2a  ex i1(a,b,c)..**
d000: 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48 45   Suppose the WHE
d010: 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68 69  RE clause is thi
d020: 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20 49  s:  a==5 AND b I
d030: 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63 3e  N (1,2,3) AND c>
d040: 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54 68  5 AND c<10.** Th
d050: 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20 6d  e index has as m
d060: 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71 75  any as three equ
d070: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d080: 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a 2a  s, but in this.*
d090: 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 74  * example, the t
d0a0: 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20 69  hird "c" value i
d0b0: 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e  s an inequality.
d0c0: 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a 2a    So only two .*
d0d0: 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  * constraints ar
d0e0: 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20 72  e coded.  This r
d0f0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e 65  outine will gene
d100: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61  rate code to eva
d110: 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61 6e  luate.** a==5 an
d120: 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e 20  d b IN (1,2,3). 
d130: 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   The current val
d140: 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62 20  ues for a and b 
d150: 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a 20  will be left.** 
d160: 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20 61  on the stack - a
d170: 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74 20   is the deepest 
d180: 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c 6f  and b the shallo
d190: 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  west..**.** In t
d1a0: 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65  he example above
d1b0: 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74 68   nEq==2.  But th
d1c0: 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77 6f  is subroutine wo
d1d0: 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c 75  rks for any valu
d1e0: 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63 6c  e.** of nEq incl
d1f0: 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45 71  uding 0.  If nEq
d200: 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ==0, this routin
d210: 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e 6f  e is nearly a no
d220: 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79  -op..** The only
d230: 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20 69   thing it does i
d240: 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20 70  s allocate the p
d250: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d 6f  Level->iMem memo
d260: 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54  ry cell..**.** T
d270: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77 61  his routine alwa
d280: 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74 20  ys allocates at 
d290: 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72 79  least one memory
d2a0: 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a 2a   cell and puts.*
d2b0: 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  * the address of
d2c0: 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65 6c   that memory cel
d2d0: 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  l in pLevel->iMe
d2e0: 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68 61  m.  The code tha
d2f0: 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73 20  t.** calls this 
d300: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73 65  routine will use
d310: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74 6f   pLevel->iMem to
d320: 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d 69   store the termi
d330: 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76 61  nation.** key va
d340: 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  lue of the loop.
d350: 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    If one or more
d360: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61 70   IN operators ap
d370: 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  pear, then.** th
d380: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63  is routine alloc
d390: 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f 6e  ates an addition
d3a0: 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63 65  al nEq memory ce
d3b0: 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  lls for internal
d3c0: 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  .** use..*/.stat
d3d0: 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c 45  ic void codeAllE
d3e0: 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20 20  qualityTerms(.  
d3f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
d400: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d410: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
d420: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
d430: 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65 73  ,   /* Which nes
d440: 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
d450: 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64 69  FROM we are codi
d460: 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ng */.  WhereCla
d470: 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f 2a  use *pWC,     /*
d480: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
d490: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e  e */.  Bitmask n
d4a0: 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a 20  otReady,     /* 
d4b0: 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20 46  Which parts of F
d4c0: 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65 74  ROM have not yet
d4d0: 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a 20   been coded */. 
d4e0: 20 69 6e 74 20 62 72 6b 20 20 20 20 20 20 20 20   int brk        
d4f0: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
d500: 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20 6c  ere to end the l
d510: 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  oop */.){.  int 
d520: 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45  nEq = pLevel->nE
d530: 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  q;        /* The
d540: 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72   number of == or
d550: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   IN constraints 
d560: 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  to code */.  int
d570: 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 30 3b   termsInMem = 0;
d580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
d590: 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76 61 6c   true, store val
d5a0: 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c 6c  ue in mem[] cell
d5b0: 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d  s */.  Vdbe *v =
d5c0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20   pParse->pVdbe; 
d5d0: 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74       /* The virt
d5e0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64 65  ual machine unde
d5f0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a  r construction *
d600: 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20  /.  Index *pIdx 
d610: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 20  = pLevel->pIdx; 
d620: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 62    /* The index b
d630: 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74 68  eing used for th
d640: 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e 74  is loop */.  int
d650: 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e   iCur = pLevel->
d660: 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54 68  iTabCur;   /* Th
d670: 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65 20  e cursor of the 
d680: 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72 65  table */.  Where
d690: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20  Term *pTerm;    
d6a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
d6b0: 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74 20  ngle constraint 
d6c0: 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  term */.  int j;
d6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6e0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d6f0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f 2a  counter */..  /*
d700: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
d710: 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  many memory cell
d720: 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20 74  s we will need t
d730: 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68 65  hen allocate the
d740: 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77 61 79  m..  ** We alway
d750: 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73 74 20  s need at least 
d760: 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  one used to stor
d770: 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72 6d 69  e the loop termi
d780: 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c 75 65  nator.  ** value
d790: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
d7a0: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77 65 27  IN operators we'
d7b0: 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f 72 20  ll need one for 
d7c0: 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a 20  each == or.  ** 
d7d0: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  IN constraint.. 
d7e0: 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e 69 4d   */.  pLevel->iM
d7f0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
d800: 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c 65 76 65  m++;.  if( pLeve
d810: 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
d820: 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20 20  _COLUMN_IN ){.  
d830: 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b    pParse->nMem +
d840: 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a 20  = pLevel->nEq;. 
d850: 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20     termsInMem = 
d860: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76 61  1;.  }..  /* Eva
d870: 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c 69  luate the equali
d880: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20  ty constraints. 
d890: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
d8a0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
d8b0: 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b 20  j++){.    int k 
d8c0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
d8d0: 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  [j];.    pTerm =
d8e0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
d8f0: 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64 79  Cur, k, notReady
d900: 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70  , WO_EQ|WO_IN, p
d910: 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70 54  Idx);.    if( pT
d920: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
d930: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
d940: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
d950: 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20  _CODED)==0 );.  
d960: 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65    codeEqualityTe
d970: 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  rm(pParse, pTerm
d980: 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a  , brk, pLevel);.
d990: 20 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e 4d      if( termsInM
d9a0: 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  em ){.      sqli
d9b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d9c0: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
d9d0: 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20 31  vel->iMem+j+1, 1
d9e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  );.    }.  }.  a
d9f0: 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71 20 29 3b  ssert( j==nEq );
da00: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
da10: 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72 61   all the constra
da20: 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20 6f  int values are o
da30: 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  n the top of the
da40: 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69 66   stack.  */.  if
da50: 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a  ( termsInMem ){.
da60: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
da70: 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Eq; j++){.      
da80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
da90: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
daa0: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31  pLevel->iMem+j+1
dab0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
dac0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
dad0: 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
dae0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
daf0: 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20 61  variable holds a
db00: 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f   text descriptio
db10: 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e 20  n of query plan 
db20: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79 20  generated.** by 
db30: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
db40: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 57  call to sqlite3W
db50: 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45 61  hereBegin().  Ea
db60: 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72 65  ch call to Where
db70: 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72 69  Begin.** overwri
db80: 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75 73  tes the previous
db90: 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
dba0: 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 20  ion is used for 
dbb0: 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20 61  testing and.** a
dbc0: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
dbd0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71 75  .char sqlite3_qu
dbe0: 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a 34  ery_plan[BMS*2*4
dbf0: 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66 20  0];  /* Text of 
dc00: 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61 74  the join */.stat
dc10: 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d 20  ic int nQPlan = 
dc20: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
dc30: 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c 6f  /* Next free slo
dc40: 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61 6e  w in _query_plan
dc50: 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f 2a  [] */..#endif /*
dc60: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f 0a   SQLITE_TEST */.
dc70: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 57  ../*.** Free a W
dc80: 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74 75  hereInfo structu
dc90: 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  re.*/.static voi
dca0: 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28  d whereInfoFree(
dcb0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
dcc0: 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66 6f  o){.  if( pWInfo
dcd0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
dce0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57     for(i=0; i<pW
dcf0: 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Info->nLevel; i+
dd00: 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
dd10: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
dd20: 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 5b  nfo = pWInfo->a[
dd30: 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20  i].pIdxInfo;.   
dd40: 20 20 20 69 66 28 20 70 49 6e 66 6f 20 29 7b 0a     if( pInfo ){.
dd50: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 6e 66          if( pInf
dd60: 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78  o->needToFreeIdx
dd70: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Str ){.         
dd80: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
dd90: 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
dda0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ddb0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e 66 6f  sqliteFree(pInfo
ddc0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ddd0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
dde0: 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
ddf0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
de00: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
de10: 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
de20: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
de30: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
de40: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
de50: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
de60: 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
de70: 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
de80: 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
de90: 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
dea0: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
deb0: 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
dec0: 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
ded0: 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
dee0: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
def0: 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
df00: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
df10: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
df20: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
df30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
df40: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
df50: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
df60: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
df70: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
df80: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
df90: 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
dfa0: 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
dfb0: 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
dfc0: 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
dfd0: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
dfe0: 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
dff0: 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
e000: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
e010: 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
e020: 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
e030: 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
e040: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
e050: 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
e060: 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
e070: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
e080: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
e090: 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
e0a0: 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
e0b0: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
e0c0: 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
e0d0: 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
e0e0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
e0f0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
e100: 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
e110: 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
e120: 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
e130: 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
e140: 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
e150: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
e160: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
e170: 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
e180: 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
e190: 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
e1a0: 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
e1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
e1c0: 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
e1d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
e1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1f0: 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
e200: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
e210: 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
e240: 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
e250: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
e260: 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
e270: 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
e280: 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
e290: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
e2a0: 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
e2b0: 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
e2c0: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
e2d0: 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
e2e0: 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
e2f0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
e300: 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
e310: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
e320: 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
e330: 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
e340: 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
e350: 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
e360: 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
e370: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
e380: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
e390: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
e3a0: 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
e3b0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
e3c0: 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
e3d0: 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
e3e0: 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
e3f0: 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
e400: 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
e410: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
e420: 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
e430: 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
e440: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
e450: 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
e460: 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
e470: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
e480: 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
e490: 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
e4a0: 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
e4b0: 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
e4c0: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
e4d0: 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
e4e0: 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
e4f0: 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
e500: 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
e510: 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
e520: 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
e530: 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
e540: 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
e550: 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
e560: 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
e570: 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
e580: 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
e590: 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
e5a0: 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
e5b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
e5c0: 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
e5d0: 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
e5e0: 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
e5f0: 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
e600: 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
e610: 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
e620: 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
e630: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
e640: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
e650: 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
e660: 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
e670: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
e680: 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
e690: 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
e6a0: 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
e6b0: 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
e6c0: 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
e6d0: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
e6e0: 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
e6f0: 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
e700: 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
e710: 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
e720: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
e730: 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
e740: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
e750: 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
e760: 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
e770: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
e780: 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
e790: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
e7a0: 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
e7b0: 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
e7c0: 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
e7d0: 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
e7e0: 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
e7f0: 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
e800: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
e810: 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
e820: 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
e830: 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
e840: 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
e850: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
e860: 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
e870: 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
e880: 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
e890: 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
e8a0: 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
e8b0: 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
e8c0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
e8d0: 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
e8e0: 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
e8f0: 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
e900: 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
e910: 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
e920: 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
e930: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
e940: 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
e950: 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
e960: 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
e970: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
e980: 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
e990: 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
e9a0: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
e9b0: 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
e9c0: 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
e9d0: 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
e9e0: 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
e9f0: 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
ea00: 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
ea10: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
ea20: 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
ea30: 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
ea40: 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
ea50: 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
ea60: 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
ea70: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
ea80: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ea90: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
eaa0: 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
eab0: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
eac0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
ead0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
eae0: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
eaf0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
eb00: 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
eb10: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
eb20: 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79  , then ppOrderBy
eb30: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
eb40: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  If an index can 
eb50: 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20  be used so that 
eb60: 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70  the natural outp
eb70: 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ut order of the 
eb80: 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73  table.** scan is
eb90: 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65   correct for the
eba0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
ebb0: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65  , then that inde
ebc0: 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a  x is used and.**
ebd0: 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73   *ppOrderBy is s
ebe0: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  et to NULL.  Thi
ebf0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
ec00: 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e  tion that preven
ec10: 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73  ts an.** unneces
ec20: 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65  sary sort of the
ec30: 20 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61   result set if a
ec40: 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69  n index appropri
ec50: 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f  ate for the.** O
ec60: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
ec70: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a  lready exists..*
ec80: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72  *.** If the wher
ec90: 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63  e clause loops c
eca0: 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65  annot be arrange
ecb0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
ecc0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70   correct.** outp
ecd0: 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74  ut order, then t
ece0: 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  he *ppOrderBy is
ecf0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57   unchanged..*/.W
ed00: 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
ed10: 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
ed20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
ed30: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
ed40: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
ed50: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
ed60: 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
ed70: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
ed80: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
ed90: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
eda0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
edb0: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
edc0: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64  ExprList **ppOrd
edd0: 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45  erBy  /* An ORDE
ede0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
edf0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
ee00: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
ee10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
ee20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65  counter */.  Whe
ee30: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
ee40: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
ee50: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
ee60: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
ee70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
ee80: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
ee90: 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
eea0: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
eeb0: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74   engine */.  int
eec0: 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20   brk, cont = 0; 
eed0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
eee0: 73 73 65 73 20 75 73 65 64 20 64 75 72 69 6e 67  sses used during
eef0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
ef00: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
ef10: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
ef20: 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
ef30: 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
ef40: 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
ef50: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
ef60: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
ef70: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  gle term in the 
ef80: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
ef90: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61    ExprMaskSet ma
efa0: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  skSet;       /* 
efb0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
efc0: 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
efd0: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
efe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
eff0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 64  HERE clause is d
f000: 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73  ivided into thes
f010: 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  e terms */.  str
f020: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f030: 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
f040: 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66  A single entry f
f050: 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a  rom pTabList */.
f060: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
f070: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
f080: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
f090: 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66  vel in the pWInf
f0a0: 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o list */.  int 
f0b0: 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  iFrom;          
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
f0d0: 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d  irst unused FROM
f0e0: 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
f0f0: 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67  */.  int andFlag
f100: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
f110: 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e  /* AND-ed combin
f120: 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e  ation of all wc.
f130: 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  a[].flags */..  
f140: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
f150: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
f160: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
f170: 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
f180: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
f190: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
f1a0: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
f1b0: 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
f1c0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f1d0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
f1e0: 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
f1f0: 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
f200: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f210: 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74   }..  /* Split t
f220: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
f230: 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
f240: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
f250: 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
f260: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
f270: 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
f280: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
f290: 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26  .  initMaskSet(&
f2a0: 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
f2b0: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c  eClauseInit(&wc,
f2c0: 20 70 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72   pParse);.  wher
f2d0: 65 53 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65  eSplit(&wc, pWhe
f2e0: 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
f2f0: 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20   .  /* Allocate 
f300: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
f310: 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
f320: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
f330: 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
f340: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20   return value.. 
f350: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
f360: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
f370: 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b  eof(WhereInfo) +
f380: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a   pTabList->nSrc*
f390: 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
f3a0: 6c 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  l));.  if( sqlit
f3b0: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
f3c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
f3d0: 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20  reBeginNoMem;.  
f3e0: 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76  }.  pWInfo->nLev
f3f0: 65 6c 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 6e  el = pTabList->n
f400: 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  Src;.  pWInfo->p
f410: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
f420: 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
f430: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
f440: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
f450: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
f460: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
f470: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
f480: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
f490: 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
f4a0: 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
f4b0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
f4c0: 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
f4d0: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
f4e0: 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
f4f0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
f500: 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  re && (pTabList-
f510: 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nSrc==0 || sqli
f520: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
f530: 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  t(pWhere)) ){.  
f540: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
f550: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
f560: 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
f570: 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68  eak, 1);.    pWh
f580: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
f590: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
f5a0: 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
f5b0: 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74 68 61 74  ions.  Note that
f5c0: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d   exprAnalyze() m
f5d0: 69 67 68 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65  ight.  ** add ne
f5e0: 77 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20  w virtual terms 
f5f0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
f600: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
f610: 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a  .  We do not.  *
f620: 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a  * want to analyz
f630: 65 20 74 68 65 73 65 20 76 69 72 74 75 61 6c 20  e these virtual 
f640: 74 65 72 6d 73 2c 20 73 6f 20 73 74 61 72 74 20  terms, so start 
f650: 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20 74 68 65  analyzing at the
f660: 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f   end.  ** and wo
f670: 72 6b 20 66 6f 72 77 61 72 64 20 73 6f 20 74 68  rk forward so th
f680: 61 74 20 74 68 65 20 61 64 64 65 64 20 76 69 72  at the added vir
f690: 74 75 61 6c 20 74 65 72 6d 73 20 61 72 65 20 6e  tual terms are n
f6a0: 65 76 65 72 20 70 72 6f 63 65 73 73 65 64 2e 0a  ever processed..
f6b0: 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
f6c0: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
f6d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61  ; i++){.    crea
f6e0: 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  teMask(&maskSet,
f6f0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
f700: 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20  iCursor);.  }.  
f710: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
f720: 54 61 62 4c 69 73 74 2c 20 26 6d 61 73 6b 53 65  TabList, &maskSe
f730: 74 2c 20 26 77 63 29 3b 0a 20 20 69 66 28 20 73  t, &wc);.  if( s
f740: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
f750: 65 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ed() ){.    goto
f760: 20 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d   whereBeginNoMem
f770: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73  ;.  }..  /* Chos
f780: 65 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  e the best index
f790: 20 74 6f 20 75 73 65 20 66 6f 72 20 65 61 63 68   to use for each
f7a0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52   table in the FR
f7b0: 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a  OM clause..  **.
f7c0: 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66    ** This loop f
f7d0: 69 6c 6c 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ills in the foll
f7e0: 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20  owing fields:.  
f7f0: 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  **.  **   pWInfo
f800: 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20 20 20 20  ->a[].pIdx      
f810: 54 68 65 20 69 6e 64 65 78 20 74 6f 20 75 73 65  The index to use
f820: 20 66 6f 72 20 74 68 69 73 20 6c 65 76 65 6c 20   for this level 
f830: 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a  of the loop..  *
f840: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
f850: 66 6c 61 67 73 20 20 20 20 20 57 48 45 52 45 5f  flags     WHERE_
f860: 78 78 78 20 66 6c 61 67 73 20 61 73 73 6f 63 69  xxx flags associ
f870: 61 74 65 64 20 77 69 74 68 20 70 49 64 78 0a 20  ated with pIdx. 
f880: 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b   **   pWInfo->a[
f890: 5d 2e 6e 45 71 20 20 20 20 20 20 20 54 68 65 20  ].nEq       The 
f8a0: 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64  number of == and
f8b0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a   IN constraints.
f8c0: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
f8d0: 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20 57 68 65  [].iFrom     Whe
f8e0: 6e 20 74 65 72 6d 20 6f 66 20 74 68 65 20 46 52  n term of the FR
f8f0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 62 65 69  OM clause is bei
f900: 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20  ng coded.  **   
f910: 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62  pWInfo->a[].iTab
f920: 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20 63  Cur   The VDBE c
f930: 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 64 61  ursor for the da
f940: 74 61 62 61 73 65 20 74 61 62 6c 65 0a 20 20 2a  tabase table.  *
f950: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
f960: 69 49 64 78 43 75 72 20 20 20 54 68 65 20 56 44  iIdxCur   The VD
f970: 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  BE cursor for th
f980: 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a  e index.  **.  *
f990: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f  * This loop also
f9a0: 20 66 69 67 75 72 65 73 20 6f 75 74 20 74 68 65   figures out the
f9b0: 20 6e 65 73 74 69 6e 67 20 6f 72 64 65 72 20 6f   nesting order o
f9c0: 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  f tables in the 
f9d0: 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65  FROM.  ** clause
f9e0: 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64  ..  */.  notRead
f9f0: 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b  y = ~(Bitmask)0;
fa00: 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54  .  pTabItem = pT
fa10: 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65  abList->a;.  pLe
fa20: 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b  vel = pWInfo->a;
fa30: 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30  .  andFlags = ~0
fa40: 3b 0a 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20  ;.  TRACE(("*** 
fa50: 4f 70 74 69 6d 69 7a 65 72 20 53 74 61 72 74 20  Optimizer Start 
fa60: 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28  ***\n"));.  for(
fa70: 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65  i=iFrom=0, pLeve
fa80: 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
fa90: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
faa0: 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
fab0: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fad0: 2a 20 49 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d  * Index for FROM
fae0: 20 74 61 62 6c 65 20 61 74 20 70 54 61 62 49 74   table at pTabIt
faf0: 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c  em */.    int fl
fb00: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
fb10: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
fb20: 73 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  sssociated with 
fb30: 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pIdx */.    int 
fb40: 6e 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  nEq;            
fb50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fb60: 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f  r of == or IN co
fb70: 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20  nstraints */.   
fb80: 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b 20 20 20   double cost;   
fb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fba0: 54 68 65 20 63 6f 73 74 20 66 6f 72 20 70 49 64  The cost for pId
fbb0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20  x */.    int j; 
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbd0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
fbe0: 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d 20 74 61  ing over FROM ta
fbf0: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65  bles */.    Inde
fc00: 78 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 20 20  x *pBest = 0;   
fc10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
fc20: 65 73 74 20 69 6e 64 65 78 20 73 65 65 6e 20 73  est index seen s
fc30: 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74  o far */.    int
fc40: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20   bestFlags = 0; 
fc50: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
fc60: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
fc70: 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69  h pBest */.    i
fc80: 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20  nt bestNEq = 0; 
fc90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6e 45             /* nE
fca0: 71 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  q associated wit
fcb0: 68 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 64  h pBest */.    d
fcc0: 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74  ouble lowestCost
fcd0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
fce0: 73 74 20 6f 66 20 74 68 65 20 70 42 65 73 74 20  st of the pBest 
fcf0: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4a  */.    int bestJ
fd00: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
fd10: 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65 20     /* The value 
fd20: 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d  of j */.    Bitm
fd30: 61 73 6b 20 6d 3b 20 20 20 20 20 20 20 20 20 20  ask m;          
fd40: 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74 6d 61          /* Bitma
fd50: 73 6b 20 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f  sk value for j o
fd60: 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69  r bestJ */.    i
fd70: 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20  nt once = 0;    
fd80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
fd90: 75 65 20 77 68 65 6e 20 66 69 72 73 74 20 74 61  ue when first ta
fda0: 62 6c 65 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ble is seen */. 
fdb0: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
fdc0: 5f 69 6e 66 6f 20 2a 70 49 6e 64 65 78 3b 20 2f  _info *pIndex; /
fdd0: 2a 20 43 75 72 72 65 6e 74 20 76 69 72 74 75 61  * Current virtua
fde0: 6c 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 20 20  l index */..    
fdf0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c  lowestCost = SQL
fe00: 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 20  ITE_BIG_DBL;.   
fe10: 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70 54   for(j=iFrom, pT
fe20: 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73 74  abItem=&pTabList
fe30: 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c 69  ->a[j]; j<pTabLi
fe40: 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20 70  st->nSrc; j++, p
fe50: 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  TabItem++){.    
fe60: 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72 64    int doNotReord
fe70: 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69 66 20  er;  /* True if 
fe80: 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75 6c  this table shoul
fe90: 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65 72  d not be reorder
fea0: 65 64 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f 4e  ed */..      doN
feb0: 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70 54  otReorder =  (pT
fec0: 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  abItem->jointype
fed0: 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43   & (JT_LEFT|JT_C
fee0: 52 4f 53 53 29 29 21 3d 30 0a 20 20 20 20 20 20  ROSS))!=0.      
fef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
ff00: 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74 65  (j>0 && (pTabIte
ff10: 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26  m[-1].jointype &
ff20: 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52 4f   (JT_LEFT|JT_CRO
ff30: 53 53 29 29 21 3d 30 29 3b 0a 20 20 20 20 20 20  SS))!=0);.      
ff40: 69 66 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e 6f  if( once && doNo
ff50: 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61 6b  tReorder ) break
ff60: 3b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74 4d  ;.      m = getM
ff70: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
ff80: 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 29  abItem->iCursor)
ff90: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20 26  ;.      if( (m &
ffa0: 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29 7b   notReady)==0 ){
ffb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d  .        if( j==
ffc0: 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b 3b  iFrom ) iFrom++;
ffd0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
ffe0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
fff0: 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74 65   assert( pTabIte
10000 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e 64  m->pTab );.#ifnd
10010 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
10020 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
10030 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28    if( IsVirtual(
10040 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 29 20  pTabItem->pTab) 
10050 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
10060 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a  e3_index_info **
10070 70 70 49 64 78 49 6e 66 6f 20 3d 20 26 70 57 49  ppIdxInfo = &pWI
10080 6e 66 6f 2d 3e 61 5b 6a 5d 2e 70 49 64 78 49 6e  nfo->a[j].pIdxIn
10090 66 6f 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  fo;.        cost
100a0 20 3d 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e   = bestVirtualIn
100b0 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c  dex(pParse, &wc,
100c0 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
100d0 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
100e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100f0 20 20 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f       ppOrderBy ?
10100 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c   *ppOrderBy : 0,
10110 20 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20   i==0,.         
10120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10130 20 20 20 20 20 20 20 70 70 49 64 78 49 6e 66 6f         ppIdxInfo
10140 29 3b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  );.        flags
10150 20 3d 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c   = WHERE_VIRTUAL
10160 54 41 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 70  TABLE;.        p
10170 49 6e 64 65 78 20 3d 20 2a 70 70 49 64 78 49 6e  Index = *ppIdxIn
10180 66 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  fo;.        if( 
10190 70 49 6e 64 65 78 20 26 26 20 70 49 6e 64 65 78  pIndex && pIndex
101a0 2d 3e 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65  ->orderByConsume
101b0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  d ){.          f
101c0 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49 52  lags = WHERE_VIR
101d0 54 55 41 4c 54 41 42 4c 45 20 7c 20 57 48 45 52  TUALTABLE | WHER
101e0 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20 20 20  E_ORDERBY;.     
101f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 49 64     }.        pId
10200 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6e  x = 0;.        n
10210 45 71 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  Eq = 0;.      }e
10220 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20  lse .#endif.    
10230 20 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74    {.        cost
10240 20 3d 20 62 65 73 74 49 6e 64 65 78 28 70 50 61   = bestIndex(pPa
10250 72 73 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74  rse, &wc, pTabIt
10260 65 6d 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20  em, notReady,.  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10280 20 20 20 20 20 20 20 28 69 3d 3d 30 20 26 26 20         (i==0 && 
10290 70 70 4f 72 64 65 72 42 79 29 20 3f 20 2a 70 70  ppOrderBy) ? *pp
102a0 4f 72 64 65 72 42 79 20 3a 20 30 2c 0a 20 20 20  OrderBy : 0,.   
102b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102c0 20 20 20 20 20 20 26 70 49 64 78 2c 20 26 66 6c        &pIdx, &fl
102d0 61 67 73 2c 20 26 6e 45 71 29 3b 0a 20 20 20 20  ags, &nEq);.    
102e0 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
102f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10300 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f 73  ( cost<lowestCos
10310 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e 63  t ){.        onc
10320 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 6c  e = 1;.        l
10330 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
10340 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20  ;.        pBest 
10350 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20 20  = pIdx;.        
10360 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61 67  bestFlags = flag
10370 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74 4e  s;.        bestN
10380 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20 20  Eq = nEq;.      
10390 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20 20    bestJ = j;.   
103a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 42 65       pLevel->pBe
103b0 73 74 49 64 78 20 3d 20 70 49 6e 64 65 78 3b 0a  stIdx = pIndex;.
103c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
103d0 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29  ( doNotReorder )
103e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
103f0 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70    TRACE(("*** Op
10400 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74  timizer choose t
10410 61 62 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70  able %d for loop
10420 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20   %d\n", bestJ,. 
10430 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
10440 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20  -pWInfo->a));.  
10450 20 20 69 66 28 20 28 62 65 73 74 46 6c 61 67 73    if( (bestFlags
10460 20 26 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59   & WHERE_ORDERBY
10470 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  )!=0 ){.      *p
10480 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
10490 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73    }.    andFlags
104a0 20 26 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20   &= bestFlags;. 
104b0 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73     pLevel->flags
104c0 20 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20   = bestFlags;.  
104d0 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d    pLevel->pIdx =
104e0 20 70 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76   pBest;.    pLev
104f0 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45  el->nEq = bestNE
10500 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61  q;.    pLevel->a
10510 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20  InLoop = 0;.    
10520 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b  pLevel->nIn = 0;
10530 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 20 29  .    if( pBest )
10540 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  {.      pLevel->
10550 69 49 64 78 43 75 72 20 3d 20 70 50 61 72 73 65  iIdxCur = pParse
10560 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65  ->nTab++;.    }e
10570 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
10580 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b  l->iIdxCur = -1;
10590 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65  .    }.    notRe
105a0 61 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28  ady &= ~getMask(
105b0 26 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69  &maskSet, pTabLi
105c0 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75  st->a[bestJ].iCu
105d0 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65  rsor);.    pLeve
105e0 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a  l->iFrom = bestJ
105f0 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22  ;.  }.  TRACE(("
10600 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69  *** Optimizer Fi
10610 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b  nished ***\n"));
10620 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f  ..  /* If the to
10630 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73  tal query only s
10640 65 6c 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20  elects a single 
10650 72 6f 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52  row, then the OR
10660 44 45 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75  DER BY.  ** clau
10670 73 65 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74  se is irrelevant
10680 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e  ..  */.  if( (an
10690 64 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55  dFlags & WHERE_U
106a0 4e 49 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f  NIQUE)!=0 && ppO
106b0 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70  rderBy ){.    *p
106c0 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20  pOrderBy = 0;.  
106d0 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
106e0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
106f0 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
10700 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
10710 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
10720 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
10730 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
10740 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10750 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
10760 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
10770 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
10780 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70   */.  for(i=0, p
10790 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
107a0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
107b0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
107c0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
107d0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
107e0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
107f0 49 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20  Index *pIx;     
10800 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
10810 6f 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69  o access pTab (i
10820 66 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e  f any) */.    in
10830 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
10840 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
10850 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
10860 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
10870 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
10880 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
10890 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
108a0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
108b0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
108c0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
108d0 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
108e0 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
108f0 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
10900 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
10910 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
10920 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
10930 65 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45  e3MPrintf("TABLE
10940 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
10950 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
10960 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
10970 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
10980 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
10990 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  z AS %s", zMsg, 
109a0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
109b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
109c0 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
109d0 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
109e0 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
109f0 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57  te3MPrintf("%z W
10a00 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a  ITH INDEX %s", z
10a10 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  Msg, pIx->zName)
10a20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10a30 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
10a40 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
10a50 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
10a60 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NGE) ){.        
10a70 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
10a80 72 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20  rintf("%z USING 
10a90 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
10aa0 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  sg);.      }.#if
10ab0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10ac0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
10ad0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65      else if( pLe
10ae0 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b  vel->pBestIdx ){
10af0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10b00 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 42 65  _index_info *pBe
10b10 73 74 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  stIdx = pLevel->
10b20 70 42 65 73 74 49 64 78 3b 0a 20 20 20 20 20 20  pBestIdx;.      
10b30 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
10b40 4d 50 72 69 6e 74 66 28 22 25 7a 20 56 49 52 54  MPrintf("%z VIRT
10b50 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
10b60 25 64 3a 25 73 22 2c 20 7a 4d 73 67 2c 0a 20 20  %d:%s", zMsg,.  
10b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b80 20 20 70 42 65 73 74 49 64 78 2d 3e 69 64 78 4e    pBestIdx->idxN
10b90 75 6d 2c 20 70 42 65 73 74 49 64 78 2d 3e 69 64  um, pBestIdx->id
10ba0 78 53 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23  xStr);.      }.#
10bb0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
10bc0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
10bd0 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b  WHERE_ORDERBY ){
10be0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
10bf0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
10c00 25 7a 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d  %z ORDER BY", zM
10c10 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
10c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10c30 33 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c  3(v, OP_Explain,
10c40 20 69 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f   i, pLevel->iFro
10c50 6d 2c 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41  m, zMsg, P3_DYNA
10c60 4d 49 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  MIC);.    }.#end
10c70 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
10c80 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20  T_EXPLAIN */.   
10c90 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
10ca0 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
10cb0 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61  >iFrom];.    pTa
10cc0 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
10cd0 61 62 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71  ab;.    iDb = sq
10ce0 6c 69 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64  lite3SchemaToInd
10cf0 65 78 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70  ex(pParse->db, p
10d00 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
10d10 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45     if( pTab->isE
10d20 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53  phem || pTab->pS
10d30 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
10d40 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
10d50 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
10d60 4c 45 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  LE.    if( pLeve
10d70 6c 2d 3e 70 42 65 73 74 49 64 78 20 29 7b 0a 20  l->pBestIdx ){. 
10d80 20 20 20 20 20 69 6e 74 20 69 43 75 72 20 3d 20       int iCur = 
10d90 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
10da0 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
10db0 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 4f  VdbeOp3(v, OP_VO
10dc0 70 65 6e 2c 20 69 43 75 72 2c 20 30 2c 20 28 63  pen, iCur, 0, (c
10dd0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 61 62 2d  onst char*)pTab-
10de0 3e 70 56 74 61 62 2c 20 50 33 5f 56 54 41 42 29  >pVtab, P3_VTAB)
10df0 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
10e00 69 66 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76  if.    if( (pLev
10e10 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
10e20 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29  E_IDX_ONLY)==0 )
10e30 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
10e40 70 65 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c  penTable(pParse,
10e50 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
10e60 6f 72 2c 20 69 44 62 2c 20 70 54 61 62 2c 20 4f  or, iDb, pTab, O
10e70 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20 20  P_OpenRead);.   
10e80 20 20 20 69 66 28 20 70 54 61 62 2d 3e 6e 43 6f     if( pTab->nCo
10e90 6c 3c 28 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  l<(sizeof(Bitmas
10ea0 6b 29 2a 38 29 20 29 7b 0a 20 20 20 20 20 20 20  k)*8) ){.       
10eb0 20 42 69 74 6d 61 73 6b 20 62 20 3d 20 70 54 61   Bitmask b = pTa
10ec0 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a  bItem->colUsed;.
10ed0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
10ee0 30 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 3b  0;.        for(;
10ef0 20 62 3b 20 62 3d 62 3e 3e 31 2c 20 6e 2b 2b 29   b; b=b>>1, n++)
10f00 7b 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  {}.        sqlit
10f10 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
10f20 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
10f30 72 65 6e 74 41 64 64 72 28 76 29 2d 31 2c 20 6e  rentAddr(v)-1, n
10f40 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
10f50 74 28 20 6e 3c 3d 70 54 61 62 2d 3e 6e 43 6f 6c  t( n<=pTab->nCol
10f60 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
10f70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
10f80 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
10f90 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
10fa0 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
10fb0 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
10fc0 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
10fd0 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
10fe0 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28  ursor;.    if( (
10ff0 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
11000 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
11010 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 20 3d 20  KeyInfo *pKey = 
11020 73 71 6c 69 74 65 33 49 6e 64 65 78 4b 65 79 69  sqlite3IndexKeyi
11030 6e 66 6f 28 70 50 61 72 73 65 2c 20 70 49 78 29  nfo(pParse, pIx)
11040 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11050 70 49 78 2d 3e 70 53 63 68 65 6d 61 3d 3d 70 54  pIx->pSchema==pT
11060 61 62 2d 3e 70 53 63 68 65 6d 61 20 29 3b 0a 20  ab->pSchema );. 
11070 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11080 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
11090 67 65 72 2c 20 69 44 62 2c 20 30 29 3b 0a 20 20  ger, iDb, 0);.  
110a0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
110b0 28 76 2c 20 22 23 20 25 73 22 2c 20 70 49 78 2d  (v, "# %s", pIx-
110c0 3e 7a 4e 61 6d 65 29 29 3b 0a 20 20 20 20 20 20  >zName));.      
110d0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
110e0 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69  , OP_OpenRead, i
110f0 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 74 6e 75  IdxCur, pIx->tnu
11100 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m,.             
11110 20 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 70          (char*)p
11120 4b 65 79 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 5f  Key, P3_KEYINFO_
11130 48 41 4e 44 4f 46 46 29 3b 0a 20 20 20 20 7d 0a  HANDOFF);.    }.
11140 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
11150 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
11160 44 58 5f 4f 4e 4c 59 29 21 3d 30 20 29 7b 0a 20  DX_ONLY)!=0 ){. 
11170 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11180 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
11190 75 6d 43 6f 6c 75 6d 6e 73 2c 20 69 49 64 78 43  umColumns, iIdxC
111a0 75 72 2c 20 70 49 78 2d 3e 6e 43 6f 6c 75 6d 6e  ur, pIx->nColumn
111b0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  +1);.    }.    s
111c0 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66 79  qlite3CodeVerify
111d0 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20 69  Schema(pParse, i
111e0 44 62 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66  Db);.  }.  pWInf
111f0 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65  o->iTop = sqlite
11200 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
11210 28 76 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  (v);..  /* Gener
11220 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  ate the code to 
11230 64 6f 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  do the search.  
11240 45 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20 6f  Each iteration o
11250 66 20 74 68 65 20 66 6f 72 0a 20 20 2a 2a 20 6c  f the for.  ** l
11260 6f 6f 70 20 62 65 6c 6f 77 20 67 65 6e 65 72 61  oop below genera
11270 74 65 73 20 63 6f 64 65 20 66 6f 72 20 61 20 73  tes code for a s
11280 69 6e 67 6c 65 20 6e 65 73 74 65 64 20 6c 6f 6f  ingle nested loo
11290 70 20 6f 66 20 74 68 65 20 56 4d 0a 20 20 2a 2a  p of the VM.  **
112a0 20 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20   program..  */. 
112b0 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
112c0 74 6d 61 73 6b 29 30 3b 0a 20 20 66 6f 72 28 69  tmask)0;.  for(i
112d0 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66  =0, pLevel=pWInf
112e0 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  o->a; i<pTabList
112f0 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65  ->nSrc; i++, pLe
11300 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  vel++){.    int 
11310 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72 20  j;.    int iCur 
11320 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72  = pTabItem->iCur
11330 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56 44 42  sor;  /* The VDB
11340 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
11350 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 49 6e   table */.    In
11360 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
11370 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 77 65   /* The index we
11380 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 20 2a   will be using *
11390 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
113a0 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r;       /* The 
113b0 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20  VDBE cursor for 
113c0 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
113d0 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65 3b 20   int omitTable; 
113e0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
113f0 65 20 75 73 65 20 74 68 65 20 69 6e 64 65 78 20  e use the index 
11400 6f 6e 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  only */.    int 
11410 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 2f  bRev;          /
11420 2a 20 54 72 75 65 20 69 66 20 77 65 20 6e 65 65  * True if we nee
11430 64 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  d to scan in rev
11440 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 0a 20  erse order */.. 
11450 20 20 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70     pTabItem = &p
11460 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
11470 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 69  l->iFrom];.    i
11480 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  Cur = pTabItem->
11490 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 49 64  iCursor;.    pId
114a0 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
114b0 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20 3d 20  ;.    iIdxCur = 
114c0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
114d0 0a 20 20 20 20 62 52 65 76 20 3d 20 28 70 4c 65  .    bRev = (pLe
114e0 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
114f0 52 45 5f 52 45 56 45 52 53 45 29 21 3d 30 3b 0a  RE_REVERSE)!=0;.
11500 20 20 20 20 6f 6d 69 74 54 61 62 6c 65 20 3d 20      omitTable = 
11510 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
11520 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
11530 21 3d 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  !=0;..    /* Cre
11540 61 74 65 20 6c 61 62 65 6c 73 20 66 6f 72 20 74  ate labels for t
11550 68 65 20 22 62 72 65 61 6b 22 20 61 6e 64 20 22  he "break" and "
11560 63 6f 6e 74 69 6e 75 65 22 20 69 6e 73 74 72 75  continue" instru
11570 63 74 69 6f 6e 73 0a 20 20 20 20 2a 2a 20 66 6f  ctions.    ** fo
11580 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  r the current lo
11590 6f 70 2e 20 20 4a 75 6d 70 20 74 6f 20 62 72 6b  op.  Jump to brk
115a0 20 74 6f 20 62 72 65 61 6b 20 6f 75 74 20 6f 66   to break out of
115b0 20 61 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2a 20   a loop..    ** 
115c0 4a 75 6d 70 20 74 6f 20 63 6f 6e 74 20 74 6f 20  Jump to cont to 
115d0 67 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  go immediately t
115e0 6f 20 74 68 65 20 6e 65 78 74 20 69 74 65 72 61  o the next itera
115f0 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 20 20  tion of the.    
11600 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 2a 2f 0a  ** loop..    */.
11610 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c      brk = pLevel
11620 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  ->brk = sqlite3V
11630 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
11640 0a 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76  .    cont = pLev
11650 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74  el->cont = sqlit
11660 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
11670 76 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  v);..    /* If t
11680 68 69 73 20 69 73 20 74 68 65 20 72 69 67 68 74  his is the right
11690 20 74 61 62 6c 65 20 6f 66 20 61 20 4c 45 46 54   table of a LEFT
116a0 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c   OUTER JOIN, all
116b0 6f 63 61 74 65 20 61 6e 64 0a 20 20 20 20 2a 2a  ocate and.    **
116c0 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6d 65   initialize a me
116d0 6d 6f 72 79 20 63 65 6c 6c 20 74 68 61 74 20 72  mory cell that r
116e0 65 63 6f 72 64 73 20 69 66 20 74 68 69 73 20 74  ecords if this t
116f0 61 62 6c 65 20 6d 61 74 63 68 65 73 20 61 6e 79  able matches any
11700 0a 20 20 20 20 2a 2a 20 72 6f 77 20 6f 66 20 74  .    ** row of t
11710 68 65 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66  he left table of
11720 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a   the join..    *
11730 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  /.    if( pLevel
11740 2d 3e 69 46 72 6f 6d 3e 30 20 26 26 20 28 70 54  ->iFrom>0 && (pT
11750 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74  abItem[-1].joint
11760 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d  ype & JT_LEFT)!=
11770 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  0 ){.      if( !
11780 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70  pParse->nMem ) p
11790 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
117a0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65       pLevel->iLe
117b0 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d  ftJoin = pParse-
117c0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73  >nMem++;.      s
117d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
117e0 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20 30 2c  v, OP_MemInt, 0,
117f0 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
11800 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43  in);.      VdbeC
11810 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e  omment((v, "# in
11820 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
11830 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
11840 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
11850 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
11860 4c 54 41 42 4c 45 0a 20 20 20 20 69 66 28 20 70  LTABLE.    if( p
11870 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 20  Level->pBestIdx 
11880 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
11890 20 30 3a 20 20 54 68 65 20 74 61 62 6c 65 20 69   0:  The table i
118a0 73 20 61 20 76 69 72 74 75 61 6c 2d 74 61 62 6c  s a virtual-tabl
118b0 65 2e 20 20 55 73 65 20 74 68 65 20 56 46 69 6c  e.  Use the VFil
118c0 74 65 72 20 61 6e 64 20 56 4e 65 78 74 0a 20 20  ter and VNext.  
118d0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
118e0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
118f0 74 61 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ta..      */.   
11900 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
11910 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
11920 66 6f 20 2a 70 42 65 73 74 49 64 78 20 3d 20 70  fo *pBestIdx = p
11930 4c 65 76 65 6c 2d 3e 70 42 65 73 74 49 64 78 3b  Level->pBestIdx;
11940 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6e 73  .      int nCons
11950 74 72 61 69 6e 74 20 3d 20 70 42 65 73 74 49 64  traint = pBestId
11960 78 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 0a  x->nConstraint;.
11970 20 20 20 20 20 20 73 74 72 75 63 74 20 73 71 6c        struct sql
11980 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
11990 72 61 69 6e 74 5f 75 73 61 67 65 20 2a 61 55 73  raint_usage *aUs
119a0 61 67 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20  age =.          
119b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
119d0 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
119e0 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61  ->aConstraintUsa
119f0 67 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ge;.      const 
11a00 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11a10 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20  ndex_constraint 
11a20 2a 61 43 6f 6e 73 74 72 61 69 6e 74 20 3d 0a 20  *aConstraint =. 
11a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a60 20 70 42 65 73 74 49 64 78 2d 3e 61 43 6f 6e 73   pBestIdx->aCons
11a70 74 72 61 69 6e 74 3b 0a 0a 20 20 20 20 20 20 66  traint;..      f
11a80 6f 72 28 6a 3d 31 3b 20 6a 3c 3d 6e 43 6f 6e 73  or(j=1; j<=nCons
11a90 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20  traint; j++){.  
11aa0 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
11ab0 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
11ac0 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6b 2b 2b  nConstraint; k++
11ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11ae0 20 61 55 73 61 67 65 5b 6b 5d 2e 61 72 67 76 49   aUsage[k].argvI
11af0 6e 64 65 78 3d 3d 6a 20 29 7b 0a 20 20 20 20 20  ndex==j ){.     
11b00 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72 6d         int iTerm
11b10 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 6b   = aConstraint[k
11b20 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20  ].iTermOffset;. 
11b30 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
11b40 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
11b50 65 2c 20 77 63 2e 61 5b 69 54 65 72 6d 5d 2e 70  e, wc.a[iTerm].p
11b60 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
11b70 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11b80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11b90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ba0 69 66 28 20 6b 3d 3d 6e 43 6f 6e 73 74 72 61 69  if( k==nConstrai
11bb0 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  nt ) break;.    
11bc0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
11bd0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11be0 5f 49 6e 74 65 67 65 72 2c 20 6a 2d 31 2c 20 30  _Integer, j-1, 0
11bf0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11c00 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11c10 49 6e 74 65 67 65 72 2c 20 70 42 65 73 74 49 64  Integer, pBestId
11c20 78 2d 3e 69 64 78 4e 75 6d 2c 20 30 29 3b 0a 20  x->idxNum, 0);. 
11c30 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11c40 4f 70 33 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65  Op3(v, OP_VFilte
11c50 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20 70 42  r, iCur, brk, pB
11c60 65 73 74 49 64 78 2d 3e 69 64 78 53 74 72 2c 0a  estIdx->idxStr,.
11c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c80 20 20 20 20 20 20 70 42 65 73 74 49 64 78 2d 3e        pBestIdx->
11c90 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
11ca0 20 3f 20 50 33 5f 4d 50 52 49 4e 54 46 20 3a 20   ? P3_MPRINTF : 
11cb0 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
11cc0 20 20 70 42 65 73 74 49 64 78 2d 3e 6e 65 65 64    pBestIdx->need
11cd0 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d 20 30  ToFreeIdxStr = 0
11ce0 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
11cf0 20 6a 3c 70 42 65 73 74 49 64 78 2d 3e 6e 43 6f   j<pBestIdx->nCo
11d00 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a  nstraint; j++){.
11d10 20 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61          if( aUsa
11d20 67 65 5b 6a 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20  ge[j].omit ){.  
11d30 20 20 20 20 20 20 20 20 69 6e 74 20 69 54 65 72          int iTer
11d40 6d 20 3d 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b  m = aConstraint[
11d50 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  j].iTermOffset;.
11d60 20 20 20 20 20 20 20 20 20 20 64 69 73 61 62 6c            disabl
11d70 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 77  eTerm(pLevel, &w
11d80 63 2e 61 5b 69 54 65 72 6d 5d 29 3b 0a 20 20 20  c.a[iTerm]);.   
11d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11da0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
11db0 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
11dc0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
11dd0 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
11de0 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
11df0 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11e00 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
11e10 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
11e20 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
11e30 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76  */..    if( pLev
11e40 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
11e50 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
11e60 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
11e70 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
11e80 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
11e90 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
11ea0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
11eb0 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
11ec0 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
11ed0 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
11ee0 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  Or.      **     
11ef0 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
11f00 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
11f10 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
11f20 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a  N (...)".      *
11f30 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
11f40 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ruct..      */. 
11f50 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
11f60 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
11f70 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
11f80 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
11f90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
11fa0 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  erm!=0 );.      
11fb0 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
11fc0 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
11fd0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
11fe0 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
11ff0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
12000 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
12010 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75 61  ;.      codeEqua
12020 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
12030 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65   pTerm, brk, pLe
12040 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  vel);.      sqli
12050 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12060 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c  OP_MustBeInt, 1,
12070 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c   brk);.      sql
12080 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12090 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
120a0 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
120b0 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
120c0 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70   "pk"));.      p
120d0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
120e0 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
120f0 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
12100 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
12110 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
12120 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76   Case 2:  We hav
12130 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
12140 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
12150 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
12160 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
12170 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
12180 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69  OP_Noop;.      i
12190 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20  nt start;.      
121a0 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
121b0 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20  t, *pEnd;..     
121c0 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
121d0 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  le==0 );.      p
121e0 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
121f0 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
12200 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
12210 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20  WO_GE, 0);.     
12220 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d   pEnd = findTerm
12230 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
12240 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
12250 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20  WO_LE, 0);.     
12260 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
12270 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
12280 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74  art;.        pSt
12290 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
122a0 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
122b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
122c0 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
122d0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
122e0 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74          pX = pSt
122f0 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
12300 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
12310 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
12320 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
12330 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
12340 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12350 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
12360 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
12370 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12380 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72  eAddOp(v, OP_For
12390 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54  ceInt, pX->op==T
123a0 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LE || pX->op==
123b0 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20  TK_GT, brk);.   
123c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
123d0 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20  AddOp(v, bRev ? 
123e0 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d  OP_MoveLt : OP_M
123f0 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b  oveGe, iCur, brk
12400 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
12410 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
12420 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  );.        disab
12430 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
12440 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65  Start);.      }e
12450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12460 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
12470 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
12480 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
12490 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
124a0 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20  .      if( pEnd 
124b0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
124c0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20  *pX;.        pX 
124d0 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
124e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
124f0 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
12500 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65  assert( pEnd->le
12510 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
12520 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
12530 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
12540 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
12550 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
12560 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
12570 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71  em++;.        sq
12580 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12590 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
125a0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
125b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d  .        if( pX-
125c0 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
125d0 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
125e0 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
125f0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
12600 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20   OP_Ge;.        
12610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12620 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
12630 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
12640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12650 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
12660 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
12670 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
12680 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
12690 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
126a0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
126b0 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
126c0 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
126d0 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
126e0 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
126f0 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
12700 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
12710 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
12720 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12730 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
12740 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
12750 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12760 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
12770 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
12780 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
12790 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
127a0 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f   testOp, SQLITE_
127b0 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72 6b  AFF_NUMERIC, brk
127c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
127d0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
127e0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  >flags & WHERE_C
127f0 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
12800 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
12810 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
12820 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65 72   term that refer
12830 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
12840 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ost.      **    
12850 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74       column of t
12860 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  he index is an i
12870 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72 20  nequality.  For 
12880 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20  example, if.    
12890 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
128a0 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
128b0 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48 45  y,z) and the WHE
128c0 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  RE clause is of 
128d0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
128e0 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20 41       form "x=5 A
128f0 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74 68  ND y<10" then th
12900 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64 2e  is case is used.
12910 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20    Only the.     
12920 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67 68   **         righ
12930 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
12940 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
12950 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
12960 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
12970 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
12980 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
12990 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ors..      **.  
129a0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
129b0 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
129c0 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
129d0 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
129e0 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ause.      **   
129f0 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
12a00 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
12a10 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
12a20 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
12a30 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
12a40 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
12a50 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
12a60 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
12a70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12a80 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
12a90 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
12aa0 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69  el->nEq;.      i
12ab0 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20 20  nt topEq=0;     
12ac0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f     /* True if to
12ad0 70 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e  p limit uses ==.
12ae0 20 46 61 6c 73 65 20 69 73 20 73 74 72 69 63 74   False is strict
12af0 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ly < */.      in
12b00 74 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20 20  t btmEq=0;      
12b10 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74 6d    /* True if btm
12b20 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20   limit uses ==. 
12b30 46 61 6c 73 65 20 69 66 20 73 74 72 69 63 74 6c  False if strictl
12b40 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  y > */.      int
12b50 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20   topOp, btmOp;  
12b60 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66 6f   /* Operators fo
12b70 72 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62 6f  r the top and bo
12b80 74 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75 6e  ttom search boun
12b90 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ds */.      int 
12ba0 74 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e  testOp;.      in
12bb0 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  t nNotNull;     
12bc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
12bd0 6f 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68 61  ows of index tha
12be0 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55  t must be non-NU
12bf0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  LL */.      int 
12c00 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76  topLimit = (pLev
12c10 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
12c20 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b  E_TOP_LIMIT)!=0;
12c30 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69  .      int btmLi
12c40 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
12c50 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
12c60 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20  _LIMIT)!=0;..   
12c70 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12c80 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
12c90 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
12ca0 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
12cb0 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
12cc0 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65   level the value
12cd0 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
12ce0 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
12cf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
12d00 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
12d10 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  ms(pParse, pLeve
12d20 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79  l, &wc, notReady
12d30 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f  , brk);..      /
12d40 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
12d50 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61  equality term va
12d60 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65  lues because the
12d70 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20  y will all be.  
12d80 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63      ** used twic
12d90 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  e: once to make 
12da0 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
12db0 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20  key and once to 
12dc0 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a  make the.      *
12dd0 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  * start key..   
12de0 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
12df0 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
12e00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
12e10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12e20 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29 3b  _Dup, nEq-1, 0);
12e30 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
12e40 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
12e50 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  at comparison op
12e60 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20 66  erators to use f
12e70 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f  or top and botto
12e80 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61 72  m .      ** sear
12e90 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20 61  ch bounds. For a
12ea0 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12eb0 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62 6f  x, the bottom bo
12ec0 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e 3d  und is a > or >=
12ed0 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
12ee0 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20 62  or and the top b
12ef0 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20 3c  ound is a < or <
12f00 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f 72  = operator.  For
12f10 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20   a descending.  
12f20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68 65      ** index the
12f30 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 72   operators are r
12f40 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20 2a  eversed..      *
12f50 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c 6c  /.      nNotNull
12f60 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69   = nEq + topLimi
12f70 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  t;.      if( pId
12f80 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
12f90 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
12fa0 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  C ){.        top
12fb0 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  Op = WO_LT|WO_LE
12fc0 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
12fd0 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
12fe0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12ff0 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47      topOp = WO_G
13000 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20  T|WO_GE;.       
13010 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   btmOp = WO_LT|W
13020 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57  O_LE;.        SW
13030 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74  AP(int, topLimit
13040 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20  , btmLimit);.   
13050 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
13060 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d  enerate the term
13070 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68  ination key.  Th
13080 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61  is is the key va
13090 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lue that.      *
130a0 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73  * will end the s
130b0 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
130c0 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   no termination 
130d0 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20  key if there.   
130e0 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75     ** are no equ
130f0 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
13100 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e  no "X<..." term.
13110 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
13120 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
13130 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  On a reverse-ord
13140 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d  er scan, the so-
13150 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74  called "terminat
13160 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65  ion".      ** ke
13170 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20  y computed here 
13180 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
13190 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b  eing the start k
131a0 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
131b0 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20     if( topLimit 
131c0 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
131d0 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
131e0 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
131f0 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
13200 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
13210 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
13220 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20  otReady, topOp, 
13230 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
13240 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
13250 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
13260 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
13270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
13280 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
13290 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
132a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
132b0 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
132c0 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
132d0 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54 65       topEq = pTe
132e0 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
132f0 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
13300 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
13310 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
13320 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  );.        testO
13330 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20  p = OP_IdxGE;.  
13340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13350 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e     testOp = nEq>
13360 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f  0 ? OP_IdxGE : O
13370 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
13380 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  topEq = 1;.     
13390 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65 73   }.      if( tes
133a0 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
133b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
133c0 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69   = nEq + topLimi
133d0 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  t;.        pLeve
133e0 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
133f0 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
13400 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
13410 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c 20  e(v, nCol, nEq, 
13420 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
13430 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
13440 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
13450 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f   = topEq ? OP_Mo
13460 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74  veLe : OP_MoveLt
13470 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13480 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13490 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  op, iIdxCur, brk
134a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
134b0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
134c0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
134d0 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
134e0 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
134f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13500 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
13510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13520 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13530 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62  Last, iIdxCur, b
13540 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
13550 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
13560 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20  the start key.  
13570 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20  This is the key 
13580 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
13590 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20   lower.      ** 
135a0 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61  bound on the sea
135b0 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e  rch.  There is n
135c0 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20 74  o start key if t
135d0 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20  here are no.    
135e0 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65    ** equality te
135f0 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72 65  rms and if there
13600 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74   is no "X>..." t
13610 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a  erm.  In.      *
13620 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e  * that case, gen
13630 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64 22  erate a "Rewind"
13640 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
13650 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20  place of the.   
13660 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20     ** start key 
13670 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a  search..      **
13680 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44  .      ** 2002-D
13690 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61  ec-04: In the ca
136a0 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d  se of a reverse-
136b0 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74 68  order search, th
136c0 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20  e so-called.    
136d0 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79    ** "start" key
136e0 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
136f0 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68  being used as th
13700 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
13710 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
13720 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29    if( btmLimit )
13730 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
13740 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
13750 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
13760 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
13770 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
13780 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
13790 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70  tReady, btmOp, p
137a0 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
137b0 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
137c0 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
137d0 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
137e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
137f0 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
13800 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
13810 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
13820 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
13830 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
13840 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72      btmEq = pTer
13850 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
13860 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
13870 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
13880 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
13890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
138a0 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31         btmEq = 1
138b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
138c0 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d  if( nEq>0 || btm
138d0 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
138e0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20   int nCol = nEq 
138f0 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20  + btmLimit;.    
13900 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
13910 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c 20  obe(v, nCol, 0, 
13920 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
13930 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
13940 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
13950 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
13960 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
13970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13980 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13990 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
139a0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
139b0 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c  testOp = OP_IdxL
139c0 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
139d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
139e0 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f  op = btmEq ? OP_
139f0 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
13a00 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
13a10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13a20 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
13a30 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rk);.        }. 
13a40 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
13a50 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
13a60 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
13a70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13a80 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a90 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
13aa0 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
13ab0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
13ac0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
13ad0 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
13ae0 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
13af0 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
13b00 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
13b10 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
13b20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
13b30 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
13b40 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
13b50 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
13b60 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
13b70 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13b80 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
13b90 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
13ba0 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
13bb0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13bc0 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
13bd0 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
13be0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13bf0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
13c00 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72  tOp, iIdxCur, br
13c10 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
13c20 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76 29  (topEq && !bRev)
13c30 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20 62   || (!btmEq && b
13c40 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rev) ){.        
13c50 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
13c60 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22  ngeP3(v, -1, "+"
13c70 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
13c80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13c90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13ca0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
13cb0 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29  Key, iIdxCur, 0)
13cc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13cd0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
13ce0 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e 75  dxIsNull, nNotNu
13cf0 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  ll, cont);.     
13d00 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
13d10 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
13d20 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13d30 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
13d40 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
13d50 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13d60 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
13d70 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
13d80 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  }..      /* Reco
13d90 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
13da0 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
13db0 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  nate the loop.. 
13dc0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c       */.      pL
13dd0 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
13de0 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
13df0 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
13e00 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
13e10 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
13e20 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
13e30 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
13e40 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  >flags & WHERE_C
13e50 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20  OLUMN_EQ ){.    
13e60 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68    /* Case 4:  Th
13e70 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
13e80 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  and all terms of
13e90 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13ea0 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
13eb0 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74           refer t
13ec0 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  o the index usin
13ed0 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49  g the "==" or "I
13ee0 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
13ef0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13f00 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e   start;.      in
13f10 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
13f20 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nEq;..      /* G
13f30 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
13f40 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
13f50 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
13f60 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
13f70 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20     ** and leave 
13f80 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
13f90 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  ose terms on the
13fa0 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stack..      */
13fb0 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71  .      codeAllEq
13fc0 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
13fd0 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c  se, pLevel, &wc,
13fe0 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b   notReady, brk);
13ff0 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
14000 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79  ate a single key
14010 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
14020 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74  ed to both start
14030 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20   and terminate. 
14040 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72       ** the sear
14050 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ch.      */.    
14060 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
14070 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72 6b  e(v, nEq, 0, brk
14080 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 73  , pIdx);.      s
14090 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
140a0 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
140b0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29  pLevel->iMem, 0)
140c0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
140d0 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f  rate code (1) to
140e0 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72   move to the fir
140f0 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d  st matching elem
14100 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
14110 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ..      ** Then 
14120 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32  generate code (2
14130 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  ) that jumps to 
14140 22 62 72 6b 22 20 61 66 74 65 72 20 74 68 65 20  "brk" after the 
14150 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20  cursor is past. 
14160 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
14170 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e   matching elemen
14180 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
14190 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73   The code (1) is
141a0 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20   executed.      
141b0 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ** once to initi
141c0 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68  alize the search
141d0 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69  , the code (2) i
141e0 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72  s executed befor
141f0 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20  e each.      ** 
14200 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
14210 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20   scan to see if 
14220 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e  the scan has fin
14230 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  ished. */.      
14240 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
14250 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72      /* Scan in r
14260 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
14270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14280 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14290 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c 20  oveLe, iIdxCur, 
142a0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  brk);.        st
142b0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
142c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
142d0 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
142e0 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
142f0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
14300 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49  (v, OP_IdxLT, iI
14310 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
14320 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
14330 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20  = OP_Prev;.     
14340 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14350 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20 66  /* Scan in the f
14360 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a  orward order */.
14370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14380 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
14390 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c 20  oveGe, iIdxCur, 
143a0 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  brk);.        st
143b0 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
143c0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
143d0 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
143e0 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
143f0 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
14400 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78  , OP_IdxGE, iIdx
14410 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50  Cur, brk, "+", P
14420 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
14430 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
14440 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  OP_Next;.      }
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 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
14470 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
14480 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14490 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
144a0 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c 20  IdxIsNull, nEq, 
144b0 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  cont);.      if(
144c0 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
144d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
144e0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
144f0 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
14500 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
14510 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
14520 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
14530 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14540 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
14550 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
14560 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
14570 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
14580 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20       /* Case 5: 
14590 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
145a0 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
145b0 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
145c0 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
145d0 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
145e0 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
145f0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
14600 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
14610 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
14620 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20  t( bRev==0 );.  
14630 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
14640 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
14650 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
14660 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
14670 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
14680 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
14690 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62  _Rewind, iCur, b
146a0 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  rk);.    }.    n
146b0 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
146c0 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43  ask(&maskSet, iC
146d0 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  ur);..    /* Ins
146e0 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
146f0 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
14700 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
14710 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20   completely.    
14720 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
14730 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
14740 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20  t of tables..   
14750 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72   */.    for(pTer
14760 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65  m=wc.a, j=wc.nTe
14770 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
14780 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  erm++){.      Ex
14790 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66  pr *pE;.      if
147a0 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
147b0 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
147c0 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
147d0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
147e0 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
147f0 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
14800 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
14810 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
14820 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
14830 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
14840 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
14850 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
14860 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14870 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
14880 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
14890 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
148a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
148b0 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
148c0 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20   cont, 1);.     
148d0 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
148e0 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
148f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61   }..    /* For a
14900 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
14910 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
14920 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
14930 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
14940 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
14950 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
14960 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
14970 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
14980 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  able.  .    */. 
14990 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
149a0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
149b0 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20    pLevel->top = 
149c0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
149d0 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
149e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
149f0 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
14a00 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
14a10 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
14a20 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
14a30 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
14a40 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66   hit"));.      f
14a50 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a  or(pTerm=wc.a, j
14a60 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20  =0; j<wc.nTerm; 
14a70 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
14a80 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
14a90 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
14aa0 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
14ab0 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
14ac0 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
14ad0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
14ae0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
14af0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14b00 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
14b10 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
14b20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
14b30 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
14b40 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20  m->pExpr, cont, 
14b50 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  1);.        pTer
14b60 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
14b70 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a  _CODED;.      }.
14b80 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14b90 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f  f SQLITE_TEST  /
14ba0 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  * For testing an
14bb0 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
14bc0 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63  only */.  /* Rec
14bd0 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79  ord in the query
14be0 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   plan informatio
14bf0 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72  n about the curr
14c00 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61  ent table.  ** a
14c10 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  nd the index use
14c20 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28  d to access it (
14c30 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65  if any).  If the
14c40 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20   table itself.  
14c50 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20  ** is not used, 
14c60 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  its name is just
14c70 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e   '{}'.  If no in
14c80 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  dex is used.  **
14c90 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69   the index is li
14ca0 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49  sted as "{}".  I
14cb0 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
14cc0 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20  y is used the.  
14cd0 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73  ** index name is
14ce0 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   '*'..  */.  for
14cf0 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
14d00 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
14d10 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
14d20 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
14d30 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
14d40 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
14d50 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
14d60 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
14d70 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
14d80 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
14d90 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
14da0 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
14db0 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
14dc0 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
14dd0 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
14de0 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
14df0 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
14e00 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
14e10 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
14e20 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  Y ){.        str
14e30 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
14e40 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
14e50 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20 20   "{}");.        
14e60 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
14e70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14e80 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
14e90 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
14ea0 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  lan], z);.      
14eb0 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
14ec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14ed0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
14ee0 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
14ef0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14f00 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
14f10 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
14f20 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
14f30 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70  ) ){.      strcp
14f40 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
14f50 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
14f60 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  * ");.      nQPl
14f70 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
14f80 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
14f90 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
14fa0 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
14fb0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
14fc0 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20 20  n], "{} ");.    
14fd0 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
14fe0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ff0 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65  n = strlen(pLeve
15000 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
15010 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  .      if( n+nQP
15020 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
15030 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
15040 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  -2 ){.        st
15050 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
15060 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
15070 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e  , pLevel->pIdx->
15080 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
15090 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
150a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
150b0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
150c0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
150d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
150e0 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
150f0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
15100 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
15110 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
15120 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
15130 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
15140 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
15150 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
15160 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
15170 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15180 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20  TEST // Testing 
15190 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
151a0 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  e only */..  /* 
151b0 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69  Record the conti
151c0 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20  nuation address 
151d0 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  in the WhereInfo
151e0 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
151f0 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20  n.  ** clean up 
15200 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
15210 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  .  pWInfo->iCont
15220 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77  inue = cont;.  w
15230 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
15240 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  &wc);.  return p
15250 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
15260 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
15270 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
15280 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65  eginNoMem:.  whe
15290 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77  reClauseClear(&w
152a0 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  c);.  whereInfoF
152b0 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72  ree(pWInfo);.  r
152c0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
152d0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
152e0 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
152f0 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
15300 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
15310 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
15320 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15330 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
15340 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
15350 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
15360 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
15370 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
15380 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
15390 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
153a0 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
153b0 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
153c0 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
153d0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
153e0 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
153f0 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   code..  */.  fo
15400 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  r(i=pTabList->nS
15410 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rc-1; i>=0; i--)
15420 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
15430 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
15440 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
15450 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
15460 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20  vel->cont);.    
15470 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
15480 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
15490 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
154a0 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  p(v, pLevel->op,
154b0 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
154c0 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  vel->p2);.    }.
154d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
154e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
154f0 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
15500 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e   if( pLevel->nIn
15510 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   ){.      int *a
15520 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
15530 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
15540 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65  l->nIn, a=&pLeve
15550 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 32 2d 32  l->aInLoop[j*2-2
15560 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d  ]; j>0; j--, a-=
15570 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
15580 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15590 4f 50 5f 4e 65 78 74 2c 20 61 5b 30 5d 2c 20 61  OP_Next, a[0], a
155a0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [1]);.        sq
155b0 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
155c0 65 28 76 2c 20 61 5b 31 5d 2d 31 29 3b 0a 20 20  e(v, a[1]-1);.  
155d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
155e0 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61  teFree(pLevel->a
155f0 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
15600 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
15610 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
15620 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
15630 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
15640 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15650 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65 6c  IfMemPos, pLevel
15660 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b  ->iLeftJoin, 0);
15670 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15680 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
15690 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
156a0 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30  >a[i].iCursor, 0
156b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
156c0 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
156d0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
156e0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
156f0 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
15700 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  l->iIdxCur, 0);.
15710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15720 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
15730 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
15740 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20  evel->top);.    
15750 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
15760 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
15770 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
15780 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
15790 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
157a0 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
157b0 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
157c0 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
157d0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
157e0 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
157f0 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
15800 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
15810 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
15820 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
15830 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
15840 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  egin..  */.  for
15850 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
15860 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
15870 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
15880 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74  Level++){.    st
15890 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
158a0 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
158b0 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
158c0 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
158d0 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
158e0 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
158f0 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
15900 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   );.    if( pTab
15910 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61  ->isEphem || pTa
15920 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
15930 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
15940 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
15950 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
15960 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15970 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15980 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
15990 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b  em->iCursor, 0);
159a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
159b0 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29  Level->pIdx!=0 )
159c0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
159d0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
159e0 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
159f0 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  dxCur, 0);.    }
15a00 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75  ..    /* Make cu
15a10 72 73 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f  rsor substitutio
15a20 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  ns for cases whe
15a30 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73  re we want to us
15a40 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68  e.    ** just th
15a50 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65  e index and neve
15a60 72 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  r reference the 
15a70 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20  table..    ** . 
15a80 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
15a90 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
15aa0 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
15ab0 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
15ac0 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
15ad0 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
15ae0 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
15af0 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
15b00 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
15b10 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
15b20 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
15b30 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
15b40 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
15b50 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
15b60 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
15b70 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
15b80 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
15b90 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
15ba0 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
15bb0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
15bc0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
15bd0 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
15be0 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
15bf0 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
15c00 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49  Op *pOp;.      I
15c10 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65  ndex *pIdx = pLe
15c20 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20  vel->pIdx;..    
15c30 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
15c40 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
15c50 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
15c60 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
15c70 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
15c80 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15c90 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15ca0 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
15cb0 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
15cc0 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
15cd0 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
15ce0 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
15cf0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15d00 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
15d10 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
15d20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
15d30 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
15d40 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
15d50 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
15d60 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
15d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15d80 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
15d90 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
15db0 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
15dc0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15dd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15df0 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
15e00 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
15e10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
15e20 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
15e30 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
15e40 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
15e50 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
15e60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15e70 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
15e80 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  NullRow ){.     
15e90 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
15ea0 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
15eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15ec0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
15ed0 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
15ee0 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
15ef0 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
15f00 72 6e 3b 0a 7d 0a                                rn;.}.