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

Artifact 0b1fcf590040175e20c6d8f2e13485b683d3d03c:


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 31 34   where.c,v 1.214
0340: 20 32 30 30 36 2f 30 36 2f 31 33 20 31 35 3a 30   2006/06/13 15:0
0350: 30 3a 35 35 20 64 61 6e 69 65 6c 6b 31 39 37 37  0:55 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 0a 2f 2a 0a 2a 2a 20 56 61 6c 75 65 20 66  )../*.** Value f
1910: 6f 72 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  or flags returne
1920: 64 20 62 79 20 62 65 73 74 49 6e 64 65 78 28 29  d by bestIndex()
1930: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52  .*/.#define WHER
1940: 45 5f 52 4f 57 49 44 5f 45 51 20 20 20 20 20 20  E_ROWID_EQ      
1950: 20 30 78 30 30 30 31 20 20 20 2f 2a 20 72 6f 77   0x0001   /* row
1960: 69 64 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64  id=EXPR or rowid
1970: 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65   IN (...) */.#de
1980: 66 69 6e 65 20 57 48 45 52 45 5f 52 4f 57 49 44  fine WHERE_ROWID
1990: 5f 52 41 4e 47 45 20 20 20 20 30 78 30 30 30 32  _RANGE    0x0002
19a0: 20 20 20 2f 2a 20 72 6f 77 69 64 3c 45 58 50 52     /* rowid<EXPR
19b0: 20 61 6e 64 2f 6f 72 20 72 6f 77 69 64 3e 45 58   and/or rowid>EX
19c0: 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  PR */.#define WH
19d0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 20 20 20  ERE_COLUMN_EQ   
19e0: 20 20 20 30 78 30 30 31 30 20 20 20 2f 2a 20 78     0x0010   /* x
19f0: 3d 45 58 50 52 20 6f 72 20 78 20 49 4e 20 28 2e  =EXPR or x IN (.
1a00: 2e 2e 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57  ..) */.#define W
1a10: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
1a20: 45 20 20 20 30 78 30 30 32 30 20 20 20 2f 2a 20  E   0x0020   /* 
1a30: 78 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 78 3e  x<EXPR and/or x>
1a40: 45 58 50 52 20 2a 2f 0a 23 64 65 66 69 6e 65 20  EXPR */.#define 
1a50: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20  WHERE_COLUMN_IN 
1a60: 20 20 20 20 20 30 78 30 30 34 30 20 20 20 2f 2a       0x0040   /*
1a70: 20 78 20 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23   x IN (...) */.#
1a80: 64 65 66 69 6e 65 20 57 48 45 52 45 5f 54 4f 50  define WHERE_TOP
1a90: 5f 4c 49 4d 49 54 20 20 20 20 20 20 30 78 30 31  _LIMIT      0x01
1aa0: 30 30 20 20 20 2f 2a 20 78 3c 45 58 50 52 20 6f  00   /* x<EXPR o
1ab0: 72 20 78 3c 3d 45 58 50 52 20 63 6f 6e 73 74 72  r x<=EXPR constr
1ac0: 61 69 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20  aint */.#define 
1ad0: 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54 20  WHERE_BTM_LIMIT 
1ae0: 20 20 20 20 20 30 78 30 32 30 30 20 20 20 2f 2a       0x0200   /*
1af0: 20 78 3e 45 58 50 52 20 6f 72 20 78 3e 3d 45 58   x>EXPR or x>=EX
1b00: 50 52 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  PR constraint */
1b10: 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 49  .#define WHERE_I
1b20: 44 58 5f 4f 4e 4c 59 20 20 20 20 20 20 20 30 78  DX_ONLY       0x
1b30: 30 38 30 30 20 20 20 2f 2a 20 55 73 65 20 69 6e  0800   /* Use in
1b40: 64 65 78 20 6f 6e 6c 79 20 2d 20 6f 6d 69 74 20  dex only - omit 
1b50: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
1b60: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 20 20   WHERE_ORDERBY  
1b70: 20 20 20 20 20 20 30 78 31 30 30 30 20 20 20 2f        0x1000   /
1b80: 2a 20 4f 75 74 70 75 74 20 77 69 6c 6c 20 61 70  * Output will ap
1b90: 70 65 61 72 20 69 6e 20 63 6f 72 72 65 63 74 20  pear in correct 
1ba0: 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69 6e 65  order */.#define
1bb0: 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 20 20   WHERE_REVERSE  
1bc0: 20 20 20 20 20 20 30 78 32 30 30 30 20 20 20 2f        0x2000   /
1bd0: 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73  * Scan in revers
1be0: 65 20 6f 72 64 65 72 20 2a 2f 0a 23 64 65 66 69  e order */.#defi
1bf0: 6e 65 20 57 48 45 52 45 5f 55 4e 49 51 55 45 20  ne WHERE_UNIQUE 
1c00: 20 20 20 20 20 20 20 20 30 78 34 30 30 30 20 20          0x4000  
1c10: 20 2f 2a 20 53 65 6c 65 63 74 73 20 6e 6f 20 6d   /* Selects no m
1c20: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 6f 77  ore than one row
1c30: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1c40: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 20  E_VIRTUALTABLE  
1c50: 20 30 78 38 30 30 30 20 20 20 2f 2a 20 55 73 65   0x8000   /* Use
1c60: 20 76 69 72 74 75 61 6c 2d 74 61 62 6c 65 20 70   virtual-table p
1c70: 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 0a 2f 2a  rocessing */../*
1c80: 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61  .** Initialize a
1c90: 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 57 68   preallocated Wh
1ca0: 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74  ereClause struct
1cb0: 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ure..*/.static v
1cc0: 6f 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 49  oid whereClauseI
1cd0: 6e 69 74 28 57 68 65 72 65 43 6c 61 75 73 65 20  nit(WhereClause 
1ce0: 2a 70 57 43 2c 20 50 61 72 73 65 20 2a 70 50 61  *pWC, Parse *pPa
1cf0: 72 73 65 29 7b 0a 20 20 70 57 43 2d 3e 70 50 61  rse){.  pWC->pPa
1d00: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
1d10: 70 57 43 2d 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a  pWC->nTerm = 0;.
1d20: 20 20 70 57 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41    pWC->nSlot = A
1d30: 52 52 41 59 53 49 5a 45 28 70 57 43 2d 3e 61 53  RRAYSIZE(pWC->aS
1d40: 74 61 74 69 63 29 3b 0a 20 20 70 57 43 2d 3e 61  tatic);.  pWC->a
1d50: 20 3d 20 70 57 43 2d 3e 61 53 74 61 74 69 63 3b   = pWC->aStatic;
1d60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f  .}../*.** Deallo
1d70: 63 61 74 65 20 61 20 57 68 65 72 65 43 6c 61 75  cate a WhereClau
1d80: 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  se structure.  T
1d90: 68 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  he WhereClause s
1da0: 74 72 75 63 74 75 72 65 0a 2a 2a 20 69 74 73 65  tructure.** itse
1db0: 6c 66 20 69 73 20 6e 6f 74 20 66 72 65 65 64 2e  lf is not freed.
1dc0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
1dd0: 73 20 74 68 65 20 69 6e 76 65 72 73 65 20 6f 66  s the inverse of
1de0: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
1df0: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
1e00: 69 64 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c  id whereClauseCl
1e10: 65 61 72 28 57 68 65 72 65 43 6c 61 75 73 65 20  ear(WhereClause 
1e20: 2a 70 57 43 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  *pWC){.  int i;.
1e30: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 0a    WhereTerm *a;.
1e40: 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65    for(i=pWC->nTe
1e50: 72 6d 2d 31 2c 20 61 3d 70 57 43 2d 3e 61 3b 20  rm-1, a=pWC->a; 
1e60: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b  i>=0; i--, a++){
1e70: 0a 20 20 20 20 69 66 28 20 61 2d 3e 66 6c 61 67  .    if( a->flag
1e80: 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  s & TERM_DYNAMIC
1e90: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1ea0: 33 45 78 70 72 44 65 6c 65 74 65 28 61 2d 3e 70  3ExprDelete(a->p
1eb0: 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Expr);.    }.  }
1ec0: 0a 20 20 69 66 28 20 70 57 43 2d 3e 61 21 3d 70  .  if( pWC->a!=p
1ed0: 57 43 2d 3e 61 53 74 61 74 69 63 20 29 7b 0a 20  WC->aStatic ){. 
1ee0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 57     sqliteFree(pW
1ef0: 43 2d 3e 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  C->a);.  }.}../*
1f00: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6e  .** Add a new en
1f10: 74 72 69 65 73 20 74 6f 20 74 68 65 20 57 68 65  tries to the Whe
1f20: 72 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75  reClause structu
1f30: 72 65 2e 20 20 49 6e 63 72 65 61 73 65 20 74 68  re.  Increase th
1f40: 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 73  e allocated.** s
1f50: 70 61 63 65 20 61 73 20 6e 65 63 65 73 73 61 72  pace as necessar
1f60: 79 2e 0a 2a 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  y..**.** WARNING
1f70: 3a 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  :  This routine 
1f80: 6d 69 67 68 74 20 72 65 61 6c 6c 6f 63 61 74 65  might reallocate
1f90: 20 74 68 65 20 73 70 61 63 65 20 75 73 65 64 20   the space used 
1fa0: 74 6f 20 73 74 6f 72 65 0a 2a 2a 20 57 68 65 72  to store.** Wher
1fb0: 65 54 65 72 6d 73 2e 20 20 41 6c 6c 20 70 6f 69  eTerms.  All poi
1fc0: 6e 74 65 72 73 20 74 6f 20 57 68 65 72 65 54 65  nters to WhereTe
1fd0: 72 6d 73 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  rms should be in
1fe0: 76 61 6c 69 64 65 64 20 61 66 74 65 72 0a 2a 2a  valided after.**
1ff0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
2000: 75 74 69 6e 65 2e 20 20 53 75 63 68 20 70 6f 69  utine.  Such poi
2010: 6e 74 65 72 73 20 6d 61 79 20 62 65 20 72 65 69  nters may be rei
2020: 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 72 65  nitialized by re
2030: 66 65 72 65 6e 63 69 6e 67 0a 2a 2a 20 74 68 65  ferencing.** the
2040: 20 70 57 43 2d 3e 61 5b 5d 20 61 72 72 61 79 2e   pWC->a[] array.
2050: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
2060: 68 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74  hereClauseInsert
2070: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
2080: 43 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  C, Expr *p, int 
2090: 66 6c 61 67 73 29 7b 0a 20 20 57 68 65 72 65 54  flags){.  WhereT
20a0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
20b0: 74 20 69 64 78 3b 0a 20 20 69 66 28 20 70 57 43  t idx;.  if( pWC
20c0: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
20d0: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
20e0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
20f0: 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  ->a;.    pWC->a 
2100: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
2110: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
2120: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
2130: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
2140: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2150: 20 20 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e      memcpy(pWC->
2160: 61 2c 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28  a, pOld, sizeof(
2170: 70 57 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e  pWC->a[0])*pWC->
2180: 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  nTerm);.    if( 
2190: 70 4f 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74  pOld!=pWC->aStat
21a0: 69 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ic ){.      sqli
21b0: 74 65 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20  teFree(pOld);.  
21c0: 20 20 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c    }.    pWC->nSl
21d0: 6f 74 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70  ot *= 2;.  }.  p
21e0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
21f0: 64 78 20 3d 20 70 57 43 2d 3e 6e 54 65 72 6d 5d  dx = pWC->nTerm]
2200: 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 2b 2b  ;.  pWC->nTerm++
2210: 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  ;.  pTerm->pExpr
2220: 20 3d 20 70 3b 0a 20 20 70 54 65 72 6d 2d 3e 66   = p;.  pTerm->f
2230: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
2240: 70 54 65 72 6d 2d 3e 70 57 43 20 3d 20 70 57 43  pTerm->pWC = pWC
2250: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
2260: 6e 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  nt = -1;.  retur
2270: 6e 20 69 64 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n idx;.}../*.** 
2280: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64 65  This routine ide
2290: 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72 65  ntifies subexpre
22a0: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57 48  ssions in the WH
22b0: 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72 65  ERE clause where
22c0: 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70 72  .** each subexpr
22d0: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
22e0: 74 65 64 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ted by the AND o
22f0: 70 65 72 61 74 6f 72 20 6f 72 20 73 6f 6d 65 20  perator or some 
2300: 6f 74 68 65 72 0a 2a 2a 20 6f 70 65 72 61 74 6f  other.** operato
2310: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
2320: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
2330: 20 20 54 68 65 20 57 68 65 72 65 43 6c 61 75 73    The WhereClaus
2340: 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 69  e structure.** i
2350: 73 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70 6f  s filled with po
2360: 69 6e 74 65 72 73 20 74 6f 20 73 75 62 65 78 70  inters to subexp
2370: 72 65 73 73 69 6f 6e 73 2e 20 20 46 6f 72 20 65  ressions.  For e
2380: 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
2390: 20 57 48 45 52 45 20 20 61 3d 3d 27 68 65 6c 6c   WHERE  a=='hell
23a0: 6f 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28  o' AND coalesce(
23b0: 62 2c 31 31 29 3c 31 30 20 41 4e 44 20 28 63 2b  b,11)<10 AND (c+
23c0: 31 32 21 3d 64 20 4f 52 20 63 3d 3d 32 32 29 0a  12!=d OR c==22).
23d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 5c 5f 5f  **           \__
23e0: 5f 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f  ______/     \___
23f0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20  ____________/   
2400: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f    \_____________
2410: 5f 5f 5f 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20  ___/.**         
2420: 20 20 20 73 6c 6f 74 5b 30 5d 20 20 20 20 20 20     slot[0]      
2430: 20 20 20 20 20 20 73 6c 6f 74 5b 31 5d 20 20 20        slot[1]   
2440: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
2450: 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  [2].**.** The or
2460: 69 67 69 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  iginal WHERE cla
2470: 75 73 65 20 69 6e 20 70 45 78 70 72 20 69 73 20  use in pExpr is 
2480: 75 6e 61 6c 74 65 72 65 64 2e 20 20 41 6c 6c 20  unaltered.  All 
2490: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
24a0: 64 6f 65 73 20 69 73 20 6d 61 6b 65 20 73 6c 6f  does is make slo
24b0: 74 5b 5d 20 65 6e 74 72 69 65 73 20 70 6f 69 6e  t[] entries poin
24c0: 74 20 74 6f 20 73 75 62 73 74 72 75 63 74 75 72  t to substructur
24d0: 65 20 77 69 74 68 69 6e 20 70 45 78 70 72 2e 0a  e within pExpr..
24e0: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 70 72 65  **.** In the pre
24f0: 76 69 6f 75 73 20 73 65 6e 74 65 6e 63 65 20 61  vious sentence a
2500: 6e 64 20 69 6e 20 74 68 65 20 64 69 61 67 72 61  nd in the diagra
2510: 6d 2c 20 22 73 6c 6f 74 5b 5d 22 20 72 65 66 65  m, "slot[]" refe
2520: 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 57 68 65  rs to.** the Whe
2530: 72 65 43 6c 61 75 73 65 2e 61 5b 5d 20 61 72 72  reClause.a[] arr
2540: 61 79 2e 20 20 54 68 69 73 20 61 72 72 61 79 20  ay.  This array 
2550: 67 72 6f 77 73 20 61 73 20 6e 65 65 64 65 64 20  grows as needed 
2560: 74 6f 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 61 6c  to contain.** al
2570: 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57  l terms of the W
2580: 48 45 52 45 20 63 6c 61 75 73 65 2e 0a 2a 2f 0a  HERE clause..*/.
2590: 73 74 61 74 69 63 20 76 6f 69 64 20 77 68 65 72  static void wher
25a0: 65 53 70 6c 69 74 28 57 68 65 72 65 43 6c 61 75  eSplit(WhereClau
25b0: 73 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70  se *pWC, Expr *p
25c0: 45 78 70 72 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  Expr, int op){. 
25d0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
25e0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45  return;.  if( pE
25f0: 78 70 72 2d 3e 6f 70 21 3d 6f 70 20 29 7b 0a 20  xpr->op!=op ){. 
2600: 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e     whereClauseIn
2610: 73 65 72 74 28 70 57 43 2c 20 70 45 78 70 72 2c  sert(pWC, pExpr,
2620: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   0);.  }else{.  
2630: 20 20 77 68 65 72 65 53 70 6c 69 74 28 70 57 43    whereSplit(pWC
2640: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
2650: 6f 70 29 3b 0a 20 20 20 20 77 68 65 72 65 53 70  op);.    whereSp
2660: 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e  lit(pWC, pExpr->
2670: 70 52 69 67 68 74 2c 20 6f 70 29 3b 0a 20 20 7d  pRight, op);.  }
2680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
2690: 6c 69 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69  lize an expressi
26a0: 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23  on mask set.*/.#
26b0: 64 65 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53  define initMaskS
26c0: 65 74 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c  et(P)  memset(P,
26d0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a   0, sizeof(*P)).
26e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
26f0: 65 20 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68  e bitmask for th
2700: 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e  e given cursor n
2710: 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30  umber.  Return 0
2720: 20 69 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69   if.** iCursor i
2730: 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74  s not in the set
2740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d  ..*/.static Bitm
2750: 61 73 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72  ask getMask(Expr
2760: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2770: 74 2c 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b  t, int iCursor){
2780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
2790: 69 3d 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d  i=0; i<pMaskSet-
27a0: 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  >n; i++){.    if
27b0: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69  ( pMaskSet->ix[i
27c0: 5d 3d 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20  ]==iCursor ){.  
27d0: 20 20 20 20 72 65 74 75 72 6e 20 28 28 42 69 74      return ((Bit
27e0: 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20  mask)1)<<i;.    
27f0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
2800: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
2810: 65 20 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72  e a new mask for
2820: 20 63 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e   cursor iCursor.
2830: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  .**.** There is 
2840: 6f 6e 65 20 63 75 72 73 6f 72 20 70 65 72 20 74  one cursor per t
2850: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
2860: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 6e 75   clause.  The nu
2870: 6d 62 65 72 20 6f 66 0a 2a 2a 20 74 61 62 6c 65  mber of.** table
2880: 73 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  s in the FROM cl
2890: 61 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20  ause is limited 
28a0: 62 79 20 61 20 74 65 73 74 20 65 61 72 6c 79 20  by a test early 
28b0: 69 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  in the.** sqlite
28c0: 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 72 6f  3WhereBegin() ro
28d0: 75 74 69 6e 65 2e 20 20 53 6f 20 77 65 20 6b 6e  utine.  So we kn
28e0: 6f 77 20 74 68 61 74 20 74 68 65 20 70 4d 61 73  ow that the pMas
28f0: 6b 53 65 74 2d 3e 69 78 5b 5d 0a 2a 2a 20 61 72  kSet->ix[].** ar
2900: 72 61 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 6f  ray will never o
2910: 76 65 72 66 6c 6f 77 2e 0a 2a 2f 0a 73 74 61 74  verflow..*/.stat
2920: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
2930: 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  sk(ExprMaskSet *
2940: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
2950: 75 72 73 6f 72 29 7b 0a 20 20 61 73 73 65 72 74  ursor){.  assert
2960: 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 20 3c 20  ( pMaskSet->n < 
2970: 41 52 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53  ARRAYSIZE(pMaskS
2980: 65 74 2d 3e 69 78 29 20 29 3b 0a 20 20 70 4d 61  et->ix) );.  pMa
2990: 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73 6b 53  skSet->ix[pMaskS
29a0: 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75 72 73  et->n++] = iCurs
29b0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  or;.}../*.** Thi
29c0: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
29d0: 28 72 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e  (recursively) an
29e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
29f0: 20 61 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a   and generates.*
2a00: 2a 20 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69  * a bitmask indi
2a10: 63 61 74 69 6e 67 20 77 68 69 63 68 20 74 61 62  cating which tab
2a20: 6c 65 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  les are used in 
2a30: 74 68 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a  that expression.
2a40: 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49  ** tree..**.** I
2a50: 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73  n order for this
2a60: 20 72 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b   routine to work
2a70: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  , the calling fu
2a80: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65  nction must have
2a90: 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69  .** previously i
2aa0: 6e 76 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78  nvoked sqlite3Ex
2ab0: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
2ac0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
2ad0: 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20  on.  See.** the 
2ae0: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f  header comment o
2af0: 6e 20 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66  n that routine f
2b00: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
2b10: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68  formation..** Th
2b20: 65 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  e sqlite3ExprRes
2b30: 6f 6c 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74  olveNames() rout
2b40: 69 6e 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63  ines looks for c
2b50: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a  olumn names and.
2b60: 2a 2a 20 73 65 74 73 20 74 68 65 69 72 20 6f 70  ** sets their op
2b70: 63 6f 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55  codes to TK_COLU
2b80: 4d 4e 20 61 6e 64 20 74 68 65 69 72 20 45 78 70  MN and their Exp
2b90: 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20  r.iTable fields 
2ba0: 74 6f 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63  to.** the VDBE c
2bb0: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20  ursor number of 
2bc0: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 69 73  the table.  This
2bd0: 20 72 6f 75 74 69 6e 65 20 6a 75 73 74 20 68 61   routine just ha
2be0: 73 20 74 6f 0a 2a 2a 20 74 72 61 6e 73 6c 61 74  s to.** translat
2bf0: 65 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d  e the cursor num
2c00: 62 65 72 73 20 69 6e 74 6f 20 62 69 74 6d 61 73  bers into bitmas
2c10: 6b 20 76 61 6c 75 65 73 20 61 6e 64 20 4f 52 20  k values and OR 
2c20: 61 6c 6c 0a 2a 2a 20 74 68 65 20 62 69 74 6d 61  all.** the bitma
2c30: 73 6b 73 20 74 6f 67 65 74 68 65 72 2e 0a 2a 2f  sks together..*/
2c40: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
2c50: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
2c60: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c  ge(ExprMaskSet*,
2c70: 20 45 78 70 72 4c 69 73 74 2a 29 3b 0a 73 74 61   ExprList*);.sta
2c80: 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72  tic Bitmask expr
2c90: 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67 65  SelectTableUsage
2ca0: 28 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20 53  (ExprMaskSet*, S
2cb0: 65 6c 65 63 74 2a 29 3b 0a 73 74 61 74 69 63 20  elect*);.static 
2cc0: 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62 6c  Bitmask exprTabl
2cd0: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
2ce0: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2cf0: 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73  pr *p){.  Bitmas
2d00: 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66  k mask = 0;.  if
2d10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
2d20: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d  0;.  if( p->op==
2d30: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
2d40: 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28   mask = getMask(
2d50: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61  pMaskSet, p->iTa
2d60: 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ble);.    return
2d70: 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73   mask;.  }.  mas
2d80: 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61  k = exprTableUsa
2d90: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
2da0: 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20  pRight);.  mask 
2db0: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2dc0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70  e(pMaskSet, p->p
2dd0: 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d  Left);.  mask |=
2de0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2df0: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
2e00: 3e 70 4c 69 73 74 29 3b 0a 20 20 6d 61 73 6b 20  >pList);.  mask 
2e10: 7c 3d 20 65 78 70 72 53 65 6c 65 63 74 54 61 62  |= exprSelectTab
2e20: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2e30: 2c 20 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  , p->pSelect);. 
2e40: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
2e50: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2e60: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
2e70: 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70  e(ExprMaskSet *p
2e80: 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69 73  MaskSet, ExprLis
2e90: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
2ea0: 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d 61   i;.  Bitmask ma
2eb0: 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4c  sk = 0;.  if( pL
2ec0: 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ist ){.    for(i
2ed0: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
2ee0: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
2ef0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2f00: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2f10: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
2f20: 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  pr);.    }.  }. 
2f30: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a   return mask;.}.
2f40: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2f50: 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73  xprSelectTableUs
2f60: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
2f70: 2a 70 4d 61 73 6b 53 65 74 2c 20 53 65 6c 65 63  *pMaskSet, Selec
2f80: 74 20 2a 70 53 29 7b 0a 20 20 42 69 74 6d 61 73  t *pS){.  Bitmas
2f90: 6b 20 6d 61 73 6b 3b 0a 20 20 69 66 28 20 70 53  k mask;.  if( pS
2fa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20  ==0 ){.    mask 
2fb0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
2fc0: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 4c 69 73    mask = exprLis
2fd0: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2fe0: 6b 53 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74  kSet, pS->pEList
2ff0: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
3000: 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67  xprListTableUsag
3010: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
3020: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d  pGroupBy);.    m
3030: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
3040: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
3050: 65 74 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79  et, pS->pOrderBy
3060: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
3070: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
3080: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65  askSet, pS->pWhe
3090: 72 65 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  re);.    mask |=
30a0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
30b0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48  pMaskSet, pS->pH
30c0: 61 76 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65  aving);.  }.  re
30d0: 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  turn mask;.}../*
30e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
30f0: 69 66 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65  if the given ope
3100: 72 61 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20  rator is one of 
3110: 74 68 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68  the operators th
3120: 61 74 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64  at is.** allowed
3130: 20 66 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c   for an indexabl
3140: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
3150: 65 72 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65  erm.  The allowe
3160: 64 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a  d operators are.
3170: 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22  ** "=", "<", ">"
3180: 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e  , "<=", ">=", an
3190: 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69  d "IN"..*/.stati
31a0: 63 20 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28  c int allowedOp(
31b0: 69 6e 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72  int op){.  asser
31c0: 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 26  t( TK_GT>TK_EQ &
31d0: 26 20 54 4b 5f 47 54 3c 54 4b 5f 47 45 20 29 3b  & TK_GT<TK_GE );
31e0: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54  .  assert( TK_LT
31f0: 3e 54 4b 5f 45 51 20 26 26 20 54 4b 5f 4c 54 3c  >TK_EQ && TK_LT<
3200: 54 4b 5f 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_GE );.  asser
3210: 74 28 20 54 4b 5f 4c 45 3e 54 4b 5f 45 51 20 26  t( TK_LE>TK_EQ &
3220: 26 20 54 4b 5f 4c 45 3c 54 4b 5f 47 45 20 29 3b  & TK_LE<TK_GE );
3230: 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45  .  assert( TK_GE
3240: 3d 3d 54 4b 5f 45 51 2b 34 20 29 3b 0a 20 20 72  ==TK_EQ+4 );.  r
3250: 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e 20  eturn op==TK_IN 
3260: 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26 26  || (op>=TK_EQ &&
3270: 20 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a 0a   op<=TK_GE);.}..
3280: 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20 6f  /*.** Swap two o
3290: 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20 54  bjects of type T
32a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57 41  ..*/.#define SWA
32b0: 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59 50  P(TYPE,A,B) {TYP
32c0: 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74 3b  E t=A; A=B; B=t;
32d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 75 74 65  }../*.** Commute
32e0: 20 61 20 63 6f 6d 70 61 72 69 73 69 6f 6e 20 6f   a comparision o
32f0: 70 65 72 61 74 6f 72 2e 20 20 45 78 70 72 65 73  perator.  Expres
3300: 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
3310: 6d 20 22 58 20 6f 70 20 59 22 0a 2a 2a 20 61 72  m "X op Y".** ar
3320: 65 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f  e converted into
3330: 20 22 59 20 6f 70 20 58 22 2e 0a 2a 2f 0a 73 74   "Y op X"..*/.st
3340: 61 74 69 63 20 76 6f 69 64 20 65 78 70 72 43 6f  atic void exprCo
3350: 6d 6d 75 74 65 28 45 78 70 72 20 2a 70 45 78 70  mmute(Expr *pExp
3360: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 6c  r){.  assert( al
3370: 6c 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f  lowedOp(pExpr->o
3380: 70 29 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21  p) && pExpr->op!
3390: 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 53 57 41 50  =TK_IN );.  SWAP
33a0: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
33b0: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
33c0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
33d0: 6c 6c 29 3b 0a 20 20 53 57 41 50 28 45 78 70 72  ll);.  SWAP(Expr
33e0: 2a 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  *,pExpr->pRight,
33f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3400: 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d   if( pExpr->op>=
3410: 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 61 73 73  TK_GT ){.    ass
3420: 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  ert( TK_LT==TK_G
3430: 54 2b 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  T+2 );.    asser
3440: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3450: 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  2 );.    assert(
3460: 20 54 4b 5f 47 54 3e 54 4b 5f 45 51 20 29 3b 0a   TK_GT>TK_EQ );.
3470: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
3480: 54 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 61  T<TK_LE );.    a
3490: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
34a0: 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72  >=TK_GT && pExpr
34b0: 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20  ->op<=TK_GE );. 
34c0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
34d0: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
34e0: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 7d 0a  )^2)+TK_GT;.  }.
34f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  }../*.** Transla
3500: 74 65 20 66 72 6f 6d 20 54 4b 5f 78 78 20 6f 70  te from TK_xx op
3510: 65 72 61 74 6f 72 20 74 6f 20 57 4f 5f 78 78 20  erator to WO_xx 
3520: 62 69 74 6d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74  bitmask..*/.stat
3530: 69 63 20 69 6e 74 20 6f 70 65 72 61 74 6f 72 4d  ic int operatorM
3540: 61 73 6b 28 69 6e 74 20 6f 70 29 7b 0a 20 20 69  ask(int op){.  i
3550: 6e 74 20 63 3b 0a 20 20 61 73 73 65 72 74 28 20  nt c;.  assert( 
3560: 61 6c 6c 6f 77 65 64 4f 70 28 6f 70 29 20 29 3b  allowedOp(op) );
3570: 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 49 4e  .  if( op==TK_IN
3580: 20 29 7b 0a 20 20 20 20 63 20 3d 20 57 4f 5f 49   ){.    c = WO_I
3590: 4e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  N;.  }else{.    
35a0: 63 20 3d 20 57 4f 5f 45 51 3c 3c 28 6f 70 2d 54  c = WO_EQ<<(op-T
35b0: 4b 5f 45 51 29 3b 0a 20 20 7d 0a 20 20 61 73 73  K_EQ);.  }.  ass
35c0: 65 72 74 28 20 6f 70 21 3d 54 4b 5f 49 4e 20 7c  ert( op!=TK_IN |
35d0: 7c 20 63 3d 3d 57 4f 5f 49 4e 20 29 3b 0a 20 20  | c==WO_IN );.  
35e0: 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 45  assert( op!=TK_E
35f0: 51 20 7c 7c 20 63 3d 3d 57 4f 5f 45 51 20 29 3b  Q || c==WO_EQ );
3600: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54  .  assert( op!=T
3610: 4b 5f 4c 54 20 7c 7c 20 63 3d 3d 57 4f 5f 4c 54  K_LT || c==WO_LT
3620: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
3630: 21 3d 54 4b 5f 4c 45 20 7c 7c 20 63 3d 3d 57 4f  !=TK_LE || c==WO
3640: 5f 4c 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _LE );.  assert(
3650: 20 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20 63 3d   op!=TK_GT || c=
3660: 3d 57 4f 5f 47 54 20 29 3b 0a 20 20 61 73 73 65  =WO_GT );.  asse
3670: 72 74 28 20 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c  rt( op!=TK_GE ||
3680: 20 63 3d 3d 57 4f 5f 47 45 20 29 3b 0a 20 20 72   c==WO_GE );.  r
3690: 65 74 75 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn c;.}../*.*
36a0: 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20 74  * Search for a t
36b0: 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45 52 45  erm in the WHERE
36c0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 69 73 20   clause that is 
36d0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3c  of the form "X <
36e0: 6f 70 3e 20 3c 65 78 70 72 3e 22 0a 2a 2a 20 77  op> <expr>".** w
36f0: 68 65 72 65 20 58 20 69 73 20 61 20 72 65 66 65  here X is a refe
3700: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 69 43 6f  rence to the iCo
3710: 6c 75 6d 6e 20 6f 66 20 74 61 62 6c 65 20 69 43  lumn of table iC
3720: 75 72 20 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f  ur and <op> is o
3730: 6e 65 20 6f 66 0a 2a 2a 20 74 68 65 20 57 4f 5f  ne of.** the WO_
3740: 78 78 20 6f 70 65 72 61 74 6f 72 20 63 6f 64 65  xx operator code
3750: 73 20 73 70 65 63 69 66 69 65 64 20 62 79 20 74  s specified by t
3760: 68 65 20 6f 70 20 70 61 72 61 6d 65 74 65 72 2e  he op parameter.
3770: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
3780: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 65 72 6d  nter to the term
3790: 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e  .  Return 0 if n
37a0: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
37b0: 74 69 63 20 57 68 65 72 65 54 65 72 6d 20 2a 66  tic WhereTerm *f
37c0: 69 6e 64 54 65 72 6d 28 0a 20 20 57 68 65 72 65  indTerm(.  Where
37d0: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
37e0: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
37f0: 61 75 73 65 20 74 6f 20 62 65 20 73 65 61 72 63  ause to be searc
3800: 68 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75  hed */.  int iCu
3810: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
3820: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
3830: 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20  of LHS */.  int 
3840: 69 43 6f 6c 75 6d 6e 2c 20 20 20 20 20 20 20 20  iColumn,        
3850: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d 62    /* Column numb
3860: 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20 20 42  er of LHS */.  B
3870: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
3880: 20 20 20 20 20 2f 2a 20 52 48 53 20 6d 75 73 74       /* RHS must
3890: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 20 77 69 74   not overlap wit
38a0: 68 20 74 68 69 73 20 6d 61 73 6b 20 2a 2f 0a 20  h this mask */. 
38b0: 20 75 31 36 20 6f 70 2c 20 20 20 20 20 20 20 20   u16 op,        
38c0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
38d0: 66 20 57 4f 5f 78 78 20 76 61 6c 75 65 73 20 64  f WO_xx values d
38e0: 65 73 63 72 69 62 69 6e 67 20 6f 70 65 72 61 74  escribing operat
38f0: 6f 72 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70  or */.  Index *p
3900: 49 64 78 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Idx           /*
3910: 20 4d 75 73 74 20 62 65 20 63 6f 6d 70 61 74 69   Must be compati
3920: 62 6c 65 20 77 69 74 68 20 74 68 69 73 20 69 6e  ble with this in
3930: 64 65 78 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  dex, if not NULL
3940: 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65 54 65   */.){.  WhereTe
3950: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e 74  rm *pTerm;.  int
3960: 20 6b 3b 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d   k;.  for(pTerm=
3970: 70 57 43 2d 3e 61 2c 20 6b 3d 70 57 43 2d 3e 6e  pWC->a, k=pWC->n
3980: 54 65 72 6d 3b 20 6b 3b 20 6b 2d 2d 2c 20 70 54  Term; k; k--, pT
3990: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  erm++){.    if( 
39a0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
39b0: 72 3d 3d 69 43 75 72 0a 20 20 20 20 20 20 20 26  r==iCur.       &
39c0: 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  & (pTerm->prereq
39d0: 52 69 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79  Right & notReady
39e0: 29 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 70  )==0.       && p
39f0: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
3a00: 3d 3d 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20  ==iColumn.      
3a10: 20 26 26 20 28 70 54 65 72 6d 2d 3e 65 4f 70 65   && (pTerm->eOpe
3a20: 72 61 74 6f 72 20 26 20 6f 70 29 21 3d 30 0a 20  rator & op)!=0. 
3a30: 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20     ){.      if( 
3a40: 69 43 75 72 3e 3d 30 20 26 26 20 70 49 64 78 20  iCur>=0 && pIdx 
3a50: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
3a60: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78  *pX = pTerm->pEx
3a70: 70 72 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c  pr;.        Coll
3a80: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 20 20  Seq *pColl;.    
3a90: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 3b      char idxaff;
3aa0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  .        int j;.
3ab0: 20 20 20 20 20 20 20 20 50 61 72 73 65 20 2a 70          Parse *p
3ac0: 50 61 72 73 65 20 3d 20 70 57 43 2d 3e 70 50 61  Parse = pWC->pPa
3ad0: 72 73 65 3b 0a 0a 20 20 20 20 20 20 20 20 69 64  rse;..        id
3ae0: 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61  xaff = pIdx->pTa
3af0: 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d  ble->aCol[iColum
3b00: 6e 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  n].affinity;.   
3b10: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
3b20: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
3b30: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
3b40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
3b50: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
3b60: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
3b70: 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a  se, pX->pLeft);.
3b80: 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f          if( !pCo
3b90: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
3ba0: 69 66 28 20 70 58 2d 3e 70 52 69 67 68 74 20 29  if( pX->pRight )
3bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
3bc0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
3bd0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
3be0: 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
3bf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3c00: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
3c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43  {.            pC
3c20: 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  oll = pParse->db
3c30: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3c40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3c50: 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a   }.        for(j
3c60: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
3c70: 75 6d 6e 20 26 26 20 70 49 64 78 2d 3e 61 69 43  umn && pIdx->aiC
3c80: 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69 43 6f 6c 75 6d  olumn[j]!=iColum
3c90: 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  n; j++){}.      
3ca0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 49 64 78    assert( j<pIdx
3cb0: 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 20  ->nColumn );.   
3cc0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3cd0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
3ce0: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
3cf0: 6c 6c 5b 6a 5d 29 20 29 20 63 6f 6e 74 69 6e 75  ll[j]) ) continu
3d00: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
3d10: 20 72 65 74 75 72 6e 20 70 54 65 72 6d 3b 0a 20   return pTerm;. 
3d20: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
3d30: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  n 0;.}../* Forwa
3d40: 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a  rd reference */.
3d50: 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 72  static void expr
3d60: 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74 2a  Analyze(SrcList*
3d70: 2c 20 45 78 70 72 4d 61 73 6b 53 65 74 2a 2c 20  , ExprMaskSet*, 
3d80: 57 68 65 72 65 43 6c 61 75 73 65 2a 2c 20 69 6e  WhereClause*, in
3d90: 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20  t);../*.** Call 
3da0: 65 78 70 72 41 6e 61 6c 79 7a 65 20 6f 6e 20 61  exprAnalyze on a
3db0: 6c 6c 20 74 65 72 6d 73 20 69 6e 20 61 20 57 48  ll terms in a WH
3dc0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 0a 2a 2a  ERE clause.  .**
3dd0: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .**.*/.static vo
3de0: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  id exprAnalyzeAl
3df0: 6c 28 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54  l(.  SrcList *pT
3e00: 61 62 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a  abList,       /*
3e10: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
3e20: 20 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65   */.  ExprMaskSe
3e30: 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 2f  t *pMaskSet,   /
3e40: 2a 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f  * table masks */
3e50: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
3e60: 70 57 43 20 20 20 20 20 20 20 20 20 2f 2a 20 74  pWC         /* t
3e70: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3e80: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a  to be analyzed *
3e90: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
3ea0: 66 6f 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d  for(i=pWC->nTerm
3eb0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3ec0: 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 28      exprAnalyze(
3ed0: 70 54 61 62 4c 69 73 74 2c 20 70 4d 61 73 6b 53  pTabList, pMaskS
3ee0: 65 74 2c 20 70 57 43 2c 20 69 29 3b 0a 20 20 7d  et, pWC, i);.  }
3ef0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
3f00: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
3f10: 49 4d 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20  IMIZATION./*.** 
3f20: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
3f30: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
3f40: 73 69 6f 6e 20 69 73 20 61 20 4c 49 4b 45 20 6f  sion is a LIKE o
3f50: 72 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 20  r GLOB operator 
3f60: 74 68 61 74 0a 2a 2a 20 63 61 6e 20 62 65 20 6f  that.** can be o
3f70: 70 74 69 6d 69 7a 65 64 20 75 73 69 6e 67 20 69  ptimized using i
3f80: 6e 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72  nequality constr
3f90: 61 69 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 54  aints.  Return T
3fa0: 52 55 45 20 69 66 20 69 74 20 69 73 0a 2a 2a 20  RUE if it is.** 
3fb0: 73 6f 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  so and false if 
3fc0: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72  not..**.** In or
3fd0: 64 65 72 20 66 6f 72 20 74 68 65 20 6f 70 65 72  der for the oper
3fe0: 61 74 6f 72 20 74 6f 20 62 65 20 6f 70 74 69 6d  ator to be optim
3ff0: 69 7a 69 62 6c 65 2c 20 74 68 65 20 52 48 53 20  izible, the RHS 
4000: 6d 75 73 74 20 62 65 20 61 20 73 74 72 69 6e 67  must be a string
4010: 0a 2a 2a 20 6c 69 74 65 72 61 6c 20 74 68 61 74  .** literal that
4020: 20 64 6f 65 73 20 6e 6f 74 20 62 65 67 69 6e 20   does not begin 
4030: 77 69 74 68 20 61 20 77 69 6c 64 63 61 72 64 2e  with a wildcard.
4040: 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74    .*/.static int
4050: 20 69 73 4c 69 6b 65 4f 72 47 6c 6f 62 28 0a 20   isLikeOrGlob(. 
4060: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
4070: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
4080: 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  se */.  Expr *pE
4090: 78 70 72 2c 20 20 20 20 20 20 2f 2a 20 54 65 73  xpr,      /* Tes
40a0: 74 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  t this expressio
40b0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 50 61  n */.  int *pnPa
40c0: 74 74 65 72 6e 2c 20 20 20 2f 2a 20 4e 75 6d 62  ttern,   /* Numb
40d0: 65 72 20 6f 66 20 6e 6f 6e 2d 77 69 6c 64 63 61  er of non-wildca
40e0: 72 64 20 70 72 65 66 69 78 20 63 68 61 72 61 63  rd prefix charac
40f0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ters */.  int *p
4100: 69 73 43 6f 6d 70 6c 65 74 65 20 20 2f 2a 20 54  isComplete  /* T
4110: 72 75 65 20 69 66 20 74 68 65 20 6f 6e 6c 79 20  rue if the only 
4120: 77 69 6c 64 63 61 72 64 20 69 73 20 25 20 69 6e  wildcard is % in
4130: 20 74 68 65 20 6c 61 73 74 20 63 68 61 72 61 63   the last charac
4140: 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ter */.){.  cons
4150: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 45 78 70  t char *z;.  Exp
4160: 72 20 2a 70 52 69 67 68 74 2c 20 2a 70 4c 65 66  r *pRight, *pLef
4170: 74 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  t;.  ExprList *p
4180: 4c 69 73 74 3b 0a 20 20 69 6e 74 20 63 2c 20 63  List;.  int c, c
4190: 6e 74 3b 0a 20 20 69 6e 74 20 6e 6f 43 61 73 65  nt;.  int noCase
41a0: 3b 0a 20 20 63 68 61 72 20 77 63 5b 33 5d 3b 0a  ;.  char wc[3];.
41b0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
41c0: 3b 0a 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  ;..  if( !sqlite
41d0: 33 49 73 4c 69 6b 65 46 75 6e 63 74 69 6f 6e 28  3IsLikeFunction(
41e0: 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 6f 43 61  db, pExpr, &noCa
41f0: 73 65 2c 20 77 63 29 20 29 7b 0a 20 20 20 20 72  se, wc) ){.    r
4200: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
4210: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
4220: 69 73 74 3b 0a 20 20 70 52 69 67 68 74 20 3d 20  ist;.  pRight = 
4230: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
4240: 72 3b 0a 20 20 69 66 28 20 70 52 69 67 68 74 2d  r;.  if( pRight-
4250: 3e 6f 70 21 3d 54 4b 5f 53 54 52 49 4e 47 20 29  >op!=TK_STRING )
4260: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
4270: 20 20 7d 0a 20 20 70 4c 65 66 74 20 3d 20 70 4c    }.  pLeft = pL
4280: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
4290: 0a 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70  .  if( pLeft->op
42a0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  !=TK_COLUMN ){. 
42b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
42c0: 0a 20 20 70 43 6f 6c 6c 20 3d 20 70 4c 65 66 74  .  pColl = pLeft
42d0: 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 69 66 28 20 70  ->pColl;.  if( p
42e0: 43 6f 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70  Coll==0 ){.    p
42f0: 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74  Coll = db->pDflt
4300: 43 6f 6c 6c 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Coll;.  }.  if( 
4310: 28 70 43 6f 6c 6c 2d 3e 74 79 70 65 21 3d 53 51  (pColl->type!=SQ
4320: 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52 59  LITE_COLL_BINARY
4330: 20 7c 7c 20 6e 6f 43 61 73 65 29 20 26 26 0a 20   || noCase) &&. 
4340: 20 20 20 20 20 28 70 43 6f 6c 6c 2d 3e 74 79 70       (pColl->typ
4350: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e  e!=SQLITE_COLL_N
4360: 4f 43 41 53 45 20 7c 7c 20 21 6e 6f 43 61 73 65  OCASE || !noCase
4370: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4380: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
4390: 44 65 71 75 6f 74 65 45 78 70 72 28 70 52 69 67  DequoteExpr(pRig
43a0: 68 74 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72  ht);.  z = (char
43b0: 20 2a 29 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e   *)pRight->token
43c0: 2e 7a 3b 0a 20 20 66 6f 72 28 63 6e 74 3d 30 3b  .z;.  for(cnt=0;
43d0: 20 28 63 3d 7a 5b 63 6e 74 5d 29 21 3d 30 20 26   (c=z[cnt])!=0 &
43e0: 26 20 63 21 3d 77 63 5b 30 5d 20 26 26 20 63 21  & c!=wc[0] && c!
43f0: 3d 77 63 5b 31 5d 20 26 26 20 63 21 3d 77 63 5b  =wc[1] && c!=wc[
4400: 32 5d 3b 20 63 6e 74 2b 2b 29 7b 7d 0a 20 20 69  2]; cnt++){}.  i
4410: 66 28 20 63 6e 74 3d 3d 30 20 7c 7c 20 32 35 35  f( cnt==0 || 255
4420: 3d 3d 28 75 38 29 7a 5b 63 6e 74 5d 20 29 7b 0a  ==(u8)z[cnt] ){.
4430: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4440: 7d 0a 20 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65  }.  *pisComplete
4450: 20 3d 20 7a 5b 63 6e 74 5d 3d 3d 77 63 5b 30 5d   = z[cnt]==wc[0]
4460: 20 26 26 20 7a 5b 63 6e 74 2b 31 5d 3d 3d 30 3b   && z[cnt+1]==0;
4470: 0a 20 20 2a 70 6e 50 61 74 74 65 72 6e 20 3d 20  .  *pnPattern = 
4480: 63 6e 74 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  cnt;.  return 1;
4490: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
44a0: 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50  ITE_OMIT_LIKE_OP
44b0: 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  TIMIZATION */../
44c0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 42 61 73  *.** If the pBas
44d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72 69  e expression ori
44e0: 67 69 6e 61 74 65 64 20 69 6e 20 74 68 65 20 4f  ginated in the O
44f0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
4500: 65 20 6f 66 0a 2a 2a 20 61 20 6a 6f 69 6e 2c 20  e of.** a join, 
4510: 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68  then transfer th
4520: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6d 61  e appropriate ma
4530: 72 6b 69 6e 67 73 20 6f 76 65 72 20 74 6f 20 64  rkings over to d
4540: 65 72 69 76 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  erived..*/.stati
4550: 63 20 76 6f 69 64 20 74 72 61 6e 73 66 65 72 4a  c void transferJ
4560: 6f 69 6e 4d 61 72 6b 69 6e 67 73 28 45 78 70 72  oinMarkings(Expr
4570: 20 2a 70 44 65 72 69 76 65 64 2c 20 45 78 70 72   *pDerived, Expr
4580: 20 2a 70 42 61 73 65 29 7b 0a 20 20 70 44 65 72   *pBase){.  pDer
4590: 69 76 65 64 2d 3e 66 6c 61 67 73 20 7c 3d 20 70  ived->flags |= p
45a0: 42 61 73 65 2d 3e 66 6c 61 67 73 20 26 20 45 50  Base->flags & EP
45b0: 5f 46 72 6f 6d 4a 6f 69 6e 3b 0a 20 20 70 44 65  _FromJoin;.  pDe
45c0: 72 69 76 65 64 2d 3e 69 52 69 67 68 74 4a 6f 69  rived->iRightJoi
45d0: 6e 54 61 62 6c 65 20 3d 20 70 42 61 73 65 2d 3e  nTable = pBase->
45e0: 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65 3b  iRightJoinTable;
45f0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  .}.../*.** The i
4600: 6e 70 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75  nput to this rou
4610: 74 69 6e 65 20 69 73 20 61 6e 20 57 68 65 72 65  tine is an Where
4620: 54 65 72 6d 20 73 74 72 75 63 74 75 72 65 20 77  Term structure w
4630: 69 74 68 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  ith only the.** 
4640: 22 70 45 78 70 72 22 20 66 69 65 6c 64 20 66 69  "pExpr" field fi
4650: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
4660: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
4670: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
4680: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
4690: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
46a0: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
46b0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
46c0: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
46d0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ture..**.** If t
46e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
46f0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3c 65   of the form "<e
4700: 78 70 72 3e 20 3c 6f 70 3e 20 58 22 20 69 74 20  xpr> <op> X" it 
4710: 67 65 74 73 20 63 6f 6d 6d 75 74 65 64 0a 2a 2a  gets commuted.**
4720: 20 74 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   to the standard
4730: 20 66 6f 72 6d 20 6f 66 20 22 58 20 3c 6f 70 3e   form of "X <op>
4740: 20 3c 65 78 70 72 3e 22 2e 20 20 49 66 20 74 68   <expr>".  If th
4750: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
4760: 6f 66 0a 2a 2a 20 74 68 65 20 66 6f 72 6d 20 22  of.** the form "
4770: 58 20 3c 6f 70 3e 20 59 22 20 77 68 65 72 65 20  X <op> Y" where 
4780: 62 6f 74 68 20 58 20 61 6e 64 20 59 20 61 72 65  both X and Y are
4790: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 74   columns, then t
47a0: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 65  he original.** e
47b0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 75 6e 63  xpression is unc
47c0: 68 61 6e 67 65 64 20 61 6e 64 20 61 20 6e 65 77  hanged and a new
47d0: 20 76 69 72 74 75 61 6c 20 65 78 70 72 65 73 73   virtual express
47e0: 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a  ion of the form.
47f0: 2a 2a 20 22 59 20 3c 6f 70 3e 20 58 22 20 69 73  ** "Y <op> X" is
4800: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 57 48   added to the WH
4810: 45 52 45 20 63 6c 61 75 73 65 20 61 6e 64 20 61  ERE clause and a
4820: 6e 61 6c 79 7a 65 64 20 73 65 70 61 72 61 74 65  nalyzed separate
4830: 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
4840: 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 0a  id exprAnalyze(.
4850: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c    SrcList *pSrc,
4860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74              /* t
4870: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a  he FROM clause *
4880: 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20  /.  ExprMaskSet 
4890: 2a 70 4d 61 73 6b 53 65 74 2c 20 20 20 20 2f 2a  *pMaskSet,    /*
48a0: 20 74 61 62 6c 65 20 6d 61 73 6b 73 20 2a 2f 0a   table masks */.
48b0: 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70    WhereClause *p
48c0: 57 43 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 74  WC,         /* t
48d0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
48e0: 2a 2f 0a 20 20 69 6e 74 20 69 64 78 54 65 72 6d  */.  int idxTerm
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4900: 2a 20 49 6e 64 65 78 20 6f 66 20 74 68 65 20 74  * Index of the t
4910: 65 72 6d 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  erm to be analyz
4920: 65 64 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  ed */.){.  Where
4930: 54 65 72 6d 20 2a 70 54 65 72 6d 20 3d 20 26 70  Term *pTerm = &p
4940: 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a  WC->a[idxTerm];.
4950: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
4960: 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
4970: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c 65  Bitmask prereqLe
4980: 66 74 3b 0a 20 20 42 69 74 6d 61 73 6b 20 70 72  ft;.  Bitmask pr
4990: 65 72 65 71 41 6c 6c 3b 0a 20 20 69 6e 74 20 6e  ereqAll;.  int n
49a0: 50 61 74 74 65 72 6e 3b 0a 20 20 69 6e 74 20 69  Pattern;.  int i
49b0: 73 43 6f 6d 70 6c 65 74 65 3b 0a 0a 20 20 69 66  sComplete;..  if
49c0: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
49d0: 61 69 6c 65 64 28 29 20 29 20 72 65 74 75 72 6e  ailed() ) return
49e0: 3b 0a 20 20 70 72 65 72 65 71 4c 65 66 74 20 3d  ;.  prereqLeft =
49f0: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
4a00: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
4a10: 3e 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 70  >pLeft);.  if( p
4a20: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20  Expr->op==TK_IN 
4a30: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4a40: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
4a50: 29 3b 0a 20 20 20 20 70 54 65 72 6d 2d 3e 70 72  );.    pTerm->pr
4a60: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
4a70: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
4a80: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
4a90: 70 4c 69 73 74 29 0a 20 20 20 20 20 20 20 20 20  pList).         
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ab0: 20 7c 20 65 78 70 72 53 65 6c 65 63 74 54 61 62   | exprSelectTab
4ac0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
4ad0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
4ae0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4af0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4b00: 68 74 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  ht = exprTableUs
4b10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45  age(pMaskSet, pE
4b20: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
4b30: 7d 0a 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20  }.  prereqAll = 
4b40: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
4b50: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b  MaskSet, pExpr);
4b60: 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72  .  if( ExprHasPr
4b70: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
4b80: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
4b90: 20 20 70 72 65 72 65 71 41 6c 6c 20 7c 3d 20 67    prereqAll |= g
4ba0: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
4bb0: 20 70 45 78 70 72 2d 3e 69 52 69 67 68 74 4a 6f   pExpr->iRightJo
4bc0: 69 6e 54 61 62 6c 65 29 3b 0a 20 20 7d 0a 20 20  inTable);.  }.  
4bd0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
4be0: 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a 20 20   = prereqAll;.  
4bf0: 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f  pTerm->leftCurso
4c00: 72 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d 2d  r = -1;.  pTerm-
4c10: 3e 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20  >iParent = -1;. 
4c20: 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f   pTerm->eOperato
4c30: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 6c 6c  r = 0;.  if( all
4c40: 6f 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70  owedOp(pExpr->op
4c50: 29 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65  ) && (pTerm->pre
4c60: 72 65 71 52 69 67 68 74 20 26 20 70 72 65 72 65  reqRight & prere
4c70: 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20  qLeft)==0 ){.   
4c80: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
4c90: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
4ca0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20   Expr *pRight = 
4cb0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
4cc0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
4cd0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
4ce0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c 65 66 74       pTerm->left
4cf0: 43 75 72 73 6f 72 20 3d 20 70 4c 65 66 74 2d 3e  Cursor = pLeft->
4d00: 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 54  iTable;.      pT
4d10: 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 20  erm->leftColumn 
4d20: 3d 20 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e  = pLeft->iColumn
4d30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 65  ;.      pTerm->e
4d40: 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70 65 72 61  Operator = opera
4d50: 74 6f 72 4d 61 73 6b 28 70 45 78 70 72 2d 3e 6f  torMask(pExpr->o
4d60: 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
4d70: 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69 67  ( pRight && pRig
4d80: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
4d90: 4e 20 29 7b 0a 20 20 20 20 20 20 57 68 65 72 65  N ){.      Where
4da0: 54 65 72 6d 20 2a 70 4e 65 77 3b 0a 20 20 20 20  Term *pNew;.    
4db0: 20 20 45 78 70 72 20 2a 70 44 75 70 3b 0a 20 20    Expr *pDup;.  
4dc0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c      if( pTerm->l
4dd0: 65 66 74 43 75 72 73 6f 72 3e 3d 30 20 29 7b 0a  eftCursor>=0 ){.
4de0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e          int idxN
4df0: 65 77 3b 0a 20 20 20 20 20 20 20 20 70 44 75 70  ew;.        pDup
4e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
4e10: 70 28 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  p(pExpr);.      
4e20: 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72 65    idxNew = where
4e30: 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57 43  ClauseInsert(pWC
4e40: 2c 20 70 44 75 70 2c 20 54 45 52 4d 5f 56 49 52  , pDup, TERM_VIR
4e50: 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49  TUAL|TERM_DYNAMI
4e60: 43 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  C);.        if( 
4e70: 69 64 78 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  idxNew==0 ) retu
4e80: 72 6e 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  rn;.        pNew
4e90: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e 65   = &pWC->a[idxNe
4ea0: 77 5d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  w];.        pNew
4eb0: 2d 3e 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54  ->iParent = idxT
4ec0: 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65  erm;.        pTe
4ed0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78  rm = &pWC->a[idx
4ee0: 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20 20 70  Term];.        p
4ef0: 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d 20 31  Term->nChild = 1
4f00: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d  ;.        pTerm-
4f10: 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43  >flags |= TERM_C
4f20: 4f 50 49 45 44 3b 0a 20 20 20 20 20 20 7d 65 6c  OPIED;.      }el
4f30: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 75 70  se{.        pDup
4f40: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
4f50: 20 20 70 4e 65 77 20 3d 20 70 54 65 72 6d 3b 0a    pNew = pTerm;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
4f70: 70 72 43 6f 6d 6d 75 74 65 28 70 44 75 70 29 3b  prCommute(pDup);
4f80: 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70  .      pLeft = p
4f90: 44 75 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  Dup->pLeft;.    
4fa0: 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 75 72 73    pNew->leftCurs
4fb0: 6f 72 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62  or = pLeft->iTab
4fc0: 6c 65 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  le;.      pNew->
4fd0: 6c 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65  leftColumn = pLe
4fe0: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
4ff0: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 52     pNew->prereqR
5000: 69 67 68 74 20 3d 20 70 72 65 72 65 71 4c 65 66  ight = prereqLef
5010: 74 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  t;.      pNew->p
5020: 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65 72 65  rereqAll = prere
5030: 71 41 6c 6c 3b 0a 20 20 20 20 20 20 70 4e 65 77  qAll;.      pNew
5040: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 6f 70  ->eOperator = op
5050: 65 72 61 74 6f 72 4d 61 73 6b 28 70 44 75 70 2d  eratorMask(pDup-
5060: 3e 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >op);.    }.  }.
5070: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
5080: 4f 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54  OMIT_BETWEEN_OPT
5090: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 49  IMIZATION.  /* I
50a0: 66 20 61 20 74 65 72 6d 20 69 73 20 74 68 65 20  f a term is the 
50b0: 42 45 54 57 45 45 4e 20 6f 70 65 72 61 74 6f 72  BETWEEN operator
50c0: 2c 20 63 72 65 61 74 65 20 74 77 6f 20 6e 65 77  , create two new
50d0: 20 76 69 72 74 75 61 6c 20 74 65 72 6d 73 0a 20   virtual terms. 
50e0: 20 2a 2a 20 74 68 61 74 20 64 65 66 69 6e 65 20   ** that define 
50f0: 74 68 65 20 72 61 6e 67 65 20 74 68 61 74 20 74  the range that t
5100: 68 65 20 42 45 54 57 45 45 4e 20 69 6d 70 6c 65  he BETWEEN imple
5110: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c  ments..  */.  el
5120: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70  se if( pExpr->op
5130: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 7b 0a  ==TK_BETWEEN ){.
5140: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
5150: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
5160: 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  st;.    int i;. 
5170: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
5180: 75 38 20 6f 70 73 5b 5d 20 3d 20 7b 54 4b 5f 47  u8 ops[] = {TK_G
5190: 45 2c 20 54 4b 5f 4c 45 7d 3b 0a 20 20 20 20 61  E, TK_LE};.    a
51a0: 73 73 65 72 74 28 20 70 4c 69 73 74 21 3d 30 20  ssert( pList!=0 
51b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
51c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 32 20 29  List->nExpr==2 )
51d0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
51e0: 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <2; i++){.      
51f0: 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b 0a  Expr *pNewExpr;.
5200: 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77        int idxNew
5210: 3b 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72  ;.      pNewExpr
5220: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 6f   = sqlite3Expr(o
5230: 70 73 5b 69 5d 2c 20 73 71 6c 69 74 65 33 45 78  ps[i], sqlite3Ex
5240: 70 72 44 75 70 28 70 45 78 70 72 2d 3e 70 4c 65  prDup(pExpr->pLe
5250: 66 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ft),.           
5260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5270: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70    sqlite3ExprDup
5280: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
5290: 70 72 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  pr), 0);.      i
52a0: 64 78 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61  dxNew = whereCla
52b0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
52c0: 4e 65 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49  NewExpr, TERM_VI
52d0: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
52e0: 49 43 29 3b 0a 20 20 20 20 20 20 65 78 70 72 41  IC);.      exprA
52f0: 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61  nalyze(pSrc, pMa
5300: 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e  skSet, pWC, idxN
5310: 65 77 29 3b 0a 20 20 20 20 20 20 70 54 65 72 6d  ew);.      pTerm
5320: 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65   = &pWC->a[idxTe
5330: 72 6d 5d 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e  rm];.      pWC->
5340: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
5350: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
5360: 20 7d 0a 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43   }.    pTerm->nC
5370: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 7d 0a 23 65  hild = 2;.  }.#e
5380: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
5390: 4d 49 54 5f 42 45 54 57 45 45 4e 5f 4f 50 54 49  MIT_BETWEEN_OPTI
53a0: 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  MIZATION */..#if
53b0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
53c0: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
53d0: 41 54 49 4f 4e 29 20 26 26 20 21 64 65 66 69 6e  ATION) && !defin
53e0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
53f0: 55 42 51 55 45 52 59 29 0a 20 20 2f 2a 20 41 74  UBQUERY).  /* At
5400: 74 65 6d 70 74 20 74 6f 20 63 6f 6e 76 65 72 74  tempt to convert
5410: 20 4f 52 2d 63 6f 6e 6e 65 63 74 65 64 20 74 65   OR-connected te
5420: 72 6d 73 20 69 6e 74 6f 20 61 6e 20 49 4e 20 6f  rms into an IN o
5430: 70 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 0a  perator so that.
5440: 20 20 2a 2a 20 74 68 65 79 20 63 61 6e 20 6d 61    ** they can ma
5450: 6b 65 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ke use of indice
5460: 73 2e 20 20 45 78 61 6d 70 6c 65 3a 0a 20 20 2a  s.  Example:.  *
5470: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78 20 3d 20  *.  **      x = 
5480: 65 78 70 72 31 20 20 4f 52 20 20 65 78 70 72 32  expr1  OR  expr2
5490: 20 3d 20 78 20 20 4f 52 20 20 78 20 3d 20 65 78   = x  OR  x = ex
54a0: 70 72 33 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 73  pr3.  **.  ** is
54b0: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 0a   converted into.
54c0: 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 78    **.  **      x
54d0: 20 49 4e 20 28 65 78 70 72 31 2c 65 78 70 72 32   IN (expr1,expr2
54e0: 2c 65 78 70 72 33 29 0a 20 20 2a 2a 0a 20 20 2a  ,expr3).  **.  *
54f0: 2a 20 54 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  * This optimizat
5500: 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 6d 69 74  ion must be omit
5510: 74 65 64 20 69 66 20 4f 4d 49 54 5f 53 55 42 51  ted if OMIT_SUBQ
5520: 55 45 52 59 20 69 73 20 64 65 66 69 6e 65 64 20  UERY is defined 
5530: 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 74 68 65  because.  ** the
5540: 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 74 68   compiler for th
5550: 65 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f  e the IN operato
5560: 72 20 69 73 20 70 61 72 74 20 6f 66 20 73 75 62  r is part of sub
5570: 2d 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20  -queries..  */. 
5580: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
5590: 3e 6f 70 3d 3d 54 4b 5f 4f 52 20 29 7b 0a 20 20  >op==TK_OR ){.  
55a0: 20 20 69 6e 74 20 6f 6b 3b 0a 20 20 20 20 69 6e    int ok;.    in
55b0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 69 6e 74 20  t i, j;.    int 
55c0: 69 43 6f 6c 75 6d 6e 2c 20 69 43 75 72 73 6f 72  iColumn, iCursor
55d0: 3b 0a 20 20 20 20 57 68 65 72 65 43 6c 61 75 73  ;.    WhereClaus
55e0: 65 20 73 4f 72 3b 0a 20 20 20 20 57 68 65 72 65  e sOr;.    Where
55f0: 54 65 72 6d 20 2a 70 4f 72 54 65 72 6d 3b 0a 0a  Term *pOrTerm;..
5600: 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54 65      assert( (pTe
5610: 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d  rm->flags & TERM
5620: 5f 44 59 4e 41 4d 49 43 29 3d 3d 30 20 29 3b 0a  _DYNAMIC)==0 );.
5630: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 49      whereClauseI
5640: 6e 69 74 28 26 73 4f 72 2c 20 70 57 43 2d 3e 70  nit(&sOr, pWC->p
5650: 50 61 72 73 65 29 3b 0a 20 20 20 20 77 68 65 72  Parse);.    wher
5660: 65 53 70 6c 69 74 28 26 73 4f 72 2c 20 70 45 78  eSplit(&sOr, pEx
5670: 70 72 2c 20 54 4b 5f 4f 52 29 3b 0a 20 20 20 20  pr, TK_OR);.    
5680: 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70  exprAnalyzeAll(p
5690: 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c 20 26  Src, pMaskSet, &
56a0: 73 4f 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  sOr);.    assert
56b0: 28 20 73 4f 72 2e 6e 54 65 72 6d 3e 30 20 29 3b  ( sOr.nTerm>0 );
56c0: 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
56d0: 64 6f 7b 0a 20 20 20 20 20 20 69 43 6f 6c 75 6d  do{.      iColum
56e0: 6e 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66  n = sOr.a[j].lef
56f0: 74 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 69  tColumn;.      i
5700: 43 75 72 73 6f 72 20 3d 20 73 4f 72 2e 61 5b 6a  Cursor = sOr.a[j
5710: 5d 2e 6c 65 66 74 43 75 72 73 6f 72 3b 0a 20 20  ].leftCursor;.  
5720: 20 20 20 20 6f 6b 20 3d 20 69 43 75 72 73 6f 72      ok = iCursor
5730: 3e 3d 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >=0;.      for(i
5740: 3d 73 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f  =sOr.nTerm-1, pO
5750: 72 54 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d  rTerm=sOr.a; i>=
5760: 30 20 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f  0 && ok; i--, pO
5770: 72 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  rTerm++){.      
5780: 20 20 69 66 28 20 70 4f 72 54 65 72 6d 2d 3e 65    if( pOrTerm->e
5790: 4f 70 65 72 61 74 6f 72 21 3d 57 4f 5f 45 51 20  Operator!=WO_EQ 
57a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
57b0: 6f 20 6f 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c  o or_not_possibl
57c0: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
57d0: 20 20 20 20 20 69 66 28 20 70 4f 72 54 65 72 6d       if( pOrTerm
57e0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43  ->leftCursor==iC
57f0: 75 72 73 6f 72 20 26 26 20 70 4f 72 54 65 72 6d  ursor && pOrTerm
5800: 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3d 3d 69 43  ->leftColumn==iC
5810: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
5820: 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67     pOrTerm->flag
5830: 73 20 7c 3d 20 54 45 52 4d 5f 4f 52 5f 4f 4b 3b  s |= TERM_OR_OK;
5840: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
5850: 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c 61  f( (pOrTerm->fla
5860: 67 73 20 26 20 54 45 52 4d 5f 43 4f 50 49 45 44  gs & TERM_COPIED
5870: 29 21 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20  )!=0 ||.        
5880: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 70 4f              ((pO
5890: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
58a0: 45 52 4d 5f 56 49 52 54 55 41 4c 29 21 3d 30 20  ERM_VIRTUAL)!=0 
58b0: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
58c0: 20 20 20 20 20 20 20 20 28 73 4f 72 2e 61 5b 70          (sOr.a[p
58d0: 4f 72 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d  OrTerm->iParent]
58e0: 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 4f 52  .flags & TERM_OR
58f0: 5f 4f 4b 29 21 3d 30 29 20 29 7b 0a 20 20 20 20  _OK)!=0) ){.    
5900: 20 20 20 20 20 20 70 4f 72 54 65 72 6d 2d 3e 66        pOrTerm->f
5910: 6c 61 67 73 20 26 3d 20 7e 54 45 52 4d 5f 4f 52  lags &= ~TERM_OR
5920: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _OK;.        }el
5930: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 6b  se{.          ok
5940: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
5950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69        }.    }whi
5960: 6c 65 28 20 21 6f 6b 20 26 26 20 28 73 4f 72 2e  le( !ok && (sOr.
5970: 61 5b 6a 2b 2b 5d 2e 66 6c 61 67 73 20 26 20 54  a[j++].flags & T
5980: 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 26  ERM_COPIED)!=0 &
5990: 26 20 6a 3c 73 4f 72 2e 6e 54 65 72 6d 20 29 3b  & j<sOr.nTerm );
59a0: 0a 20 20 20 20 69 66 28 20 6f 6b 20 29 7b 0a 20  .    if( ok ){. 
59b0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
59c0: 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  List = 0;.      
59d0: 45 78 70 72 20 2a 70 4e 65 77 2c 20 2a 70 44 75  Expr *pNew, *pDu
59e0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 73  p;.      for(i=s
59f0: 4f 72 2e 6e 54 65 72 6d 2d 31 2c 20 70 4f 72 54  Or.nTerm-1, pOrT
5a00: 65 72 6d 3d 73 4f 72 2e 61 3b 20 69 3e 3d 30 20  erm=sOr.a; i>=0 
5a10: 26 26 20 6f 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54  && ok; i--, pOrT
5a20: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  erm++){.        
5a30: 69 66 28 20 28 70 4f 72 54 65 72 6d 2d 3e 66 6c  if( (pOrTerm->fl
5a40: 61 67 73 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b  ags & TERM_OR_OK
5a50: 29 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )==0 ) continue;
5a60: 0a 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20  .        pDup = 
5a70: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5a80: 4f 72 54 65 72 6d 2d 3e 70 45 78 70 72 2d 3e 70  OrTerm->pExpr->p
5a90: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
5aa0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  pList = sqlite3E
5ab0: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70 4c  xprListAppend(pL
5ac0: 69 73 74 2c 20 70 44 75 70 2c 20 30 29 3b 0a 20  ist, pDup, 0);. 
5ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 75       }.      pDu
5ae0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  p = sqlite3Expr(
5af0: 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 2c  TK_COLUMN, 0, 0,
5b00: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
5b10: 44 75 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Dup ){.        p
5b20: 44 75 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 43  Dup->iTable = iC
5b30: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  ursor;.        p
5b40: 44 75 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69  Dup->iColumn = i
5b50: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 7d 0a  Column;.      }.
5b60: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 73 71 6c        pNew = sql
5b70: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 2c 20  ite3Expr(TK_IN, 
5b80: 70 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pDup, 0, 0);.   
5b90: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
5ba0: 20 20 20 20 20 20 20 69 6e 74 20 69 64 78 4e 65         int idxNe
5bb0: 77 3b 0a 20 20 20 20 20 20 20 20 74 72 61 6e 73  w;.        trans
5bc0: 66 65 72 4a 6f 69 6e 4d 61 72 6b 69 6e 67 73 28  ferJoinMarkings(
5bd0: 70 4e 65 77 2c 20 70 45 78 70 72 29 3b 0a 20 20  pNew, pExpr);.  
5be0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 4c 69 73        pNew->pLis
5bf0: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20  t = pList;.     
5c00: 20 20 20 69 64 78 4e 65 77 20 3d 20 77 68 65 72     idxNew = wher
5c10: 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28 70 57  eClauseInsert(pW
5c20: 43 2c 20 70 4e 65 77 2c 20 54 45 52 4d 5f 56 49  C, pNew, TERM_VI
5c30: 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d  RTUAL|TERM_DYNAM
5c40: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 65 78 70  IC);.        exp
5c50: 72 41 6e 61 6c 79 7a 65 28 70 53 72 63 2c 20 70  rAnalyze(pSrc, p
5c60: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 64  MaskSet, pWC, id
5c70: 78 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 70  xNew);.        p
5c80: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
5c90: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 20 20 20  dxTerm];.       
5ca0: 20 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 2e   pWC->a[idxNew].
5cb0: 69 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72  iParent = idxTer
5cc0: 6d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  m;.        pTerm
5cd0: 2d 3e 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20  ->nChild = 1;.  
5ce0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5cf0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
5d00: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
5d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 6f  .      }.    }.o
5d20: 72 5f 6e 6f 74 5f 70 6f 73 73 69 62 6c 65 3a 0a  r_not_possible:.
5d30: 20 20 20 20 77 68 65 72 65 43 6c 61 75 73 65 43      whereClauseC
5d40: 6c 65 61 72 28 26 73 4f 72 29 3b 0a 20 20 7d 0a  lear(&sOr);.  }.
5d50: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
5d60: 5f 4f 4d 49 54 5f 4f 52 5f 4f 50 54 49 4d 49 5a  _OMIT_OR_OPTIMIZ
5d70: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
5d80: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  f SQLITE_OMIT_LI
5d90: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a  KE_OPTIMIZATION.
5da0: 20 20 2f 2a 20 41 64 64 20 63 6f 6e 73 74 72 61    /* Add constra
5db0: 69 6e 74 73 20 74 6f 20 72 65 64 75 63 65 20 74  ints to reduce t
5dc0: 68 65 20 73 65 61 72 63 68 20 73 70 61 63 65 20  he search space 
5dd0: 6f 6e 20 61 20 4c 49 4b 45 20 6f 72 20 47 4c 4f  on a LIKE or GLO
5de0: 42 0a 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 2e  B.  ** operator.
5df0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4c 69  .  */.  if( isLi
5e00: 6b 65 4f 72 47 6c 6f 62 28 70 57 43 2d 3e 70 50  keOrGlob(pWC->pP
5e10: 61 72 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c  arse->db, pExpr,
5e20: 20 26 6e 50 61 74 74 65 72 6e 2c 20 26 69 73 43   &nPattern, &isC
5e30: 6f 6d 70 6c 65 74 65 29 20 29 7b 0a 20 20 20 20  omplete) ){.    
5e40: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52  Expr *pLeft, *pR
5e50: 69 67 68 74 3b 0a 20 20 20 20 45 78 70 72 20 2a  ight;.    Expr *
5e60: 70 53 74 72 31 2c 20 2a 70 53 74 72 32 3b 0a 20  pStr1, *pStr2;. 
5e70: 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70     Expr *pNewExp
5e80: 72 31 2c 20 2a 70 4e 65 77 45 78 70 72 32 3b 0a  r1, *pNewExpr2;.
5e90: 20 20 20 20 69 6e 74 20 69 64 78 4e 65 77 31 2c      int idxNew1,
5ea0: 20 69 64 78 4e 65 77 32 3b 0a 0a 20 20 20 20 70   idxNew2;..    p
5eb0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
5ec0: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
5ed0: 0a 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45  .    pRight = pE
5ee0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
5ef0: 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 53 74 72  .pExpr;.    pStr
5f00: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  1 = sqlite3Expr(
5f10: 54 4b 5f 53 54 52 49 4e 47 2c 20 30 2c 20 30 2c  TK_STRING, 0, 0,
5f20: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74   0);.    if( pSt
5f30: 72 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  r1 ){.      sqli
5f40: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 53  te3TokenCopy(&pS
5f50: 74 72 31 2d 3e 74 6f 6b 65 6e 2c 20 26 70 52 69  tr1->token, &pRi
5f60: 67 68 74 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20  ght->token);.   
5f70: 20 20 20 70 53 74 72 31 2d 3e 74 6f 6b 65 6e 2e     pStr1->token.
5f80: 6e 20 3d 20 6e 50 61 74 74 65 72 6e 3b 0a 20 20  n = nPattern;.  
5f90: 20 20 7d 0a 20 20 20 20 70 53 74 72 32 20 3d 20    }.    pStr2 = 
5fa0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
5fb0: 53 74 72 31 29 3b 0a 20 20 20 20 69 66 28 20 70  Str1);.    if( p
5fc0: 53 74 72 32 20 29 7b 0a 20 20 20 20 20 20 61 73  Str2 ){.      as
5fd0: 73 65 72 74 28 20 70 53 74 72 32 2d 3e 74 6f 6b  sert( pStr2->tok
5fe0: 65 6e 2e 64 79 6e 20 29 3b 0a 20 20 20 20 20 20  en.dyn );.      
5ff0: 2b 2b 2a 28 75 38 2a 29 26 70 53 74 72 32 2d 3e  ++*(u8*)&pStr2->
6000: 74 6f 6b 65 6e 2e 7a 5b 6e 50 61 74 74 65 72 6e  token.z[nPattern
6010: 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
6020: 4e 65 77 45 78 70 72 31 20 3d 20 73 71 6c 69 74  NewExpr1 = sqlit
6030: 65 33 45 78 70 72 28 54 4b 5f 47 45 2c 20 73 71  e3Expr(TK_GE, sq
6040: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
6050: 66 74 29 2c 20 70 53 74 72 31 2c 20 30 29 3b 0a  ft), pStr1, 0);.
6060: 20 20 20 20 69 64 78 4e 65 77 31 20 3d 20 77 68      idxNew1 = wh
6070: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6080: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 31 2c 20  pWC, pNewExpr1, 
6090: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
60a0: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
60b0: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
60c0: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
60d0: 20 69 64 78 4e 65 77 31 29 3b 0a 20 20 20 20 70   idxNew1);.    p
60e0: 4e 65 77 45 78 70 72 32 20 3d 20 73 71 6c 69 74  NewExpr2 = sqlit
60f0: 65 33 45 78 70 72 28 54 4b 5f 4c 54 2c 20 73 71  e3Expr(TK_LT, sq
6100: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4c 65  lite3ExprDup(pLe
6110: 66 74 29 2c 20 70 53 74 72 32 2c 20 30 29 3b 0a  ft), pStr2, 0);.
6120: 20 20 20 20 69 64 78 4e 65 77 32 20 3d 20 77 68      idxNew2 = wh
6130: 65 72 65 43 6c 61 75 73 65 49 6e 73 65 72 74 28  ereClauseInsert(
6140: 70 57 43 2c 20 70 4e 65 77 45 78 70 72 32 2c 20  pWC, pNewExpr2, 
6150: 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52  TERM_VIRTUAL|TER
6160: 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20  M_DYNAMIC);.    
6170: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 53 72 63  exprAnalyze(pSrc
6180: 2c 20 70 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c  , pMaskSet, pWC,
6190: 20 69 64 78 4e 65 77 32 29 3b 0a 20 20 20 20 70   idxNew2);.    p
61a0: 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69  Term = &pWC->a[i
61b0: 64 78 54 65 72 6d 5d 3b 0a 20 20 20 20 69 66 28  dxTerm];.    if(
61c0: 20 69 73 43 6f 6d 70 6c 65 74 65 20 29 7b 0a 20   isComplete ){. 
61d0: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
61e0: 65 77 31 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69  ew1].iParent = i
61f0: 64 78 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 57  dxTerm;.      pW
6200: 43 2d 3e 61 5b 69 64 78 4e 65 77 32 5d 2e 69 50  C->a[idxNew2].iP
6210: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
6220: 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43  .      pTerm->nC
6230: 68 69 6c 64 20 3d 20 32 3b 0a 20 20 20 20 7d 0a  hild = 2;.    }.
6240: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
6250: 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f  LITE_OMIT_LIKE_O
6260: 50 54 49 4d 49 5a 41 54 49 4f 4e 20 2a 2f 0a 7d  PTIMIZATION */.}
6270: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
6280: 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69 66  utine decides if
6290: 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73 65   pIdx can be use
62a0: 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65  d to satisfy the
62b0: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
62c0: 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e 2c  use.  If it can,
62d0: 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20 20   it returns 1.  
62e0: 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20 73  If pIdx cannot s
62f0: 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52  atisfy the.** OR
6300: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74  DER BY clause, t
6310: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
6320: 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72  rns 0..**.** pOr
6330: 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45  derBy is an ORDE
6340: 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d  R BY clause from
6350: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
6360: 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74 68  ent.  pTab is th
6370: 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74  e.** left-most t
6380: 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d  able in the FROM
6390: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
63a0: 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61 74  same SELECT stat
63b0: 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65  ement and.** the
63c0: 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75 72   table has a cur
63d0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22 62  sor number of "b
63e0: 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20 61  ase".  pIdx is a
63f0: 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e  n index on pTab.
6400: 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73  .**.** nEqCol is
6410: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
6420: 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20 74  olumns of pIdx t
6430: 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73 20  hat are used as 
6440: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73  equality.** cons
6450: 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66  traints.  Any of
6460: 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d   these columns m
6470: 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66 72  ay be missing fr
6480: 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59 0a  om the ORDER BY.
6490: 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74 68  ** clause and th
64a0: 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69 6c  e match can stil
64b0: 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a  l be a success..
64c0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20  **.** All terms 
64d0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
64e0: 74 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e  that match again
64f0: 73 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  st the index mus
6500: 74 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41  t be either.** A
6510: 53 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65  SC or DESC.  (Te
6520: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
6530: 20 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20   BY clause past 
6540: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49  the end of a UNI
6550: 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20  QUE.** index do 
6560: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69  not need to sati
6570: 73 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61  sfy this constra
6580: 69 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65  int.)  The *pbRe
6590: 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  v value is.** se
65a0: 74 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52  t to 1 if the OR
65b0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73  DER BY clause is
65c0: 20 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74   all DESC and it
65d0: 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a   is set to 0 if.
65e0: 2a 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ** the ORDER BY 
65f0: 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53  clause is all AS
6600: 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  C..*/.static int
6610: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
6620: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
6630: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
6640: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
6650: 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20  .  Index *pIdx, 
6660: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
6670: 65 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74  e index we are t
6680: 65 73 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  esting */.  int 
6690: 62 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  base,           
66a0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
66b0: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
66c0: 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64 20  le to be sorted 
66d0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
66e0: 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a 20  OrderBy,     /* 
66f0: 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  The ORDER BY cla
6700: 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71  use */.  int nEq
6710: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
6720: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
6730: 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74 68  dex columns with
6740: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20   == constraints 
6750: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20  */.  int *pbRev 
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6770: 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45  Set to 1 if ORDE
6780: 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a  R BY is DESC */.
6790: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  ){.  int i, j;  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
67c0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73  nters */.  int s
67d0: 6f 72 74 4f 72 64 65 72 20 3d 20 30 3b 20 20 20  ortOrder = 0;   
67e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 58 4f             /* XO
67f0: 52 20 6f 66 20 69 6e 64 65 78 20 61 6e 64 20 4f  R of index and O
6800: 52 44 45 52 20 42 59 20 73 6f 72 74 20 64 69 72  RDER BY sort dir
6810: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
6820: 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
6830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6840: 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42  umber of ORDER B
6850: 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  Y terms */.  str
6860: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
6870: 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 2f 2a 20  m *pTerm;    /* 
6880: 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52  A term of the OR
6890: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
68a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
68b0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20   pParse->db;..  
68c0: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
68d0: 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d  !=0 );.  nTerm =
68e0: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
68f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 72  ;.  assert( nTer
6900: 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74  m>0 );..  /* Mat
6910: 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ch terms of the 
6920: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
6930: 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20  against columns 
6940: 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65  of.  ** the inde
6950: 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  x..  */.  for(i=
6960: 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65  j=0, pTerm=pOrde
6970: 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20  rBy->a; j<nTerm 
6980: 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75  && i<pIdx->nColu
6990: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78  mn; i++){.    Ex
69a0: 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20  pr *pExpr;      
69b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
69c0: 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  on of the ORDER 
69d0: 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20  BY pTerm */.    
69e0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20  CollSeq *pColl; 
69f0: 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74     /* The collat
6a00: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20  ing sequence of 
6a10: 70 45 78 70 72 20 2a 2f 0a 20 20 20 20 69 6e 74  pExpr */.    int
6a20: 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b 20   termSortOrder; 
6a30: 2f 2a 20 53 6f 72 74 20 6f 72 64 65 72 20 66 6f  /* Sort order fo
6a40: 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 0a  r this term */..
6a50: 20 20 20 20 70 45 78 70 72 20 3d 20 70 54 65 72      pExpr = pTer
6a60: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 69 66  m->pExpr;.    if
6a70: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
6a80: 43 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d  COLUMN || pExpr-
6a90: 3e 69 54 61 62 6c 65 21 3d 62 61 73 65 20 29 7b  >iTable!=base ){
6aa0: 0a 20 20 20 20 20 20 2f 2a 20 43 61 6e 20 6e 6f  .      /* Can no
6ab0: 74 20 75 73 65 20 61 6e 20 69 6e 64 65 78 20 73  t use an index s
6ac0: 6f 72 74 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  ort on anything 
6ad0: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 63 6f  that is not a co
6ae0: 6c 75 6d 6e 20 69 6e 20 74 68 65 0a 20 20 20 20  lumn in the.    
6af0: 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74    ** left-most t
6b00: 61 62 6c 65 20 6f 66 20 74 68 65 20 46 52 4f 4d  able of the FROM
6b10: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
6b20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
6b30: 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  .    pColl = sql
6b40: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
6b50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a  pParse, pExpr);.
6b60: 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29      if( !pColl )
6b70: 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66   pColl = db->pDf
6b80: 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  ltColl;.    if( 
6b90: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
6ba0: 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69  pIdx->aiColumn[i
6bb0: 5d 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 73 71  ] || .        sq
6bc0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
6bd0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
6be0: 3e 61 7a 43 6f 6c 6c 5b 69 5d 29 20 29 7b 0a 20  >azColl[i]) ){. 
6bf0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f       /* Term j o
6c00: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6c10: 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d  lause does not m
6c20: 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66  atch column i of
6c30: 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20   the index */.  
6c40: 20 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c      if( i<nEqCol
6c50: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
6c60: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
6c70: 6e 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72  n that is constr
6c80: 61 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c  ained by == fail
6c90: 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20  s to match an.  
6ca0: 20 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42        ** ORDER B
6cb0: 59 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20  Y term, that is 
6cc0: 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65  OK.  Just ignore
6cd0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20   that column of 
6ce0: 74 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20  the index.      
6cf0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e    */.        con
6d00: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
6d10: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49  se{.        /* I
6d20: 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d  f an index colum
6d30: 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68  n fails to match
6d40: 20 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73   and is not cons
6d50: 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20  trained by ==.  
6d60: 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68        ** then th
6d70: 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73  e index cannot s
6d80: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
6d90: 20 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a   BY constraint..
6da0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
6db0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6dc0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
6dd0: 73 73 65 72 74 28 20 70 49 64 78 2d 3e 61 53 6f  ssert( pIdx->aSo
6de0: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
6df0: 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
6e00: 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 30 20 7c 7c  >sortOrder==0 ||
6e10: 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65   pTerm->sortOrde
6e20: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  r==1 );.    asse
6e30: 72 74 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f  rt( pIdx->aSortO
6e40: 72 64 65 72 5b 69 5d 3d 3d 30 20 7c 7c 20 70 49  rder[i]==0 || pI
6e50: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  dx->aSortOrder[i
6e60: 5d 3d 3d 31 20 29 3b 0a 20 20 20 20 74 65 72 6d  ]==1 );.    term
6e70: 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 49 64 78  SortOrder = pIdx
6e80: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
6e90: 5e 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64  ^ pTerm->sortOrd
6ea0: 65 72 3b 0a 20 20 20 20 69 66 28 20 69 3e 6e 45  er;.    if( i>nE
6eb0: 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  qCol ){.      if
6ec0: 28 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 21  ( termSortOrder!
6ed0: 3d 73 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20  =sortOrder ){.  
6ee0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 69 63 65 73        /* Indices
6ef0: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
6f00: 64 20 69 66 20 61 6c 6c 20 4f 52 44 45 52 20 42  d if all ORDER B
6f10: 59 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  Y terms past the
6f20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75 61  .        ** equa
6f30: 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  lity constraints
6f40: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
6f50: 44 45 53 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a  DESC or ASC. */.
6f60: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
6f70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6f80: 6c 73 65 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f  lse{.      sortO
6f90: 72 64 65 72 20 3d 20 74 65 72 6d 53 6f 72 74 4f  rder = termSortO
6fa0: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
6fb0: 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b  j++;.    pTerm++
6fc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
6fd0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
6fe0: 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 66  d for sorting if
6ff0: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
7000: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
7010: 65 0a 20 20 2a 2a 20 61 72 65 20 63 6f 76 65 72  e.  ** are cover
7020: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6a  ed..  */.  if( j
7030: 3e 3d 6e 54 65 72 6d 20 29 7b 0a 20 20 20 20 2a  >=nTerm ){.    *
7040: 70 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65  pbRev = sortOrde
7050: 72 21 3d 30 3b 0a 20 20 20 20 72 65 74 75 72 6e  r!=0;.    return
7060: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
7070: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   0;.}../*.** Che
7080: 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20  ck table to see 
7090: 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
70a0: 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72  clause in pOrder
70b0: 42 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  By can be satisf
70c0: 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e  ied.** by sortin
70d0: 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f  g in order of RO
70e0: 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75  WID.  Return tru
70f0: 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20  e if so and set 
7100: 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20  *pbRev to be.** 
7110: 74 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  true for reverse
7120: 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65   ROWID and false
7130: 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57   for forward ROW
7140: 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ID order..*/.sta
7150: 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65  tic int sortable
7160: 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62  ByRowid(.  int b
7170: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
7180: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
7190: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f  ber for table to
71a0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
71b0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
71c0: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
71d0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
71e0: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7200: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
7210: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
7220: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20  {.  Expr *p;..  
7230: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
7240: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
7250: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
7260: 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64  >0 );.  p = pOrd
7270: 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
7280: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
7290: 2d 3e 6e 45 78 70 72 3d 3d 31 20 26 26 20 70 2d  ->nExpr==1 && p-
72a0: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26  >op==TK_COLUMN &
72b0: 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 62 61 73  & p->iTable==bas
72c0: 65 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70  e.          && p
72d0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b  ->iColumn==-1 ){
72e0: 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f  .    *pbRev = pO
72f0: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
7300: 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75  tOrder;.    retu
7310: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
7320: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
7330: 72 65 70 61 72 65 20 61 20 63 72 75 64 65 20 65  repare a crude e
7340: 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 6c  stimate of the l
7350: 6f 67 61 72 69 74 68 6d 20 6f 66 20 74 68 65 20  ogarithm of the 
7360: 69 6e 70 75 74 20 76 61 6c 75 65 2e 0a 2a 2a 20  input value..** 
7370: 54 68 65 20 72 65 73 75 6c 74 73 20 6e 65 65 64  The results need
7380: 20 6e 6f 74 20 62 65 20 65 78 61 63 74 2e 20 20   not be exact.  
7390: 54 68 69 73 20 69 73 20 6f 6e 6c 79 20 75 73 65  This is only use
73a0: 64 20 66 6f 72 20 65 73 74 69 6d 61 74 69 6e 67  d for estimating
73b0: 0a 2a 2a 20 74 68 65 20 74 6f 74 61 6c 20 63 6f  .** the total co
73c0: 73 74 20 6f 66 20 70 65 72 66 6f 72 6d 69 6e 67  st of performing
73d0: 20 6f 70 65 72 61 74 69 6e 67 73 20 77 69 74 68   operatings with
73e0: 20 4f 28 6c 6f 67 4e 29 20 6f 72 20 4f 28 4e 6c   O(logN) or O(Nl
73f0: 6f 67 4e 29 0a 2a 2a 20 63 6f 6d 70 6c 65 78 69  ogN).** complexi
7400: 74 79 2e 20 20 42 65 63 61 75 73 65 20 4e 20 69  ty.  Because N i
7410: 73 20 6a 75 73 74 20 61 20 67 75 65 73 73 2c 20  s just a guess, 
7420: 69 74 20 69 73 20 6e 6f 20 67 72 65 61 74 20 74  it is no great t
7430: 72 61 67 65 64 79 20 69 66 0a 2a 2a 20 6c 6f 67  ragedy if.** log
7440: 4e 20 69 73 20 61 20 6c 69 74 74 6c 65 20 6f 66  N is a little of
7450: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  f..*/.static dou
7460: 62 6c 65 20 65 73 74 4c 6f 67 28 64 6f 75 62 6c  ble estLog(doubl
7470: 65 20 4e 29 7b 0a 20 20 64 6f 75 62 6c 65 20 6c  e N){.  double l
7480: 6f 67 4e 20 3d 20 31 3b 0a 20 20 64 6f 75 62 6c  ogN = 1;.  doubl
7490: 65 20 78 20 3d 20 31 30 3b 0a 20 20 77 68 69 6c  e x = 10;.  whil
74a0: 65 28 20 4e 3e 78 20 29 7b 0a 20 20 20 20 6c 6f  e( N>x ){.    lo
74b0: 67 4e 20 2b 3d 20 31 3b 0a 20 20 20 20 78 20 2a  gN += 1;.    x *
74c0: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = 10;.  }.  retu
74d0: 72 6e 20 6c 6f 67 4e 3b 0a 7d 0a 0a 23 69 66 6e  rn logN;.}..#ifn
74e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
74f0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
7500: 2a 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 62  ** Compute the b
7510: 65 73 74 20 69 6e 64 65 78 20 66 6f 72 20 61 20  est index for a 
7520: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 0a 2a 2f  virtual table.*/
7530: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62  .static double b
7540: 65 73 74 56 69 72 74 75 61 6c 49 6e 64 65 78 28  estVirtualIndex(
7550: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
7560: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
7570: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
7580: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
7590: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
75b0: 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
75c0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
75d0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c  List_item *pSrc,
75e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d       /* The FROM
75f0: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20   clause term to 
7600: 73 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d  search */.  Bitm
7610: 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20  ask notReady,   
7620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
7630: 73 6b 20 6f 66 20 63 75 72 73 6f 72 73 20 74 68  sk of cursors th
7640: 61 74 20 61 72 65 20 6e 6f 74 20 61 76 61 69 6c  at are not avail
7650: 61 62 6c 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  able */.  ExprLi
7660: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
7670: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7680: 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73 65 20  order by clause 
7690: 2a 2f 0a 20 20 69 6e 74 20 6f 72 64 65 72 42 79  */.  int orderBy
76a0: 55 73 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20  Usable,         
76b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
76c0: 65 20 63 61 6e 20 70 6f 74 65 6e 74 69 61 6c 20  e can potential 
76d0: 73 6f 72 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  sort */.  sqlite
76e0: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 2a 70  3_index_info **p
76f0: 70 49 64 78 49 6e 66 6f 20 2f 2a 20 49 6e 64 65  pIdxInfo /* Inde
7700: 78 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 70 61  x information pa
7710: 73 73 65 64 20 74 6f 20 78 42 65 73 74 49 6e 64  ssed to xBestInd
7720: 65 78 20 2a 2f 0a 29 7b 0a 20 20 54 61 62 6c 65  ex */.){.  Table
7730: 20 2a 70 54 61 62 20 3d 20 70 53 72 63 2d 3e 70   *pTab = pSrc->p
7740: 54 61 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  Tab;.  sqlite3_i
7750: 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64 78 49  ndex_info *pIdxI
7760: 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 71  nfo;.  struct sq
7770: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73  lite3_index_cons
7780: 74 72 61 69 6e 74 20 2a 70 49 64 78 43 6f 6e 73  traint *pIdxCons
7790: 3b 0a 20 20 73 74 72 75 63 74 20 73 71 6c 69 74  ;.  struct sqlit
77a0: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
77b0: 20 2a 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20   *pIdxOrderBy;. 
77c0: 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
77d0: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
77e0: 5f 75 73 61 67 65 20 2a 70 55 73 61 67 65 3b 0a  _usage *pUsage;.
77f0: 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65    WhereTerm *pTe
7800: 72 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  rm;.  int i, j;.
7810: 20 20 69 6e 74 20 6e 4f 72 64 65 72 42 79 3b 0a    int nOrderBy;.
7820: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 71 6c  .  /* If the sql
7830: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7840: 73 74 72 75 63 74 75 72 65 20 68 61 73 20 6e 6f  structure has no
7850: 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c  t been previousl
7860: 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  y.  ** allocated
7870: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 64   and initialized
7880: 20 66 6f 72 20 74 68 69 73 20 76 69 72 74 75 61   for this virtua
7890: 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 61 6c  l table, then al
78a0: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e 64 20  locate.  ** and 
78b0: 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20 6e 6f  initialize it no
78c0: 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49 6e 66  w.  */.  pIdxInf
78d0: 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f 3b 0a  o = *ppIdxInfo;.
78e0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d    if( pIdxInfo==
78f0: 30 20 29 7b 0a 20 20 20 20 57 68 65 72 65 54 65  0 ){.    WhereTe
7900: 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20 20 69  rm *pTerm;.    i
7910: 6e 74 20 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 2f  nt nTerm;..    /
7920: 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
7930: 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65 20 57  er of possible W
7940: 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f 6e 73  HERE clause cons
7950: 74 72 61 69 6e 74 73 20 72 65 66 65 72 72 69 6e  traints referrin
7960: 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  g.    ** to this
7970: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7980: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54 65 72  /.    for(i=nTer
7990: 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43 2d 3e  m=0, pTerm=pWC->
79a0: 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b  a; i<pWC->nTerm;
79b0: 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   i++, pTerm++){.
79c0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
79d0: 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d 20 70  >leftCursor != p
79e0: 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20 63  Src->iCursor ) c
79f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
7a00: 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61  f( pTerm->eOpera
7a10: 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e  tor==WO_IN ) con
7a20: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 54 65  tinue;.      nTe
7a30: 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rm++;.    }..   
7a40: 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44 45 52   /* If the ORDER
7a50: 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e 74 61   BY clause conta
7a60: 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d 6e 73  ins only columns
7a70: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
7a80: 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61 6c 20  .    ** virtual 
7a90: 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c 6f 63  table then alloc
7aa0: 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
7ab0: 65 20 61 4f 72 64 65 72 42 79 20 70 61 72 74 20  e aOrderBy part 
7ac0: 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 71  of.    ** the sq
7ad0: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
7ae0: 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 20 20   structure..    
7af0: 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42 79 20  */.    nOrderBy 
7b00: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 4f 72  = 0;.    if( pOr
7b10: 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 66  derBy ){.      f
7b20: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
7b30: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
7b40: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
7b50: 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42 79 2d  Expr = pOrderBy-
7b60: 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[i].pExpr;.   
7b70: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
7b80: 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c  op!=TK_COLUMN ||
7b90: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d   pExpr->iTable!=
7ba0: 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29 20  pSrc->iCursor ) 
7bb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
7bc0: 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f 72 64       if( i==pOrd
7bd0: 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  erBy->nExpr ){. 
7be0: 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42 79 20         nOrderBy 
7bf0: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  = pOrderBy->nExp
7c00: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
7c10: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
7c20: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  e the sqlite3_in
7c30: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
7c40: 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  re.    */.    pI
7c50: 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d  dxInfo = sqliteM
7c60: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
7c70: 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20 20 20  IdxInfo).       
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c90: 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f 66 28        + (sizeof(
7ca0: 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73 69 7a  *pIdxCons) + siz
7cb0: 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a 6e 54  eof(*pUsage))*nT
7cc0: 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20  erm.            
7cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ce0: 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64 78 4f   + sizeof(*pIdxO
7cf0: 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72 42 79  rderBy)*nOrderBy
7d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78   );.    if( pIdx
7d10: 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Info==0 ){.     
7d20: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7d30: 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20 6f 66  (pParse, "out of
7d40: 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 20   memory");.     
7d50: 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20   return 0.0;.   
7d60: 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49 6e 66   }.    *ppIdxInf
7d70: 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a 0a 20  o = pIdxInfo;.. 
7d80: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
7d90: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20   the structure. 
7da0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   The sqlite3_ind
7db0: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
7dc0: 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 2a  e contains.    *
7dd0: 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 74 68  * many fields th
7de0: 61 74 20 61 72 65 20 64 65 63 6c 61 72 65 64 20  at are declared 
7df0: 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65 76 65  "const" to preve
7e00: 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20 66 72  nt xBestIndex fr
7e10: 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 69  om.    ** changi
7e20: 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68 61 76  ng them.  We hav
7e30: 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66 75 6e  e to do some fun
7e40: 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20 6f 72  ky casting in or
7e50: 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20 69 6e  der to.    ** in
7e60: 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65 20 66  itialize those f
7e70: 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ields..    */.  
7e80: 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28 73 74    pIdxCons = (st
7e90: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7ea0: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a 29 26  ex_constraint*)&
7eb0: 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20 20 20  pIdxInfo[1];.   
7ec0: 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d 20 28   pIdxOrderBy = (
7ed0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
7ee0: 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29 26 70  ndex_orderby*)&p
7ef0: 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d 3b 0a  IdxCons[nTerm];.
7f00: 20 20 20 20 70 55 73 61 67 65 20 3d 20 28 73 74      pUsage = (st
7f10: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
7f20: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
7f30: 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65 72 42  age*)&pIdxOrderB
7f40: 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20 20 20  y[nOrderBy];.   
7f50: 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e 66   *(int*)&pIdxInf
7f60: 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 20 3d  o->nConstraint =
7f70: 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28 69 6e   nTerm;.    *(in
7f80: 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f  t*)&pIdxInfo->nO
7f90: 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42  rderBy = nOrderB
7fa0: 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63 74 20  y;.    *(struct 
7fb0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
7fc0: 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78  nstraint**)&pIdx
7fd0: 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
7fe0: 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a 20 20  t = pIdxCons;.  
7ff0: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
8000: 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79  e3_index_orderby
8010: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 4f  **)&pIdxInfo->aO
8020: 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f 72 64  rderBy = pIdxOrd
8030: 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75  erBy;.    *(stru
8040: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8050: 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73 61 67  _constraint_usag
8060: 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61  e**)&pIdxInfo->a
8070: 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67 65 20  ConstraintUsage 
8080: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
8090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 20 20 20 20 70 55 73 61 67 65 3b 0a 0a         pUsage;..
80d0: 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20 70      for(i=j=0, p
80e0: 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70  Term=pWC->a; i<p
80f0: 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20  WC->nTerm; i++, 
8100: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
8110: 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  if( pTerm->leftC
8120: 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69  ursor != pSrc->i
8130: 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75  Cursor ) continu
8140: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  e;.      if( pTe
8150: 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57  rm->eOperator==W
8160: 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  O_IN ) continue;
8170: 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b  .      pIdxCons[
8180: 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70 54 65  j].iColumn = pTe
8190: 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e 3b 0a  rm->leftColumn;.
81a0: 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73 5b 6a        pIdxCons[j
81b0: 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20 3d 20  ].iTermOffset = 
81c0: 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  i;.      pIdxCon
81d0: 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72 6d 2d  s[j].op = pTerm-
81e0: 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20 20 20  >eOperator;.    
81f0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 45 51 3d    assert( WO_EQ=
8200: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8210: 4e 53 54 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20  NSTRAINT_EQ );. 
8220: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8230: 4c 54 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LT==SQLITE_INDEX
8240: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29  _CONSTRAINT_LT )
8250: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8260: 57 4f 5f 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_LE==SQLITE_IN
8270: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c  DEX_CONSTRAINT_L
8280: 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  E );.      asser
8290: 74 28 20 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45  t( WO_GT==SQLITE
82a0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
82b0: 54 5f 47 54 20 29 3b 0a 20 20 20 20 20 20 61 73  T_GT );.      as
82c0: 73 65 72 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c  sert( WO_GE==SQL
82d0: 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52  ITE_INDEX_CONSTR
82e0: 41 49 4e 54 5f 47 45 20 29 3b 0a 20 20 20 20 20  AINT_GE );.     
82f0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8300: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8310: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
8320: 4f 5f 47 54 7c 57 4f 5f 47 45 29 20 29 3b 0a 20  O_GT|WO_GE) );. 
8330: 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a       j++;.    }.
8340: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
8350: 4f 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20  OrderBy; i++){. 
8360: 20 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72       Expr *pExpr
8370: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8380: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70  ].pExpr;.      p
8390: 49 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43  IdxOrderBy[i].iC
83a0: 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69  olumn = pExpr->i
83b0: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49  Column;.      pI
83c0: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73  dxOrderBy[i].des
83d0: 63 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  c = pOrderBy->a[
83e0: 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  i].sortOrder;.  
83f0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
8400: 65 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75  e module name mu
8410: 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 2a 2f  st be defined */
8420: 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d  .  assert( pTab-
8430: 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20  >azModuleArg && 
8440: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
8450: 67 5b 30 5d 20 29 3b 0a 20 20 69 66 28 20 70 54  g[0] );.  if( pT
8460: 61 62 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a  ab->pVtab==0 ){.
8470: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8480: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 64  Msg(pParse, "und
8490: 65 66 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73  efined module %s
84a0: 20 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 0a   for table %s",.
84b0: 20 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a          pTab->az
84c0: 4d 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54  ModuleArg[0], pT
84d0: 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ab->zName);.    
84e0: 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a  return 0.0;.  }.
84f0: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43  .  /* Set the aC
8500: 6f 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62  onstraint[].usab
8510: 6c 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e  le fields and in
8520: 69 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20  itialize all .  
8530: 2a 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  ** output variab
8540: 6c 65 73 0a 20 20 2a 2f 0a 20 20 70 49 64 78 43  les.  */.  pIdxC
8550: 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74 20 73  ons = *(struct s
8560: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e  qlite3_index_con
8570: 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64 78 49  straint**)&pIdxI
8580: 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
8590: 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70 49 64  ;.  pUsage = pId
85a0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
85b0: 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72 28 69  ntUsage;.  for(i
85c0: 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
85d0: 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
85e0: 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20  , pIdxCons++){. 
85f0: 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e 73 2d     j = pIdxCons-
8600: 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a 20 20  >iTermOffset;.  
8610: 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e    pTerm = &pWC->
8620: 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78 43 6f  a[j];.    pIdxCo
8630: 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20 28 70  ns->usable =  (p
8640: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
8650: 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30  t & notReady)==0
8660: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
8670: 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Usage, 0, sizeof
8680: 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49 64 78  (pUsage[0])*pIdx
8690: 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e  Info->nConstrain
86a0: 74 29 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e  t);.  pIdxInfo->
86b0: 7a 50 6c 61 6e 20 3d 20 30 3b 0a 20 20 70 49 64  zPlan = 0;.  pId
86c0: 78 49 6e 66 6f 2d 3e 6e 50 6c 61 6e 20 3d 20 30  xInfo->nPlan = 0
86d0: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6f 72  ;.  pIdxInfo->or
86e0: 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20 3d 20  derByConsumed = 
86f0: 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 65  0;.  pIdxInfo->e
8700: 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d 20 53  stimatedCost = S
8710: 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20  QLITE_BIG_DBL;. 
8720: 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78   nOrderBy = pIdx
8730: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 3b 0a  Info->nOrderBy;.
8740: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
8750: 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f 72 64  nOrderBy && !ord
8760: 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a 20 20  erByUsable ){.  
8770: 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49 6e    *(int*)&pIdxIn
8780: 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20 30  fo->nOrderBy = 0
8790: 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e 70 56  ;.  }.  pTab->pV
87a0: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e 78 42  tab->pModule->xB
87b0: 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d 3e 70  estIndex(pTab->p
87c0: 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f 29 3b  Vtab, pIdxInfo);
87d0: 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49  .  *(int*)&pIdxI
87e0: 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d 20  nfo->nOrderBy = 
87f0: 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72 65 74 75  nOrderBy;.  retu
8800: 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74  rn pIdxInfo->est
8810: 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a 23 65  imatedCost;.}.#e
8820: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
8830: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
8840: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20   */../*.** Find 
8850: 74 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 66  the best index f
8860: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61 20 70  or accessing a p
8870: 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c 65 2e  articular table.
8880: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
8890: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69 6e 64  er.** to the ind
88a0: 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74 20 64  ex, flags that d
88b0: 65 73 63 72 69 62 65 20 68 6f 77 20 74 68 65 20  escribe how the 
88c0: 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
88d0: 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e 75 6d  used, the.** num
88e0: 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74 79 20  ber of equality 
88f0: 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61 6e 64  constraints, and
8900: 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f 72 20   the "cost" for 
8910: 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  this index..**.*
8920: 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  * The lowest cos
8930: 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20 20 54  t index wins.  T
8940: 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20 65 73  he cost is an es
8950: 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20 61 6d  timate of the am
8960: 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55 20 61  ount of.** CPU a
8970: 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65 65 64  nd disk I/O need
8980: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
8990: 72 65 71 75 65 73 74 20 75 73 69 6e 67 20 74 68  request using th
89a0: 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64 65 78  e selected index
89b0: 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74 68 61  ..** Factors tha
89c0: 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f 73 74  t influence cost
89d0: 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a 2a 20   include:.**.** 
89e0: 20 20 20 2a 20 20 54 68 65 20 65 73 74 69 6d 61     *  The estima
89f0: 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  ted number of ro
8a00: 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ws that will be 
8a10: 72 65 74 72 69 65 76 65 64 2e 20 20 28 54 68 65  retrieved.  (The
8a20: 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65 72 20  .**       fewer 
8a30: 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a 2a 0a  the better.).**.
8a40: 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72  **    *  Whether
8a50: 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e 67 20   or not sorting 
8a60: 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a  must occur..**.*
8a70: 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65 72 20  *    *  Whether 
8a80: 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d 75 73  or not there mus
8a90: 74 20 62 65 20 73 65 70 61 72 61 74 65 20 6c 6f  t be separate lo
8aa0: 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a 2a 20  okups in the.** 
8ab0: 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e 64 20        index and 
8ac0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61 62 6c  in the main tabl
8ad0: 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  e..**.*/.static 
8ae0: 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64 65 78  double bestIndex
8af0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8b00: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
8b10: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
8b20: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
8b30: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
8b40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
8b50: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
8b60: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8b70: 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f 2a 20  item *pSrc,  /* 
8b80: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
8b90: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
8ba0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
8bb0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
8bc0: 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72 73 6f  /* Mask of curso
8bd0: 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74 20  rs that are not 
8be0: 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 45  available */.  E
8bf0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
8c00: 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  y,         /* Th
8c10: 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61 75 73  e order by claus
8c20: 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 2a 70  e */.  Index **p
8c30: 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20 20 20  pIndex,         
8c40: 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70 49 6e     /* Make *ppIn
8c50: 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  dex point to the
8c60: 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20   best index */. 
8c70: 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20   int *pFlags,   
8c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8c90: 50 75 74 20 66 6c 61 67 73 20 64 65 73 63 72 69  Put flags descri
8ca0: 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69 63 65  bing this choice
8cb0: 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f 0a 20   in *pFlags */. 
8cc0: 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20 20 20   int *pnEq      
8cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ce0: 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  Put the number o
8cf0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
8d00: 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f 0a 29  raints here */.)
8d10: 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70  {.  WhereTerm *p
8d20: 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20 2a 62  Term;.  Index *b
8d30: 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20 20 20  estIdx = 0;     
8d40: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 68 61      /* Index tha
8d50: 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f 77 65  t gives the lowe
8d60: 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64 6f 75  st cost */.  dou
8d70: 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20  ble lowestCost; 
8d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8d90: 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20 62 65  cost of using be
8da0: 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62  stIdx */.  int b
8db0: 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  estFlags = 0;   
8dc0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8dd0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8de0: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
8df0: 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20   bestNEq = 0;   
8e00: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 73 74           /* Best
8e10: 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71 20 2a   value for nEq *
8e20: 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20 70  /.  int iCur = p
8e30: 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  Src->iCursor;   
8e40: 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66  /* The cursor of
8e50: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 62 65   the table to be
8e60: 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20 20 49   accessed */.  I
8e70: 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20 20 20  ndex *pProbe;   
8e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
8e90: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 65 76   index we are ev
8ea0: 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20 69 6e  aluating */.  in
8eb0: 74 20 72 65 76 3b 20 20 20 20 20 20 20 20 20 20  t rev;          
8ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8ed0: 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72 65 76  e to scan in rev
8ee0: 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20  erse order */.  
8ef0: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8f10: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
8f20: 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f 0a 20  with pProbe */. 
8f30: 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20   int nEq;       
8f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8f50: 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20  Number of == or 
8f60: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  IN constraints *
8f70: 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b  /.  double cost;
8f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f90: 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69 6e 67  /* Cost of using
8fa0: 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20 54 52   pProbe */..  TR
8fb0: 41 43 45 28 28 22 62 65 73 74 49 6e 64 65 78 3a  ACE(("bestIndex:
8fc0: 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61 64 79   tbl=%s notReady
8fd0: 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e 70 54  =%x\n", pSrc->pT
8fe0: 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74 52 65  ab->zName, notRe
8ff0: 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73 74 43  ady));.  lowestC
9000: 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47  ost = SQLITE_BIG
9010: 5f 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65 20 3d  _DBL;.  pProbe =
9020: 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70 49 6e   pSrc->pTab->pIn
9030: 64 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  dex;..  /* If th
9040: 65 20 74 61 62 6c 65 20 68 61 73 20 6e 6f 20 69  e table has no i
9050: 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
9060: 20 61 72 65 20 6e 6f 20 74 65 72 6d 73 20 69 6e   are no terms in
9070: 20 74 68 65 20 77 68 65 72 65 0a 20 20 2a 2a 20   the where.  ** 
9080: 63 6c 61 75 73 65 20 74 68 61 74 20 72 65 66 65  clause that refe
9090: 72 20 74 6f 20 74 68 65 20 52 4f 57 49 44 2c 20  r to the ROWID, 
90a0: 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 65 76  then we will nev
90b0: 65 72 20 62 65 20 61 62 6c 65 20 74 6f 20 64 6f  er be able to do
90c0: 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 6f  .  ** anything o
90d0: 74 68 65 72 20 74 68 61 6e 20 61 20 66 75 6c 6c  ther than a full
90e0: 20 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e 20 74   table scan on t
90f0: 68 69 73 20 74 61 62 6c 65 2e 20 20 57 65 20 6d  his table.  We m
9100: 69 67 68 74 20 61 73 0a 20 20 2a 2a 20 77 65 6c  ight as.  ** wel
9110: 6c 20 70 75 74 20 69 74 20 66 69 72 73 74 20 69  l put it first i
9120: 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64 65 72  n the join order
9130: 2e 20 20 54 68 61 74 20 77 61 79 2c 20 70 65 72  .  That way, per
9140: 68 61 70 73 20 69 74 20 63 61 6e 20 62 65 0a 20  haps it can be. 
9150: 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 62   ** referenced b
9160: 79 20 6f 74 68 65 72 20 74 61 62 6c 65 73 20 69  y other tables i
9170: 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20 2a 2f  n the join..  */
9180: 0a 20 20 69 66 28 20 70 50 72 6f 62 65 3d 3d 30  .  if( pProbe==0
9190: 20 26 26 0a 20 20 20 20 20 66 69 6e 64 54 65 72   &&.     findTer
91a0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c  m(pWC, iCur, -1,
91b0: 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 7c   0, WO_EQ|WO_IN|
91c0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
91d0: 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20 26 26  T|WO_GE,0)==0 &&
91e0: 0a 20 20 20 20 20 28 70 4f 72 64 65 72 42 79 3d  .     (pOrderBy=
91f0: 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c 65 42  =0 || !sortableB
9200: 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70 4f 72  yRowid(iCur, pOr
9210: 64 65 72 42 79 2c 20 26 72 65 76 29 29 20 29 7b  derBy, &rev)) ){
9220: 0a 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 30  .    *pFlags = 0
9230: 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78 20 3d  ;.    *ppIndex =
9240: 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20 3d 20   0;.    *pnEq = 
9250: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e  0;.    return 0.
9260: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  0;.  }..  /* Che
9270: 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64 3d 45  ck for a rowid=E
9280: 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49 4e 20  XPR or rowid IN 
9290: 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74  (...) constraint
92a0: 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d  s.  */.  pTerm =
92b0: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
92c0: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
92d0: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
92e0: 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72 6d 20  0);.  if( pTerm 
92f0: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78  ){.    Expr *pEx
9300: 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78  pr;.    *ppIndex
9310: 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74 46 6c   = 0;.    bestFl
9320: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
9330: 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20 70 54  D_EQ;.    if( pT
9340: 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
9350: 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20 20 20   WO_EQ ){.      
9360: 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20 61 6c  /* Rowid== is al
9370: 77 61 79 73 20 74 68 65 20 62 65 73 74 20 70 69  ways the best pi
9380: 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66 75 72  ck.  Look no fur
9390: 74 68 65 72 2e 20 20 42 65 63 61 75 73 65 20 6f  ther.  Because o
93a0: 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  nly.      ** a s
93b0: 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67 65 6e  ingle row is gen
93c0: 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74 20 69  erated, output i
93d0: 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f 72 74  s always in sort
93e0: 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20  ed order */.    
93f0: 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48 45 52    *pFlags = WHER
9400: 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57 48 45  E_ROWID_EQ | WHE
9410: 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20 20 20  RE_UNIQUE;.     
9420: 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20 20 20   *pnEq = 1;.    
9430: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 62 65    TRACE(("... be
9440: 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22 29 29  st is rowid\n"))
9450: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  ;.      return 0
9460: 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  .0;.    }else if
9470: 28 20 28 70 45 78 70 72 20 3d 20 70 54 65 72 6d  ( (pExpr = pTerm
9480: 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73 74 21  ->pExpr)->pList!
9490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 52  =0 ){.      /* R
94a0: 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29 3a 20  owid IN (LIST): 
94b0: 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77 68  cost is NlogN wh
94c0: 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ere N is the num
94d0: 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20 20 20  ber of list.    
94e0: 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e 20 20    ** elements.  
94f0: 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  */.      lowestC
9500: 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ost = pExpr->pLi
9510: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
9520: 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d 20 65   lowestCost *= e
9530: 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f 73 74  stLog(lowestCost
9540: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
9550: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20      /* Rowid IN 
9560: 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74 20 69  (SELECT): cost i
9570: 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20  s NlogN where N 
9580: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9590: 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a 20 69   rows.      ** i
95a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
95b0: 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65 63 74  the inner select
95c0: 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20 77 61  .  We have no wa
95d0: 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a 20 20  y to estimate.  
95e0: 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61 6c 75      ** that valu
95f0: 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69 6c 64  e so make a wild
9600: 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20 20 20   guess. */.     
9610: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 32 30   lowestCost = 20
9620: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  0;.    }.    TRA
9630: 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 49  CE(("... rowid I
9640: 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e 22 2c  N cost: %.9g\n",
9650: 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b 0a 20   lowestCost));. 
9660: 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d 61 74   }..  /* Estimat
9670: 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20 61 20  e the cost of a 
9680: 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49 66 20  table scan.  If 
9690: 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77 20 68  we do not know h
96a0: 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65 6e 74  ow many.  ** ent
96b0: 72 69 65 73 20 61 72 65 20 69 6e 20 74 68 65 20  ries are in the 
96c0: 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d 69 6c  table, use 1 mil
96d0: 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73 73 2e  lion as a guess.
96e0: 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d 20 70  .  */.  cost = p
96f0: 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65 2d 3e  Probe ? pProbe->
9700: 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20 31 30  aiRowEst[0] : 10
9710: 30 30 30 30 30 3b 0a 20 20 54 52 41 43 45 28 28  00000;.  TRACE((
9720: 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61 6e 20  "... table scan 
9730: 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39 67 5c  base cost: %.9g\
9740: 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 66 6c  n", cost));.  fl
9750: 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f 57 49  ags = WHERE_ROWI
9760: 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a 20 43  D_RANGE;..  /* C
9770: 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74 72 61  heck for constra
9780: 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67 65 20  ints on a range 
9790: 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61 20 74  of rowids in a t
97a0: 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a 2f 0a  able scan..  */.
97b0: 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65    pTerm = findTe
97c0: 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31  rm(pWC, iCur, -1
97d0: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c  , notReady, WO_L
97e0: 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f  T|WO_LE|WO_GT|WO
97f0: 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  _GE, 0);.  if( p
9800: 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66 28 20  Term ){.    if( 
9810: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
9820: 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79  ur, -1, notReady
9830: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 30  , WO_LT|WO_LE, 0
9840: 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73  ) ){.      flags
9850: 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
9860: 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20  MIT;.      cost 
9870: 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20  /= 3;  /* Guess 
9880: 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50 52 20  that rowid<EXPR 
9890: 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74  eliminates two-t
98a0: 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20 2a 2f  hirds or rows */
98b0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
98c0: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
98d0: 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c  r, -1, notReady,
98e0: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29   WO_GT|WO_GE, 0)
98f0: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
9900: 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d  |= WHERE_BTM_LIM
9910: 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74 20 2f  IT;.      cost /
9920: 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73 20 74  = 3;  /* Guess t
9930: 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52 20 65  hat rowid>EXPR e
9940: 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d 74 68  liminates two-th
9950: 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a 2f 0a  irds of rows */.
9960: 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
9970: 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61 6e 67  ("... rowid rang
9980: 65 20 72 65 64 75 63 65 73 20 63 6f 73 74 20 74  e reduces cost t
9990: 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  o %.9g\n", cost)
99a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
99b0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d 0a 0a  flags = 0;.  }..
99c0: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
99d0: 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f 74 20  e scan does not 
99e0: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
99f0: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69 6e 63  R BY clause, inc
9a00: 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65 20 63  rease.  ** the c
9a10: 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74 6f 20  ost by NlogN to 
9a20: 63 6f 76 65 72 20 74 68 65 20 65 78 70 65 6e 73  cover the expens
9a30: 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20 2a 2f  e of sorting. */
9a40: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20  .  if( pOrderBy 
9a50: 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72 74 61  ){.    if( sorta
9a60: 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c  bleByRowid(iCur,
9a70: 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29   pOrderBy, &rev)
9a80: 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20   ){.      flags 
9a90: 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59  |= WHERE_ORDERBY
9aa0: 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e  |WHERE_ROWID_RAN
9ab0: 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  GE;.      if( re
9ac0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  v ){.        fla
9ad0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45 56 45  gs |= WHERE_REVE
9ae0: 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
9af0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
9b00: 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f  st += cost*estLo
9b10: 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 54  g(cost);.      T
9b20: 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72 74 69  RACE(("... sorti
9b30: 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63 6f 73  ng increases cos
9b40: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
9b50: 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st));.    }.  }.
9b60: 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
9b70: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c 6f 77  tCost ){.    low
9b80: 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b 0a  estCost = cost;.
9b90: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
9ba0: 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  flags;.  }..  /*
9bb0: 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20 69 6e   Look at each in
9bc0: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  dex..  */.  for(
9bd0: 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f 62 65  ; pProbe; pProbe
9be0: 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74 29 7b  =pProbe->pNext){
9bf0: 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
9c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c10: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
9c20: 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  r */.    double 
9c30: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d 20 31  inMultiplier = 1
9c40: 3b 0a 0a 20 20 20 20 54 52 41 43 45 28 28 22 2e  ;..    TRACE((".
9c50: 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e 22 2c  .. index %s:\n",
9c60: 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65 29 29   pProbe->zName))
9c70: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
9c80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
9c90: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69 6e 64  lumns in the ind
9ca0: 65 78 20 74 68 61 74 20 61 72 65 20 73 61 74 69  ex that are sati
9cb0: 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  sfied.    ** by 
9cc0: 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69 6e  x=EXPR constrain
9cd0: 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e 2e 29  ts or x IN (...)
9ce0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20   constraints..  
9cf0: 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 3d    */.    flags =
9d00: 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
9d10: 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75   i<pProbe->nColu
9d20: 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; i++){.      
9d30: 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65 2d 3e  int j = pProbe->
9d40: 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20 20 20  aiColumn[i];.   
9d50: 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54     pTerm = findT
9d60: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6a  erm(pWC, iCur, j
9d70: 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45  , notReady, WO_E
9d80: 51 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62 65 29  Q|WO_IN, pProbe)
9d90: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
9da0: 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m==0 ) break;.  
9db0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
9dc0: 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a 20 20  RE_COLUMN_EQ;.  
9dd0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 65      if( pTerm->e
9de0: 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f 49 4e  Operator & WO_IN
9df0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
9e00: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
9e10: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
9e20: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43  flags |= WHERE_C
9e30: 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20 20 20  OLUMN_IN;.      
9e40: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
9e50: 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20 20  lect!=0 ){.     
9e60: 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c 69 65       inMultiplie
9e70: 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20 20 20  r *= 25;.       
9e80: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
9e90: 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20  ->pList!=0 ){.  
9ea0: 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70          inMultip
9eb0: 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d 3e 70  lier *= pExpr->p
9ec0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20 31 3b  List->nExpr + 1;
9ed0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 73   }.    }.    cos
9ef0: 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69 52 6f  t = pProbe->aiRo
9f00: 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75 6c 74  wEst[i] * inMult
9f10: 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f 67 28  iplier * estLog(
9f20: 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b 0a 20  inMultiplier);. 
9f30: 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20 20 20     nEq = i;.    
9f40: 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e 45 72  if( pProbe->onEr
9f50: 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26 26 20  ror!=OE_None && 
9f60: 28 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  (flags & WHERE_C
9f70: 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20 20 20  OLUMN_IN)==0.   
9f80: 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d 70 50        && nEq==pP
9f90: 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b  robe->nColumn ){
9fa0: 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  .      flags |= 
9fb0: 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20  WHERE_UNIQUE;.  
9fc0: 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22    }.    TRACE(("
9fd0: 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20 69 6e  ...... nEq=%d in
9fe0: 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74 3d 25  Mult=%.9g cost=%
9ff0: 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69 6e 4d  .9g\n", nEq, inM
a000: 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73 74 29  ultiplier, cost)
a010: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20  );..    /* Look 
a020: 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73 74 72  for range constr
a030: 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20 20 20  aints.    */.   
a040: 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62 65 2d   if( nEq<pProbe-
a050: 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >nColumn ){.    
a060: 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
a070: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71 5d 3b  ->aiColumn[nEq];
a080: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66  .      pTerm = f
a090: 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75  indTerm(pWC, iCu
a0a0: 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20  r, j, notReady, 
a0b0: 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47  WO_LT|WO_LE|WO_G
a0c0: 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62 65 29  T|WO_GE, pProbe)
a0d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  ;.      if( pTer
a0e0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  m ){.        fla
a0f0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55  gs |= WHERE_COLU
a100: 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20 20  MN_RANGE;.      
a110: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
a120: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
a130: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
a140: 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20  LE, pProbe) ){. 
a150: 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
a160: 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49 4d 49  = WHERE_TOP_LIMI
a170: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73  T;.          cos
a180: 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  t /= 3;.        
a190: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69  }.        if( fi
a1a0: 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72  ndTerm(pWC, iCur
a1b0: 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57  , j, notReady, W
a1c0: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f  O_GT|WO_GE, pPro
a1d0: 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  be) ){.         
a1e0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
a1f0: 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
a200: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a       cost /= 3;.
a210: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a220: 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e    TRACE(("......
a230: 20 72 61 6e 67 65 20 72 65 64 75 63 65 73 20 63   range reduces c
a240: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
a250: 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a  cost));.      }.
a260: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
a270: 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e 61 6c  d the additional
a280: 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69 6e 67   cost of sorting
a290: 20 69 66 20 74 68 61 74 20 69 73 20 61 20 66 61   if that is a fa
a2a0: 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ctor..    */.   
a2b0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
a2c0: 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c 61 67  .      if( (flag
a2d0: 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
a2e0: 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20 20 20  _IN)==0 &&.     
a2f0: 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e 67 49        isSortingI
a300: 6e 64 65 78 28 70 50 61 72 73 65 2c 70 50 72 6f  ndex(pParse,pPro
a310: 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72 42 79  be,iCur,pOrderBy
a320: 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a 20 20  ,nEq,&rev) ){.  
a330: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 3d        if( flags=
a340: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
a350: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 43 4f  flags = WHERE_CO
a360: 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
a370: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6c      }.        fl
a380: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44  ags |= WHERE_ORD
a390: 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20 69 66  ERBY;.        if
a3a0: 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  ( rev ){.       
a3b0: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
a3c0: 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20  E_REVERSE;.     
a3d0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
a3e0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2b  {.        cost +
a3f0: 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28 63 6f  = cost*estLog(co
a400: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  st);.        TRA
a410: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72 64 65  CE(("...... orde
a420: 72 62 79 20 69 6e 63 72 65 61 73 65 73 20 63 6f  rby increases co
a430: 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63  st to %.9g\n", c
a440: 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ost));.      }. 
a450: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
a460: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
a470: 63 61 6e 20 67 65 74 20 61 77 61 79 20 77 69 74  can get away wit
a480: 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74 68 65  h using just the
a490: 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74 0a 20   index without. 
a4a0: 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69     ** ever readi
a4b0: 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49  ng the table.  I
a4c0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61  f that is the ca
a4d0: 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65 20 74  se, then halve t
a4e0: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74 20 6f  he.    ** cost o
a4f0: 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 20 20  f this index..  
a500: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
a510: 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f 6c 55  gs && pSrc->colU
a520: 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61 73 6b  sed < (((Bitmask
a530: 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b  )1)<<(BMS-1)) ){
a540: 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d  .      Bitmask m
a550: 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73 65 64   = pSrc->colUsed
a560: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
a570: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
a580: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 3b  pProbe->nColumn;
a590: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
a5a0: 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d 3e 61  nt x = pProbe->a
a5b0: 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20  iColumn[j];.    
a5c0: 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d 31 20      if( x<BMS-1 
a5d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 20 26  ){.          m &
a5e0: 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29 31 29  = ~(((Bitmask)1)
a5f0: 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<x);.        }.
a600: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
a610: 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( m==0 ){.      
a620: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
a630: 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20 20 20  _IDX_ONLY;.     
a640: 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a 20 20     cost /= 2;.  
a650: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e        TRACE(("..
a660: 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20 72 65  .... idx-only re
a670: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
a680: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
a690: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
a6a0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 6e 64    /* If this ind
a6b0: 65 78 20 68 61 73 20 61 63 68 69 65 76 65 64 20  ex has achieved 
a6c0: 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20  the lowest cost 
a6d0: 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75 73 65  so far, then use
a6e0: 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
a6f0: 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77 65 73  if( cost < lowes
a700: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 62  tCost ){.      b
a710: 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62 65 3b  estIdx = pProbe;
a720: 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  .      lowestCos
a730: 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20  t = cost;.      
a740: 61 73 73 65 72 74 28 20 66 6c 61 67 73 21 3d 30  assert( flags!=0
a750: 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74 46 6c   );.      bestFl
a760: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
a770: 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71     bestNEq = nEq
a780: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
a790: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62 65 73  * Report the bes
a7a0: 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a 20 20  t result.  */.  
a7b0: 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73 74 49  *ppIndex = bestI
a7c0: 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22 62 65  dx;.  TRACE(("be
a7d0: 73 74 20 69 6e 64 65 78 20 69 73 20 25 73 2c 20  st index is %s, 
a7e0: 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61 67 73  cost=%.9g, flags
a7f0: 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22 2c 0a  =%x, nEq=%d\n",.
a800: 20 20 20 20 20 20 20 20 62 65 73 74 49 64 78 20          bestIdx 
a810: 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61 6d 65  ? bestIdx->zName
a820: 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c 6f 77   : "(none)", low
a830: 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46 6c 61  estCost, bestFla
a840: 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b 0a 20  gs, bestNEq));. 
a850: 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73 74 46   *pFlags = bestF
a860: 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20 3d 20  lags;.  *pnEq = 
a870: 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74 75 72  bestNEq;.  retur
a880: 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a 7d 0a  n lowestCost;.}.
a890: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20  ../*.** Disable 
a8a0: 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48  a term in the WH
a8b0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78 63  ERE clause.  Exc
a8c0: 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73 61  ept, do not disa
a8d0: 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a 20  ble the term.** 
a8e0: 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20 61  if it controls a
a8f0: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
a900: 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74 20   and it did not 
a910: 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68 65  originate in the
a920: 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47 20   ON.** or USING 
a930: 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20 6a  clause of that j
a940: 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 69  oin..**.** Consi
a950: 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32 2e  der the term t2.
a960: 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66 6f  z='ok' in the fo
a970: 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73 3a  llowing queries:
a980: 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53 45  .**.**   (1)  SE
a990: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c  LECT * FROM t1 L
a9a0: 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74  EFT JOIN t2 ON t
a9b0: 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20 74  1.a=t2.x WHERE t
a9c0: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28 32  2.z='ok'.**   (2
a9d0: 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  )  SELECT * FROM
a9e0: 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32   t1 LEFT JOIN t2
a9f0: 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e   ON t1.a=t2.x AN
aa00: 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20  D t2.z='ok'.**  
aa10: 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (3)  SELECT * F
aa20: 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52 45  ROM t1, t2 WHERE
aa30: 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20 74   t1.a=t2.x AND t
aa40: 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20 54  2.z='ok'.**.** T
aa50: 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73 20  he t2.z='ok' is 
aa60: 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65 20  disabled in the 
aa70: 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20 69  in (2) because i
aa80: 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a 20  t originates.** 
aa90: 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73 65  in the ON clause
aaa0: 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20 64  .  The term is d
aab0: 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20 62  isabled in (3) b
aac0: 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f 74  ecause it is not
aad0: 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c 45   part.** of a LE
aae0: 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20 20  FT OUTER JOIN.  
aaf0: 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72 6d  In (1), the term
ab00: 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65 64   is not disabled
ab10: 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69 6e  ..**.** Disablin
ab20: 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73 20  g a term causes 
ab30: 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f 74  that term to not
ab40: 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74 68   be tested in th
ab50: 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a 20  e inner loop.** 
ab60: 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44 69  of the join.  Di
ab70: 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f 70  sabling is an op
ab80: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 68 65  timization.  Whe
ab90: 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61 74 69  n terms are sati
aba0: 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e 64 69  sfied.** by indi
abb0: 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c 65 20  ces, we disable 
abc0: 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e 74 20  them to prevent 
abd0: 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74 73 20  redundant tests 
abe0: 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a 2a 20  in the inner.** 
abf0: 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c 64 20  loop.  We would 
ac00: 67 65 74 20 74 68 65 20 63 6f 72 72 65 63 74 20  get the correct 
ac10: 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68 69  results if nothi
ac20: 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69 73  ng were ever dis
ac30: 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20 6a 6f  abled,.** but jo
ac40: 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20  ins might run a 
ac50: 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e 20 20  little slower.  
ac60: 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f 20  The trick is to 
ac70: 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68 0a  disable as much.
ac80: 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77 69 74  ** as we can wit
ac90: 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67 20 74  hout disabling t
aca0: 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65 20  oo much.  If we 
acb0: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29 2c  disabled in (1),
acc0: 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74 68 65   we'd get.** the
acd0: 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e 20 20   wrong answer.  
ace0: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
acf0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ad00: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
ad10: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
ad20: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
ad30: 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d 0a 20  ){.  if( pTerm. 
ad40: 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e       && (pTerm->
ad50: 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
ad60: 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26 26 20  ED)==0.      && 
ad70: 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f  (pLevel->iLeftJo
ad80: 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73  in==0 || ExprHas
ad90: 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d 2d 3e  Property(pTerm->
ada0: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
adb0: 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 70 54  in)).  ){.    pT
adc0: 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45  erm->flags |= TE
add0: 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 69 66  RM_CODED;.    if
ade0: 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  ( pTerm->iParent
adf0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57 68 65  >=0 ){.      Whe
ae00: 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72 20 3d  reTerm *pOther =
ae10: 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e 61 5b   &pTerm->pWC->a[
ae20: 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74 5d 3b  pTerm->iParent];
ae30: 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d 70 4f  .      if( (--pO
ae40: 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d 3d 30  ther->nChild)==0
ae50: 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 61   ){.        disa
ae60: 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
ae70: 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20 20 7d  pOther);.      }
ae80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
ae90: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
aea0: 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61 20  e that builds a 
aeb0: 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e 64  probe for an ind
aec0: 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a 2a  ex.  Details:.**
aed0: 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b 20  .**    *  Check 
aee0: 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20  the top nColumn 
aef0: 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20 73  entries on the s
af00: 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a 2a  tack.  If any.**
af10: 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65 20         of those 
af20: 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c 4c  entries are NULL
af30: 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74 65  , jump immediate
af40: 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20 20  ly to brk,.**   
af50: 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68 65      which is the
af60: 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e 63   loop exit, sinc
af70: 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72 79  e no index entry
af80: 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20 20   will match.**  
af90: 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72 74       if any part
afa0: 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20 4e   of the key is N
afb0: 55 4c 4c 2e 20 50 6f 70 20 28 6e 43 6f 6c 75 6d  ULL. Pop (nColum
afc0: 6e 2b 6e 45 78 74 72 61 29 20 0a 2a 2a 20 20 20  n+nExtra) .**   
afd0: 20 20 20 20 65 6c 65 6d 65 6e 74 73 20 66 72 6f      elements fro
afe0: 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  m the stack..**.
aff0: 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72 75  **    *  Constru
b000: 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72 79  ct a probe entry
b010: 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e 43   from the top nC
b020: 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69 6e  olumn entries in
b030: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 74  .**       the st
b040: 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69 74  ack with affinit
b050: 69 65 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  ies appropriate 
b060: 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e 20  for index pIdx. 
b070: 0a 2a 2a 20 20 20 20 20 20 20 4f 6e 6c 79 20 6e  .**       Only n
b080: 43 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74 73 20  Column elements 
b090: 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f 6d 20  are popped from 
b0a0: 74 68 65 20 73 74 61 63 6b 20 69 6e 20 74 68 69  the stack in thi
b0b0: 73 20 63 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  s case.**       
b0c0: 28 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (by OP_MakeRecor
b0d0: 64 29 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  d)..**.*/.static
b0e0: 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64 65 78   void buildIndex
b0f0: 50 72 6f 62 65 28 0a 20 20 56 64 62 65 20 2a 76  Probe(.  Vdbe *v
b100: 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e  , .  int nColumn
b110: 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  , .  int nExtra,
b120: 20 0a 20 20 69 6e 74 20 62 72 6b 2c 20 0a 20 20   .  int brk, .  
b130: 49 6e 64 65 78 20 2a 70 49 64 78 0a 29 7b 0a 20  Index *pIdx.){. 
b140: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b150: 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c  p(v, OP_NotNull,
b160: 20 2d 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74   -nColumn, sqlit
b170: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
b180: 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74  r(v)+3);.  sqlit
b190: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b1a0: 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2b 6e  P_Pop, nColumn+n
b1b0: 45 78 74 72 61 2c 20 30 29 3b 0a 20 20 73 71 6c  Extra, 0);.  sql
b1c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1d0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b   OP_Goto, 0, brk
b1e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
b1f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65  AddOp(v, OP_Make
b200: 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c  Record, nColumn,
b210: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e   0);.  sqlite3In
b220: 64 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76  dexAffinityStr(v
b230: 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  , pIdx);.}.../*.
b240: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
b250: 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 65 71   for a single eq
b260: 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74  uality term of t
b270: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e  he WHERE clause.
b280: 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a    An equality.**
b290: 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74   term can be eit
b2a0: 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20 58 20  her X=expr or X 
b2b0: 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
b2c0: 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20 74 6f  m is the term to
b2d0: 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e 0a 2a   be .** coded..*
b2e0: 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65 6e 74  *.** The current
b2f0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 63   value for the c
b300: 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c 65 66  onstraint is lef
b310: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
b320: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
b330: 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61 69 6e   For a constrain
b340: 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 3d  t of the form X=
b350: 65 78 70 72 2c 20 74 68 65 20 65 78 70 72 65 73  expr, the expres
b360: 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61 74 65  sion is evaluate
b370: 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72 65 73  d and its.** res
b380: 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e 20 74  ult is left on t
b390: 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72 20 63  he stack.  For c
b3a0: 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20 74 68  onstraints of th
b3b0: 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e 2e 2e  e form X IN (...
b3c0: 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ).** this routin
b3d0: 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f 6f 70  e sets up a loop
b3e0: 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65 72 61   that will itera
b3f0: 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75  te over all valu
b400: 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74 61 74  es of X..*/.stat
b410: 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61  ic void codeEqua
b420: 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73  lityTerm(.  Pars
b430: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
b440: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
b450: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72  ontext */.  Wher
b460: 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20  eTerm *pTerm,   
b470: 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74  /* The term of t
b480: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
b490: 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20  to be coded */. 
b4a0: 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20   int brk,       
b4b0: 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72       /* Jump her
b4c0: 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65  e to abandon the
b4d0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65   loop */.  Where
b4e0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f  Level *pLevel  /
b4f0: 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20  * When level of 
b500: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
b510: 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f  we are working o
b520: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
b530: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70  pX = pTerm->pExp
b540: 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70 21  r;.  if( pX->op!
b550: 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73  =TK_IN ){.    as
b560: 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b  sert( pX->op==TK
b570: 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  _EQ );.    sqlit
b580: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b590: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
b5a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b5b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 7d  MIT_SUBQUERY.  }
b5c0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 54  else{.    int iT
b5d0: 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61 49 6e  ab;.    int *aIn
b5e0: 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20  ;.    Vdbe *v = 
b5f0: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a  pParse->pVdbe;..
b600: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53      sqlite3CodeS
b610: 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c  ubselect(pParse,
b620: 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d   pX);.    iTab =
b630: 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20   pX->iTable;.   
b640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b650: 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
b660: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 56 64  iTab, 0);.    Vd
b670: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
b680: 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e   %.*s", pX->span
b690: 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29  .n, pX->span.z))
b6a0: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49  ;.    pLevel->nI
b6b0: 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 52  n++;.    sqliteR
b6c0: 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28 76 6f  eallocOrFree((vo
b6d0: 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e 61 49  id**)&pLevel->aI
b6e0: 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20 20 20  nLoop,.         
b6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b700: 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70          sizeof(p
b710: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 30  Level->aInLoop[0
b720: 5d 29 2a 32 2a 70 4c 65 76 65 6c 2d 3e 6e 49 6e  ])*2*pLevel->nIn
b730: 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70 4c 65  );.    aIn = pLe
b740: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a 20 20  vel->aInLoop;.  
b750: 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20 20 20    if( aIn ){.   
b760: 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76 65 6c     aIn += pLevel
b770: 2d 3e 6e 49 6e 2a 32 20 2d 20 32 3b 0a 20 20 20  ->nIn*2 - 2;.   
b780: 20 20 20 61 49 6e 5b 30 5d 20 3d 20 69 54 61 62     aIn[0] = iTab
b790: 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d 20 3d  ;.      aIn[1] =
b7a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7b0: 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20  p(v, OP_Column, 
b7c0: 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 7d 65  iTab, 0);.    }e
b7d0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  lse{.      pLeve
b7e0: 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20 20 20  l->nIn = 0;.    
b7f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  }.#endif.  }.  d
b800: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
b810: 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a  l, pTerm);.}../*
b820: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
b830: 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76 61 6c  e that will eval
b840: 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e 64 20  uate all == and 
b850: 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  IN constraints f
b860: 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 2e 20  or an.** index. 
b870: 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f 72 20   The values for 
b880: 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  all constraints 
b890: 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68 65 20  are left on the 
b8a0: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  stack..**.** For
b8b0: 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73 69 64   example, consid
b8c0: 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c 62 2c  er table t1(a,b,
b8d0: 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20 69 6e  c,d,e,f) with in
b8e0: 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e 0a 2a  dex i1(a,b,c)..*
b8f0: 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20 57 48  * Suppose the WH
b900: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 74 68  ERE clause is th
b910: 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20 62 20  is:  a==5 AND b 
b920: 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44 20 63  IN (1,2,3) AND c
b930: 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a 20 54  >5 AND c<10.** T
b940: 68 65 20 69 6e 64 65 78 20 68 61 73 20 61 73 20  he index has as 
b950: 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20 65 71  many as three eq
b960: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
b970: 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69 73 0a  ts, but in this.
b980: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  ** example, the 
b990: 74 68 69 72 64 20 22 63 22 20 76 61 6c 75 65 20  third "c" value 
b9a0: 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
b9b0: 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f 20 0a  .  So only two .
b9c0: 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ** constraints a
b9d0: 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69 73 20  re coded.  This 
b9e0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67 65 6e  routine will gen
b9f0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 65 76  erate code to ev
ba00: 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35 20 61  aluate.** a==5 a
ba10: 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33 29 2e  nd b IN (1,2,3).
ba20: 20 20 54 68 65 20 63 75 72 72 65 6e 74 20 76 61    The current va
ba30: 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64 20 62  lues for a and b
ba40: 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a 2a 2a   will be left.**
ba50: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 2d 20   on the stack - 
ba60: 61 20 69 73 20 74 68 65 20 64 65 65 70 65 73 74  a is the deepest
ba70: 20 61 6e 64 20 62 20 74 68 65 20 73 68 61 6c 6c   and b the shall
ba80: 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  owest..**.** In 
ba90: 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62 6f 76  the example abov
baa0: 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74 20 74  e nEq==2.  But t
bab0: 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 77  his subroutine w
bac0: 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76 61 6c  orks for any val
bad0: 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69 6e 63  ue.** of nEq inc
bae0: 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20 6e 45  luding 0.  If nE
baf0: 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75 74 69  q==0, this routi
bb00: 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61 20 6e  ne is nearly a n
bb10: 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  o-op..** The onl
bb20: 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65 73 20  y thing it does 
bb30: 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  is allocate the 
bb40: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d 65 6d  pLevel->iMem mem
bb50: 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
bb60: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 77  This routine alw
bb70: 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20 61 74  ays allocates at
bb80: 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d 6f 72   least one memor
bb90: 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74 73 0a  y cell and puts.
bba0: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
bbb0: 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 63 65  f that memory ce
bbc0: 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e 69 4d  ll in pLevel->iM
bbd0: 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20 74 68  em.  The code th
bbe0: 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68 69 73  at.** calls this
bbf0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 75 73   routine will us
bc00: 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 74  e pLevel->iMem t
bc10: 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65 72 6d  o store the term
bc20: 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79 20 76  ination.** key v
bc30: 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70  alue of the loop
bc40: 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  .  If one or mor
bc50: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 61  e IN operators a
bc60: 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a 20 74  ppear, then.** t
bc70: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 6c 6f  his routine allo
bc80: 63 61 74 65 73 20 61 6e 20 61 64 64 69 74 69 6f  cates an additio
bc90: 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79 20 63  nal nEq memory c
bca0: 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72 6e 61  ells for interna
bcb0: 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l.** use..*/.sta
bcc0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41 6c 6c  tic void codeAll
bcd0: 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 0a 20  EqualityTerms(. 
bce0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
bcf0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
bd00: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57  g context */.  W
bd10: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
bd20: 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20 6e 65  l,   /* Which ne
bd30: 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65  sted loop of the
bd40: 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63 6f 64   FROM we are cod
bd50: 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c  ing */.  WhereCl
bd60: 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20 20 2f  ause *pWC,     /
bd70: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
bd80: 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  se */.  Bitmask 
bd90: 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20 2f 2a  notReady,     /*
bda0: 20 57 68 69 63 68 20 70 61 72 74 73 20 6f 66 20   Which parts of 
bdb0: 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20 79 65  FROM have not ye
bdc0: 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a 2f 0a  t been coded */.
bdd0: 20 20 69 6e 74 20 62 72 6b 20 20 20 20 20 20 20    int brk       
bde0: 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20          /* Jump 
bdf0: 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68 65 20  here to end the 
be00: 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  loop */.){.  int
be10: 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
be20: 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Eq;        /* Th
be30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  e number of == o
be40: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
be50: 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e   to code */.  in
be60: 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d 20 30  t termsInMem = 0
be70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
be80: 66 20 74 72 75 65 2c 20 73 74 6f 72 65 20 76 61  f true, store va
be90: 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63 65 6c  lue in mem[] cel
bea0: 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20  ls */.  Vdbe *v 
beb0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
bec0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 69 72        /* The vir
bed0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75 6e 64  tual machine und
bee0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
bef0: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
bf00: 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b   = pLevel->pIdx;
bf10: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
bf20: 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72 20 74  being used for t
bf30: 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20 69 6e  his loop */.  in
bf40: 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  t iCur = pLevel-
bf50: 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a 20 54  >iTabCur;   /* T
bf60: 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74 68 65  he cursor of the
bf70: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68 65 72   table */.  Wher
bf80: 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20  eTerm *pTerm;   
bf90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
bfa0: 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69 6e 74  ingle constraint
bfb0: 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74 20 6a   term */.  int j
bfc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bfd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
bfe0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 2f   counter */..  /
bff0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
c000: 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63 65 6c   many memory cel
c010: 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65 64 20  ls we will need 
c020: 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 74 68  then allocate th
c030: 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c 77 61  em..  ** We alwa
c040: 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61 73 74  ys need at least
c050: 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73 74 6f   one used to sto
c060: 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65 72 6d  re the loop term
c070: 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61 6c 75  inator.  ** valu
c080: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
c090: 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 77 65   IN operators we
c0a0: 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66 6f 72  'll need one for
c0b0: 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20 2a 2a   each == or.  **
c0c0: 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a   IN constraint..
c0d0: 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d 3e 69    */.  pLevel->i
c0e0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
c0f0: 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c 65 76  em++;.  if( pLev
c100: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
c110: 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b 0a 20  E_COLUMN_IN ){. 
c120: 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20     pParse->nMem 
c130: 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a  += pLevel->nEq;.
c140: 20 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d      termsInMem =
c150: 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 76   1;.  }..  /* Ev
c160: 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
c170: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
c180: 20 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20    */.  for(j=0; 
c190: 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  j<pIdx->nColumn;
c1a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6b   j++){.    int k
c1b0: 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d   = pIdx->aiColum
c1c0: 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72 6d 20  n[j];.    pTerm 
c1d0: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
c1e0: 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
c1f0: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
c200: 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28 20 70  pIdx);.    if( p
c210: 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Term==0 ) break;
c220: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54  .    assert( (pT
c230: 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
c240: 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
c250: 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
c260: 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
c270: 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b  m, brk, pLevel);
c280: 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73 49 6e  .    if( termsIn
c290: 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Mem ){.      sql
c2a0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c2b0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
c2c0: 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31 2c 20  evel->iMem+j+1, 
c2d0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
c2e0: 61 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71 20 29  assert( j==nEq )
c2f0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
c300: 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73 74 72  e all the constr
c310: 61 69 6e 74 20 76 61 6c 75 65 73 20 61 72 65 20  aint values are 
c320: 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  on the top of th
c330: 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20 20 69  e stack.  */.  i
c340: 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b  f( termsInMem ){
c350: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
c360: 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nEq; j++){.     
c370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c380: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
c390: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b   pLevel->iMem+j+
c3a0: 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  1, 0);.    }.  }
c3b0: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
c3c0: 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
c3d0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
c3e0: 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73 20   variable holds 
c3f0: 61 20 74 65 78 74 20 64 65 73 63 72 69 70 74 69  a text descripti
c400: 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c 61 6e  on of query plan
c410: 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 62 79   generated.** by
c420: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
c430: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
c440: 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20 20 45  WhereBegin().  E
c450: 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68 65 72  ach call to Wher
c460: 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72 77 72  eBegin.** overwr
c470: 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
c480: 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61  s.  This informa
c490: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72  tion is used for
c4a0: 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a 2a 20   testing and.** 
c4b0: 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
c4c0: 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 5f 71  /.char sqlite3_q
c4d0: 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a 32 2a  uery_plan[BMS*2*
c4e0: 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20 6f 66  40];  /* Text of
c4f0: 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73 74 61   the join */.sta
c500: 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e 20 3d  tic int nQPlan =
c510: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
c520: 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20 73 6c   /* Next free sl
c530: 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70 6c 61  ow in _query_pla
c540: 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  n[] */..#endif /
c550: 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20 2a 2f  * SQLITE_TEST */
c560: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20  .../*.** Free a 
c570: 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75 63 74  WhereInfo struct
c580: 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ure.*/.static vo
c590: 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  id whereInfoFree
c5a0: 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e  (WhereInfo *pWIn
c5b0: 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49 6e 66  fo){.  if( pWInf
c5c0: 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  o ){.    int i;.
c5d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c5e0: 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b 20 69  WInfo->nLevel; i
c5f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
c600: 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78  WInfo->a[i].pIdx
c610: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
c620: 73 71 6c 69 74 65 46 72 65 65 28 70 57 49 6e 66  sqliteFree(pWInf
c630: 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f  o->a[i].pIdxInfo
c640: 2d 3e 7a 50 6c 61 6e 29 3b 0a 20 20 20 20 20 20  ->zPlan);.      
c650: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
c660: 65 65 28 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e  ee(pWInfo->a[i].
c670: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 7d  pIdxInfo);.    }
c680: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
c690: 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  pWInfo);.  }.}..
c6a0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
c6b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
c6c0: 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20 66   the loop used f
c6d0: 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  or WHERE clause 
c6e0: 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20 54  processing..** T
c6f0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
c700: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
c710: 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63 74  an opaque struct
c720: 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ure that contain
c730: 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  s.** information
c740: 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d 69   needed to termi
c750: 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20 20  nate the loop.  
c760: 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 69  Later, the calli
c770: 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 68  ng routine.** sh
c780: 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c 69  ould invoke sqli
c790: 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77 69  te3WhereEnd() wi
c7a0: 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  th the return va
c7b0: 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63  lue of this func
c7c0: 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  tion.** in order
c7d0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68 65   to complete the
c7e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70 72   WHERE clause pr
c7f0: 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  ocessing..**.** 
c800: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
c810: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
c820: 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a 2a   returns NULL..*
c830: 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20 69  *.** The basic i
c840: 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20 6e  dea is to do a n
c850: 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65 20  ested loop, one 
c860: 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74 61  loop for each ta
c870: 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 52  ble in.** the FR
c880: 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20 73  OM clause of a s
c890: 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54 20  elect.  (INSERT 
c8a0: 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74 65  and UPDATE state
c8b0: 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a 2a  ments are the.**
c8c0: 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45 43   same as a SELEC
c8d0: 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73 69  T with only a si
c8e0: 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68  ngle table in th
c8f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29 20  e FROM clause.) 
c900: 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c   For.** example,
c910: 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20 74   if the SQL is t
c920: 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  his:.**.**      
c930: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
c940: 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45 20  1, t2, t3 WHERE 
c950: 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...;.**.** Then 
c960: 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
c970: 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61 6c  ed is conceptual
c980: 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c 6c  ly like the foll
c990: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
c9a0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
c9b0: 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c 20  n t1 do       \ 
c9c0: 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
c9d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72 65  d.**        fore
c9e0: 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20 64  ach row2 in t2 d
c9f0: 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71  o      |-- by sq
ca00: 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28  lite3WhereBegin(
ca10: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6f  ).**          fo
ca20: 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74 33  reach row3 in t3
ca30: 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20 20   do   /.**      
ca40: 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20        ....**    
ca50: 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20 20        end       
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 20                \ 
ca70: 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74 65     Code generate
ca80: 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64 20  d.**        end 
ca90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caa0: 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73 71         |-- by sq
cab0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 0a  lite3WhereEnd().
cac0: 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20 20  **      end     
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65      /.**.** Note
caf0: 20 74 68 61 74 20 74 68 65 20 6c 6f 6f 70 73 20   that the loops 
cb00: 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 6e 65 73  might not be nes
cb10: 74 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72  ted in the order
cb20: 20 69 6e 20 77 68 69 63 68 20 74 68 65 79 0a 2a   in which they.*
cb30: 2a 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20  * appear in the 
cb40: 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 66 20 61  FROM clause if a
cb50: 20 64 69 66 66 65 72 65 6e 74 20 6f 72 64 65 72   different order
cb60: 20 69 73 20 62 65 74 74 65 72 20 61 62 6c 65 20   is better able 
cb70: 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73 65 20 6f  to make.** use o
cb80: 66 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 65  f indices.  Note
cb90: 20 61 6c 73 6f 20 74 68 61 74 20 77 68 65 6e 20   also that when 
cba0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
cbb0: 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a 20 74 68  appears in.** th
cbc0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2c 20  e WHERE clause, 
cbd0: 69 74 20 6d 69 67 68 74 20 72 65 73 75 6c 74 20  it might result 
cbe0: 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 6e 65  in additional ne
cbf0: 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f 72 0a 2a  sted loops for.*
cc00: 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  * scanning throu
cc10: 67 68 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 6e  gh all values on
cc20: 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
cc30: 73 69 64 65 20 6f 66 20 74 68 65 20 49 4e 2e 0a  side of the IN..
cc40: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
cc50: 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61 73  Btree cursors as
cc60: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
cc70: 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75 73  ch table.  t1 us
cc80: 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d  es cursor.** num
cc90: 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  ber pTabList->a[
cca0: 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32 20  0].iCursor.  t2 
ccb0: 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72 20  uses the cursor 
ccc0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e 69  pTabList->a[1].i
ccd0: 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20 73  Cursor..** And s
cce0: 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20 72  o forth.  This r
ccf0: 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65 73  outine generates
cd00: 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74 68   code to open th
cd10: 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72 73  ose VDBE cursors
cd20: 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 57  .** and sqlite3W
cd30: 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72 61  hereEnd() genera
cd40: 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f 20  tes the code to 
cd50: 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a 2a  close them..**.*
cd60: 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74 20  * The code that 
cd70: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
cd80: 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c 65  n() generates le
cd90: 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72 73  aves the cursors
cda0: 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54 61   named.** in pTa
cdb0: 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20 61  bList pointing a
cdc0: 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72 69  t their appropri
cdd0: 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54 68  ate entries.  Th
cde0: 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a 20  e [...] code.** 
cdf0: 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75 6d  can use OP_Colum
ce00: 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20 6f  n and OP_Rowid o
ce10: 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65 20  pcodes on these 
ce20: 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72 61  cursors to extra
ce30: 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  ct.** data from 
ce40: 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62 6c  the various tabl
ce50: 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  es of the loop..
ce60: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48 45  **.** If the WHE
ce70: 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d 70  RE clause is emp
ce80: 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68 20  ty, the foreach 
ce90: 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68 20  loops must each 
cea0: 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65 6e  scan their.** en
ceb0: 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54 68  tire tables.  Th
cec0: 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20 6a  us a three-way j
ced0: 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33 29  oin is an O(N^3)
cee0: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74   operation.  But
cef0: 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65   if.** the table
cf00: 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20 61  s have indices a
cf10: 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65 72  nd there are ter
cf20: 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20  ms in the WHERE 
cf30: 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20 72  clause that.** r
cf40: 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69 6e  efer to those in
cf50: 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65 74  dices, a complet
cf60: 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61 6e  e table scan can
cf70: 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64 20   be avoided and 
cf80: 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c 6c  the.** code will
cf90: 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65 72   run much faster
cfa0: 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20 77  .  Most of the w
cfb0: 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ork of this rout
cfc0: 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67 0a  ine is checking.
cfd0: 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ** to see if the
cfe0: 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20 74  re are indices t
cff0: 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
d000: 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65 20  to speed up the 
d010: 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72 6d  loop..**.** Term
d020: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
d030: 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20 75  lause are also u
d040: 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68 69  sed to limit whi
d050: 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c 79  ch rows actually
d060: 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20 74  .** make it to t
d070: 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65 20  he "..." in the 
d080: 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c 6f  middle of the lo
d090: 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68 20  op.  After each 
d0a0: 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74 65  "foreach",.** te
d0b0: 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45  rms of the WHERE
d0c0: 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73 65   clause that use
d0d0: 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20 74   only terms in t
d0e0: 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75 74  hat loop and out
d0f0: 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65 20  er.** loops are 
d100: 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 66  evaluated and if
d110: 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69 73   false a jump is
d120: 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c 6c   made around all
d130: 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 69   subsequent.** i
d140: 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20 61  nner loops (or a
d150: 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22 20  round the "..." 
d160: 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63 75  if the test occu
d170: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69 6e  rs within the in
d180: 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f 6f  ner-.** most loo
d190: 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20 4a  p).**.** OUTER J
d1a0: 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f 75  OINS.**.** An ou
d1b0: 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62 6c  ter join of tabl
d1c0: 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73 20  es t1 and t2 is 
d1d0: 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64 65  conceptally code
d1e0: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
d1f0: 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20 72  .**    foreach r
d200: 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a 20  ow1 in t1 do.** 
d210: 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a 2a       flag = 0.**
d220: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
d230: 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20 20  w2 in t2 do.**  
d240: 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a 20        start:.** 
d250: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
d260: 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d 20           flag = 
d270: 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a 2a  1.**      end.**
d280: 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d 30        if flag==0
d290: 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20   then.**        
d2a0: 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63 75  move the row2 cu
d2b0: 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20 72  rsor to a null r
d2c0: 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f 74  ow.**        got
d2d0: 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20 20  o start.**      
d2e0: 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a 0a  fi.**    end.**.
d2f0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41 55  ** ORDER BY CLAU
d300: 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a 2a  SE PROCESSING.**
d310: 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
d320: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
d330: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d340: 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20 73  se of a SELECT s
d350: 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66 20  tatement,.** if 
d360: 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 49  there is one.  I
d370: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f 52  f there is no OR
d380: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 72  DER BY clause or
d390: 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
d3a0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66 72  .** is called fr
d3b0: 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20  om an UPDATE or 
d3c0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
d3d0: 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42 79  , then ppOrderBy
d3e0: 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   is NULL..**.** 
d3f0: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  If an index can 
d400: 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74 20  be used so that 
d410: 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74 70  the natural outp
d420: 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65 20  ut order of the 
d430: 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69 73  table.** scan is
d440: 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68 65   correct for the
d450: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
d460: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64 65  , then that inde
d470: 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a 2a  x is used and.**
d480: 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20 73   *ppOrderBy is s
d490: 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68 69  et to NULL.  Thi
d4a0: 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  s is an optimiza
d4b0: 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65 6e  tion that preven
d4c0: 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65 73  ts an.** unneces
d4d0: 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68 65  sary sort of the
d4e0: 20 72 65 73 75 6c 74 20 73 65 74 20 69 66 20 61   result set if a
d4f0: 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72 69  n index appropri
d500: 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 4f  ate for the.** O
d510: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61  RDER BY clause a
d520: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a 2a  lready exists..*
d530: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65 72  *.** If the wher
d540: 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20 63  e clause loops c
d550: 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67 65  annot be arrange
d560: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65  d to provide the
d570: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74 70   correct.** outp
d580: 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20 74  ut order, then t
d590: 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73  he *ppOrderBy is
d5a0: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 57   unchanged..*/.W
d5b0: 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74 65  hereInfo *sqlite
d5c0: 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20 50  3WhereBegin(.  P
d5d0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d5e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
d5f0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
d600: 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73  SrcList *pTabLis
d610: 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20  t,    /* A list 
d620: 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74 6f  of all tables to
d630: 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 20   be scanned */. 
d640: 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20 20   Expr *pWhere,  
d650: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48         /* The WH
d660: 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ERE clause */.  
d670: 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72 64  ExprList **ppOrd
d680: 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44 45  erBy  /* An ORDE
d690: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72 20  R BY clause, or 
d6a0: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  NULL */.){.  int
d6b0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
d6c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d6d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68 65  counter */.  Whe
d6e0: 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b 20  reInfo *pWInfo; 
d6f0: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c 20          /* Will 
d700: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75 72  become the retur
d710: 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  n value of this 
d720: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64  function */.  Vd
d730: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
d740: 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65 20  pVdbe;   /* The 
d750: 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73 65  virtual database
d760: 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e 74   engine */.  int
d770: 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b 20   brk, cont = 0; 
d780: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
d790: 73 73 65 73 20 75 73 65 64 20 64 75 72 69 6e 67  sses used during
d7a0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e   code generation
d7b0: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
d7c0: 74 52 65 61 64 79 3b 20 20 20 20 20 20 20 20 20  tReady;         
d7d0: 20 2f 2a 20 43 75 72 73 6f 72 73 20 74 68 61 74   /* Cursors that
d7e0: 20 61 72 65 20 6e 6f 74 20 79 65 74 20 70 6f 73   are not yet pos
d7f0: 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20 57 68 65  itioned */.  Whe
d800: 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20  reTerm *pTerm;  
d810: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e          /* A sin
d820: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  gle term in the 
d830: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
d840: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61    ExprMaskSet ma
d850: 73 6b 53 65 74 3b 20 20 20 20 20 20 20 2f 2a 20  skSet;       /* 
d860: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6d  The expression m
d870: 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20 57 68 65  ask set */.  Whe
d880: 72 65 43 6c 61 75 73 65 20 77 63 3b 20 20 20 20  reClause wc;    
d890: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
d8a0: 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 64  HERE clause is d
d8b0: 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68 65 73  ivided into thes
d8c0: 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72  e terms */.  str
d8d0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
d8e0: 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20   *pTabItem;  /* 
d8f0: 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79 20 66  A single entry f
d900: 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a  rom pTabList */.
d910: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
d920: 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  evel;           
d930: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65    /* A single le
d940: 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49 6e 66  vel in the pWInf
d950: 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  o list */.  int 
d960: 69 46 72 6f 6d 3b 20 20 20 20 20 20 20 20 20 20  iFrom;          
d970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
d980: 69 72 73 74 20 75 6e 75 73 65 64 20 46 52 4f 4d  irst unused FROM
d990: 20 63 6c 61 75 73 65 20 65 6c 65 6d 65 6e 74 20   clause element 
d9a0: 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46 6c 61 67  */.  int andFlag
d9b0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
d9c0: 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d 62 69 6e  /* AND-ed combin
d9d0: 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 77 63 2e  ation of all wc.
d9e0: 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a 0a 20 20  a[].flags */..  
d9f0: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
da00: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
da10: 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69  ROM clause is li
da20: 6d 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  mited by the num
da30: 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73  ber of.  ** bits
da40: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20   in a Bitmask . 
da50: 20 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69   */.  if( pTabLi
da60: 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20 29 7b 0a  st->nSrc>BMS ){.
da70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
da80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 61 74 20  Msg(pParse, "at 
da90: 6d 6f 73 74 20 25 64 20 74 61 62 6c 65 73 20 69  most %d tables i
daa0: 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d 53 29 3b  n a join", BMS);
dab0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
dac0: 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20 74   }..  /* Split t
dad0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
dae0: 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73 75  into separate su
daf0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68 65  bexpressions whe
db00: 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75 62  re each.  ** sub
db10: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
db20: 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41 4e  parated by an AN
db30: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f  D operator..  */
db40: 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65 74 28 26  .  initMaskSet(&
db50: 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77 68 65 72  maskSet);.  wher
db60: 65 43 6c 61 75 73 65 49 6e 69 74 28 26 77 63 2c  eClauseInit(&wc,
db70: 20 70 50 61 72 73 65 29 3b 0a 20 20 77 68 65 72   pParse);.  wher
db80: 65 53 70 6c 69 74 28 26 77 63 2c 20 70 57 68 65  eSplit(&wc, pWhe
db90: 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a 20 20 20  re, TK_AND);.   
dba0: 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20   .  /* Allocate 
dbb0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
dbc0: 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
dbd0: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
dbe0: 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
dbf0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20   return value.. 
dc00: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
dc10: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
dc20: 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b  eof(WhereInfo) +
dc30: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a   pTabList->nSrc*
dc40: 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
dc50: 6c 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  l));.  if( sqlit
dc60: 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29  e3MallocFailed()
dc70: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68 65   ){.    goto whe
dc80: 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20  reBeginNoMem;.  
dc90: 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  }.  pWInfo->pPar
dca0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70  se = pParse;.  p
dcb0: 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 20  WInfo->pTabList 
dcc0: 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20 20 70 57  = pTabList;.  pW
dcd0: 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20 3d 20 73  Info->iBreak = s
dce0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
dcf0: 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a 20 53 70  bel(v);..  /* Sp
dd00: 65 63 69 61 6c 20 63 61 73 65 3a 20 61 20 57 48  ecial case: a WH
dd10: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
dd20: 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 45 76  is constant.  Ev
dd30: 61 6c 75 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  aluate the.  ** 
dd40: 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 65  expression and e
dd50: 69 74 68 65 72 20 6a 75 6d 70 20 6f 76 65 72 20  ither jump over 
dd60: 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f 64 65 20  all of the code 
dd70: 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e 0a 20 20  or fall thru..  
dd80: 2a 2f 0a 20 20 69 66 28 20 70 57 68 65 72 65 20  */.  if( pWhere 
dd90: 26 26 20 28 70 54 61 62 4c 69 73 74 2d 3e 6e 53  && (pTabList->nS
dda0: 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  rc==0 || sqlite3
ddb0: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
ddc0: 57 68 65 72 65 29 29 20 29 7b 0a 20 20 20 20 73  Where)) ){.    s
ddd0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
dde0: 65 28 70 50 61 72 73 65 2c 20 70 57 68 65 72 65  e(pParse, pWhere
ddf0: 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
de00: 2c 20 31 29 3b 0a 20 20 20 20 70 57 68 65 72 65  , 1);.    pWhere
de10: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
de20: 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f 66 20 74  Analyze all of t
de30: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
de40: 73 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 65 78  s.  Note that ex
de50: 70 72 41 6e 61 6c 79 7a 65 28 29 20 6d 69 67 68  prAnalyze() migh
de60: 74 0a 20 20 2a 2a 20 61 64 64 20 6e 65 77 20 76  t.  ** add new v
de70: 69 72 74 75 61 6c 20 74 65 72 6d 73 20 6f 6e 74  irtual terms ont
de80: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
de90: 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20   WHERE clause.  
dea0: 57 65 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20 77  We do not.  ** w
deb0: 61 6e 74 20 74 6f 20 61 6e 61 6c 79 7a 65 20 74  ant to analyze t
dec0: 68 65 73 65 20 76 69 72 74 75 61 6c 20 74 65 72  hese virtual ter
ded0: 6d 73 2c 20 73 6f 20 73 74 61 72 74 20 61 6e 61  ms, so start ana
dee0: 6c 79 7a 69 6e 67 20 61 74 20 74 68 65 20 65 6e  lyzing at the en
def0: 64 0a 20 20 2a 2a 20 61 6e 64 20 77 6f 72 6b 20  d.  ** and work 
df00: 66 6f 72 77 61 72 64 20 73 6f 20 74 68 61 74 20  forward so that 
df10: 74 68 65 20 61 64 64 65 64 20 76 69 72 74 75 61  the added virtua
df20: 6c 20 74 65 72 6d 73 20 61 72 65 20 6e 65 76 65  l terms are neve
df30: 72 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a  r processed..  *
df40: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
df50: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
df60: 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
df70: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
df80: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
df90: 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 65 78 70  rsor);.  }.  exp
dfa0: 72 41 6e 61 6c 79 7a 65 41 6c 6c 28 70 54 61 62  rAnalyzeAll(pTab
dfb0: 4c 69 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20  List, &maskSet, 
dfc0: 26 77 63 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  &wc);.  if( sqli
dfd0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
dfe0: 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 77 68  ) ){.    goto wh
dff0: 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b 0a 20  ereBeginNoMem;. 
e000: 20 7d 0a 0a 20 20 2f 2a 20 43 68 6f 73 65 20 74   }..  /* Chose t
e010: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 74 6f  he best index to
e020: 20 75 73 65 20 66 6f 72 20 65 61 63 68 20 74 61   use for each ta
e030: 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  ble in the FROM 
e040: 63 6c 61 75 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  clause..  **.  *
e050: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 66 69 6c 6c  * This loop fill
e060: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
e070: 6e 67 20 66 69 65 6c 64 73 3a 0a 20 20 2a 2a 0a  ng fields:.  **.
e080: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
e090: 5b 5d 2e 70 49 64 78 20 20 20 20 20 20 54 68 65  [].pIdx      The
e0a0: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f   index to use fo
e0b0: 72 20 74 68 69 73 20 6c 65 76 65 6c 20 6f 66 20  r this level of 
e0c0: 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 20  the loop..  **  
e0d0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 66 6c 61   pWInfo->a[].fla
e0e0: 67 73 20 20 20 20 20 57 48 45 52 45 5f 78 78 78  gs     WHERE_xxx
e0f0: 20 66 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   flags associate
e100: 64 20 77 69 74 68 20 70 49 64 78 0a 20 20 2a 2a  d with pIdx.  **
e110: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e     pWInfo->a[].n
e120: 45 71 20 20 20 20 20 20 20 54 68 65 20 6e 75 6d  Eq       The num
e130: 62 65 72 20 6f 66 20 3d 3d 20 61 6e 64 20 49 4e  ber of == and IN
e140: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a   constraints.  *
e150: 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e  *   pWInfo->a[].
e160: 69 46 72 6f 6d 20 20 20 20 20 57 68 65 6e 20 74  iFrom     When t
e170: 65 72 6d 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  erm of the FROM 
e180: 63 6c 61 75 73 65 20 69 73 20 62 65 69 6e 67 20  clause is being 
e190: 63 6f 64 65 64 0a 20 20 2a 2a 20 20 20 70 57 49  coded.  **   pWI
e1a0: 6e 66 6f 2d 3e 61 5b 5d 2e 69 54 61 62 43 75 72  nfo->a[].iTabCur
e1b0: 20 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73     The VDBE curs
e1c0: 6f 72 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  or for the datab
e1d0: 61 73 65 20 74 61 62 6c 65 0a 20 20 2a 2a 20 20  ase table.  **  
e1e0: 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 49 64   pWInfo->a[].iId
e1f0: 78 43 75 72 20 20 20 54 68 65 20 56 44 42 45 20  xCur   The VDBE 
e200: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69  cursor for the i
e210: 6e 64 65 78 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ndex.  **.  ** T
e220: 68 69 73 20 6c 6f 6f 70 20 61 6c 73 6f 20 66 69  his loop also fi
e230: 67 75 72 65 73 20 6f 75 74 20 74 68 65 20 6e 65  gures out the ne
e240: 73 74 69 6e 67 20 6f 72 64 65 72 20 6f 66 20 74  sting order of t
e250: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52 4f  ables in the FRO
e260: 4d 0a 20 20 2a 2a 20 63 6c 61 75 73 65 2e 0a 20  M.  ** clause.. 
e270: 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
e280: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
e290: 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62 4c  pTabItem = pTabL
e2a0: 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65 6c  ist->a;.  pLevel
e2b0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20   = pWInfo->a;.  
e2c0: 61 6e 64 46 6c 61 67 73 20 3d 20 7e 30 3b 0a 20  andFlags = ~0;. 
e2d0: 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74   TRACE(("*** Opt
e2e0: 69 6d 69 7a 65 72 20 53 74 61 72 74 20 2a 2a 2a  imizer Start ***
e2f0: 5c 6e 22 29 29 3b 0a 20 20 66 6f 72 28 69 3d 69  \n"));.  for(i=i
e300: 46 72 6f 6d 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  From=0, pLevel=p
e310: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
e320: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
e330: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
e340: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
e350: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
e360: 6e 64 65 78 20 66 6f 72 20 46 52 4f 4d 20 74 61  ndex for FROM ta
e370: 62 6c 65 20 61 74 20 70 54 61 62 49 74 65 6d 20  ble at pTabItem 
e380: 2a 2f 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  */.    int flags
e390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3a0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 73     /* Flags asss
e3b0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
e3c0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 71  x */.    int nEq
e3d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e3e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e3f0: 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74  f == or IN const
e400: 72 61 69 6e 74 73 20 2a 2f 0a 20 20 20 20 64 6f  raints */.    do
e410: 75 62 6c 65 20 63 6f 73 74 3b 20 20 20 20 20 20  uble cost;      
e420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e430: 20 63 6f 73 74 20 66 6f 72 20 70 49 64 78 20 2a   cost for pIdx *
e440: 2f 0a 20 20 20 20 69 6e 74 20 6a 3b 20 20 20 20  /.    int j;    
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e460: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
e470: 20 6f 76 65 72 20 46 52 4f 4d 20 74 61 62 6c 65   over FROM table
e480: 73 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  s */.    Index *
e490: 70 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  pBest = 0;      
e4a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 65 73 74       /* The best
e4b0: 20 69 6e 64 65 78 20 73 65 65 6e 20 73 6f 20 66   index seen so f
e4c0: 61 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  ar */.    int be
e4d0: 73 74 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  stFlags = 0;    
e4e0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 61        /* Flags a
e4f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
e500: 42 65 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  Best */.    int 
e510: 62 65 73 74 4e 45 71 20 3d 20 30 3b 20 20 20 20  bestNEq = 0;    
e520: 20 20 20 20 20 20 20 20 2f 2a 20 6e 45 71 20 61          /* nEq a
e530: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
e540: 42 65 73 74 20 2a 2f 0a 20 20 20 20 64 6f 75 62  Best */.    doub
e550: 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74 3b 20 20  le lowestCost;  
e560: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20          /* Cost 
e570: 6f 66 20 74 68 65 20 70 42 65 73 74 20 2a 2f 0a  of the pBest */.
e580: 20 20 20 20 69 6e 74 20 62 65 73 74 4a 20 3d 20      int bestJ = 
e590: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
e5a0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20  /* The value of 
e5b0: 6a 20 2a 2f 0a 20 20 20 20 42 69 74 6d 61 73 6b  j */.    Bitmask
e5c0: 20 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   m;             
e5d0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
e5e0: 76 61 6c 75 65 20 66 6f 72 20 6a 20 6f 72 20 62  value for j or b
e5f0: 65 73 74 4a 20 2a 2f 0a 20 20 20 20 69 6e 74 20  estJ */.    int 
e600: 6f 6e 63 65 20 3d 20 30 3b 20 20 20 20 20 20 20  once = 0;       
e610: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
e620: 77 68 65 6e 20 66 69 72 73 74 20 74 61 62 6c 65  when first table
e630: 20 69 73 20 73 65 65 6e 20 2a 2f 0a 0a 20 20 20   is seen */..   
e640: 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51   lowestCost = SQ
e650: 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20  LITE_BIG_DBL;.  
e660: 20 20 66 6f 72 28 6a 3d 69 46 72 6f 6d 2c 20 70    for(j=iFrom, p
e670: 54 61 62 49 74 65 6d 3d 26 70 54 61 62 4c 69 73  TabItem=&pTabLis
e680: 74 2d 3e 61 5b 6a 5d 3b 20 6a 3c 70 54 61 62 4c  t->a[j]; j<pTabL
e690: 69 73 74 2d 3e 6e 53 72 63 3b 20 6a 2b 2b 2c 20  ist->nSrc; j++, 
e6a0: 70 54 61 62 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  pTabItem++){.   
e6b0: 20 20 20 69 6e 74 20 64 6f 4e 6f 74 52 65 6f 72     int doNotReor
e6c0: 64 65 72 3b 20 20 2f 2a 20 54 72 75 65 20 69 66  der;  /* True if
e6d0: 20 74 68 69 73 20 74 61 62 6c 65 20 73 68 6f 75   this table shou
e6e0: 6c 64 20 6e 6f 74 20 62 65 20 72 65 6f 72 64 65  ld not be reorde
e6f0: 72 65 64 20 2a 2f 0a 0a 20 20 20 20 20 20 64 6f  red */..      do
e700: 4e 6f 74 52 65 6f 72 64 65 72 20 3d 20 20 28 70  NotReorder =  (p
e710: 54 61 62 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  TabItem->jointyp
e720: 65 20 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f  e & (JT_LEFT|JT_
e730: 43 52 4f 53 53 29 29 21 3d 30 0a 20 20 20 20 20  CROSS))!=0.     
e740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
e750: 20 28 6a 3e 30 20 26 26 20 28 70 54 61 62 49 74   (j>0 && (pTabIt
e760: 65 6d 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20  em[-1].jointype 
e770: 26 20 28 4a 54 5f 4c 45 46 54 7c 4a 54 5f 43 52  & (JT_LEFT|JT_CR
e780: 4f 53 53 29 29 21 3d 30 29 3b 0a 20 20 20 20 20  OSS))!=0);.     
e790: 20 69 66 28 20 6f 6e 63 65 20 26 26 20 64 6f 4e   if( once && doN
e7a0: 6f 74 52 65 6f 72 64 65 72 20 29 20 62 72 65 61  otReorder ) brea
e7b0: 6b 3b 0a 20 20 20 20 20 20 6d 20 3d 20 67 65 74  k;.      m = get
e7c0: 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70  Mask(&maskSet, p
e7d0: 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  TabItem->iCursor
e7e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 6d 20  );.      if( (m 
e7f0: 26 20 6e 6f 74 52 65 61 64 79 29 3d 3d 30 20 29  & notReady)==0 )
e800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d  {.        if( j=
e810: 3d 69 46 72 6f 6d 20 29 20 69 46 72 6f 6d 2b 2b  =iFrom ) iFrom++
e820: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
e830: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
e840: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 49 74    assert( pTabIt
e850: 65 6d 2d 3e 70 54 61 62 20 29 3b 0a 23 69 66 6e  em->pTab );.#ifn
e860: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e870: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
e880: 20 20 20 69 66 28 20 70 54 61 62 49 74 65 6d 2d     if( pTabItem-
e890: 3e 70 54 61 62 2d 3e 69 73 56 69 72 74 75 61 6c  >pTab->isVirtual
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74   ){.        cost
e8b0: 20 3d 20 62 65 73 74 56 69 72 74 75 61 6c 49 6e   = bestVirtualIn
e8c0: 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c  dex(pParse, &wc,
e8d0: 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65   pTabItem, notRe
e8e0: 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ady,.           
e8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e900: 20 20 20 20 20 70 70 4f 72 64 65 72 42 79 20 3f       ppOrderBy ?
e910: 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30 2c   *ppOrderBy : 0,
e920: 20 69 3d 3d 30 2c 0a 20 20 20 20 20 20 20 20 20   i==0,.         
e930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e940: 20 20 20 20 20 20 20 26 70 4c 65 76 65 6c 2d 3e         &pLevel->
e950: 70 49 64 78 49 6e 66 6f 29 3b 0a 20 20 20 20 20  pIdxInfo);.     
e960: 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45     flags = WHERE
e970: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20  _VIRTUALTABLE;. 
e980: 20 20 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b         pIdx = 0;
e990: 0a 20 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30  .        nEq = 0
e9a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23  ;.      }else .#
e9b0: 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
e9c0: 20 20 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73        cost = bes
e9d0: 74 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26  tIndex(pParse, &
e9e0: 77 63 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f  wc, pTabItem, no
e9f0: 74 52 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20  tReady,.        
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea10: 20 28 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65   (i==0 && ppOrde
ea20: 72 42 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42  rBy) ? *ppOrderB
ea30: 79 20 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20  y : 0,.         
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 26 70 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26  &pIdx, &flags, &
ea60: 6e 45 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nEq);.      }.  
ea70: 20 20 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77      if( cost<low
ea80: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  estCost ){.     
ea90: 20 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20     once = 1;.   
eaa0: 20 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20       lowestCost 
eab0: 3d 20 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20  = cost;.        
eac0: 70 42 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20  pBest = pIdx;.  
ead0: 20 20 20 20 20 20 62 65 73 74 46 6c 61 67 73 20        bestFlags 
eae0: 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20  = flags;.       
eaf0: 20 62 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a   bestNEq = nEq;.
eb00: 20 20 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20          bestJ = 
eb10: 6a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  j;.      }.     
eb20: 20 69 66 28 20 64 6f 4e 6f 74 52 65 6f 72 64 65   if( doNotReorde
eb30: 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
eb40: 0a 20 20 20 20 54 52 41 43 45 28 28 22 2a 2a 2a  .    TRACE(("***
eb50: 20 4f 70 74 69 6d 69 7a 65 72 20 63 68 6f 6f 73   Optimizer choos
eb60: 65 20 74 61 62 6c 65 20 25 64 20 66 6f 72 20 6c  e table %d for l
eb70: 6f 6f 70 20 25 64 5c 6e 22 2c 20 62 65 73 74 4a  oop %d\n", bestJ
eb80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 4c 65  ,.           pLe
eb90: 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e 61 29 29 3b  vel-pWInfo->a));
eba0: 0a 20 20 20 20 69 66 28 20 28 62 65 73 74 46 6c  .    if( (bestFl
ebb0: 61 67 73 20 26 20 57 48 45 52 45 5f 4f 52 44 45  ags & WHERE_ORDE
ebc0: 52 42 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  RBY)!=0 ){.     
ebd0: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
ebe0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 6e 64 46 6c  .    }.    andFl
ebf0: 61 67 73 20 26 3d 20 62 65 73 74 46 6c 61 67 73  ags &= bestFlags
ec00: 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 66 6c  ;.    pLevel->fl
ec10: 61 67 73 20 3d 20 62 65 73 74 46 6c 61 67 73 3b  ags = bestFlags;
ec20: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49 64  .    pLevel->pId
ec30: 78 20 3d 20 70 42 65 73 74 3b 0a 20 20 20 20 70  x = pBest;.    p
ec40: 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d 20 62 65 73  Level->nEq = bes
ec50: 74 4e 45 71 3b 0a 20 20 20 20 70 4c 65 76 65 6c  tNEq;.    pLevel
ec60: 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20 30 3b 0a 20  ->aInLoop = 0;. 
ec70: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d     pLevel->nIn =
ec80: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 65 73   0;.    if( pBes
ec90: 74 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65  t ){.      pLeve
eca0: 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61  l->iIdxCur = pPa
ecb0: 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20  rse->nTab++;.   
ecc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c   }else{.      pL
ecd0: 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20  evel->iIdxCur = 
ece0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 6f  -1;.    }.    no
ecf0: 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d 61  tReady &= ~getMa
ed00: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
ed10: 62 4c 69 73 74 2d 3e 61 5b 62 65 73 74 4a 5d 2e  bList->a[bestJ].
ed20: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 4c  iCursor);.    pL
ed30: 65 76 65 6c 2d 3e 69 46 72 6f 6d 20 3d 20 62 65  evel->iFrom = be
ed40: 73 74 4a 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  stJ;.  }.  TRACE
ed50: 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72  (("*** Optimizer
ed60: 20 46 69 6e 69 73 68 65 64 20 2a 2a 2a 5c 6e 22   Finished ***\n"
ed70: 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
ed80: 20 74 6f 74 61 6c 20 71 75 65 72 79 20 6f 6e 6c   total query onl
ed90: 79 20 73 65 6c 65 63 74 73 20 61 20 73 69 6e 67  y selects a sing
eda0: 6c 65 20 72 6f 77 2c 20 74 68 65 6e 20 74 68 65  le row, then the
edb0: 20 4f 52 44 45 52 20 42 59 0a 20 20 2a 2a 20 63   ORDER BY.  ** c
edc0: 6c 61 75 73 65 20 69 73 20 69 72 72 65 6c 65 76  lause is irrelev
edd0: 61 6e 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ant..  */.  if( 
ede0: 28 61 6e 64 46 6c 61 67 73 20 26 20 57 48 45 52  (andFlags & WHER
edf0: 45 5f 55 4e 49 51 55 45 29 21 3d 30 20 26 26 20  E_UNIQUE)!=0 && 
ee00: 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
ee10: 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b   *ppOrderBy = 0;
ee20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
ee30: 61 6c 6c 20 74 61 62 6c 65 73 20 69 6e 20 74 68  all tables in th
ee40: 65 20 70 54 61 62 4c 69 73 74 20 61 6e 64 20 61  e pTabList and a
ee50: 6e 79 20 69 6e 64 69 63 65 73 20 73 65 6c 65 63  ny indices selec
ee60: 74 65 64 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61  ted for.  ** sea
ee70: 72 63 68 69 6e 67 20 74 68 6f 73 65 20 74 61 62  rching those tab
ee80: 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  les..  */.  sqli
ee90: 74 65 33 43 6f 64 65 56 65 72 69 66 79 53 63 68  te3CodeVerifySch
eea0: 65 6d 61 28 70 50 61 72 73 65 2c 20 2d 31 29 3b  ema(pParse, -1);
eeb0: 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 63   /* Insert the c
eec0: 6f 6f 6b 69 65 20 76 65 72 69 66 69 65 72 20 47  ookie verifier G
eed0: 6f 74 6f 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20  oto */.  pLevel 
eee0: 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66  = pWInfo->a;.  f
eef0: 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70  or(i=0, pLevel=p
ef00: 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62  WInfo->a; i<pTab
ef10: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
ef20: 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20   pLevel++){.    
ef30: 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20  Table *pTab;    
ef40: 20 2f 2a 20 54 61 62 6c 65 20 74 6f 20 6f 70 65   /* Table to ope
ef50: 6e 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a  n */.    Index *
ef60: 70 49 78 3b 20 20 20 20 20 20 2f 2a 20 49 6e 64  pIx;      /* Ind
ef70: 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
ef80: 73 20 70 54 61 62 20 28 69 66 20 61 6e 79 29 20  s pTab (if any) 
ef90: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 44 62 3b 20  */.    int iDb; 
efa0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
efb0: 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e   of database con
efc0: 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2f 69 6e  taining table/in
efd0: 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
efe0: 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d  IdxCur = pLevel-
eff0: 3e 69 49 64 78 43 75 72 3b 0a 0a 23 69 66 6e 64  >iIdxCur;..#ifnd
f000: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
f010: 58 50 4c 41 49 4e 0a 20 20 20 20 69 66 28 20 70  XPLAIN.    if( p
f020: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
f030: 32 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  2 ){.      char 
f040: 2a 7a 4d 73 67 3b 0a 20 20 20 20 20 20 73 74 72  *zMsg;.      str
f050: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
f060: 20 2a 70 49 74 65 6d 20 3d 20 26 70 54 61 62 4c   *pItem = &pTabL
f070: 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
f080: 46 72 6f 6d 5d 3b 0a 20 20 20 20 20 20 7a 4d 73  From];.      zMs
f090: 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e  g = sqlite3MPrin
f0a0: 74 66 28 22 54 41 42 4c 45 20 25 73 22 2c 20 70  tf("TABLE %s", p
f0b0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
f0c0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
f0d0: 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20  Alias ){.       
f0e0: 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d   zMsg = sqlite3M
f0f0: 50 72 69 6e 74 66 28 22 25 7a 20 41 53 20 25 73  Printf("%z AS %s
f100: 22 2c 20 7a 4d 73 67 2c 20 70 49 74 65 6d 2d 3e  ", zMsg, pItem->
f110: 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 7d  zAlias);.      }
f120: 0a 20 20 20 20 20 20 69 66 28 20 28 70 49 78 20  .      if( (pIx 
f130: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21  = pLevel->pIdx)!
f140: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d  =0 ){.        zM
f150: 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69  sg = sqlite3MPri
f160: 6e 74 66 28 22 25 7a 20 57 49 54 48 20 49 4e 44  ntf("%z WITH IND
f170: 45 58 20 25 73 22 2c 20 7a 4d 73 67 2c 20 70 49  EX %s", zMsg, pI
f180: 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  x->zName);.     
f190: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
f1a0: 6c 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52  l->flags & (WHER
f1b0: 45 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45  E_ROWID_EQ|WHERE
f1c0: 5f 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b  _ROWID_RANGE) ){
f1d0: 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
f1e0: 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
f1f0: 25 7a 20 55 53 49 4e 47 20 50 52 49 4d 41 52 59  %z USING PRIMARY
f200: 20 4b 45 59 22 2c 20 7a 4d 73 67 29 3b 0a 20 20   KEY", zMsg);.  
f210: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
f220: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
f230: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 65 6c 73  LTABLE.      els
f240: 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49  e if( pLevel->pI
f250: 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  dxInfo ){.      
f260: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
f270: 4d 50 72 69 6e 74 66 28 22 25 7a 20 56 49 52 54  MPrintf("%z VIRT
f280: 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
f290: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
f2a0: 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d           pLevel-
f2b0: 3e 70 49 64 78 49 6e 66 6f 2d 3e 7a 50 6c 61 6e  >pIdxInfo->zPlan
f2c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
f2d0: 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76  f.      if( pLev
f2e0: 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
f2f0: 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20  E_ORDERBY ){.   
f300: 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
f310: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 4f  te3MPrintf("%z O
f320: 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b  RDER BY", zMsg);
f330: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
f340: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
f350: 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20   OP_Explain, i, 
f360: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 7a  pLevel->iFrom, z
f370: 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29  Msg, P3_DYNAMIC)
f380: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
f390: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
f3a0: 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61  PLAIN */.    pTa
f3b0: 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
f3c0: 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
f3d0: 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20  om];.    pTab = 
f3e0: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pTabItem->pTab;.
f3f0: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
f400: 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70  3SchemaToIndex(p
f410: 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d  Parse->db, pTab-
f420: 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69  >pSchema);.    i
f430: 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d  f( pTab->isEphem
f440: 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
f450: 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  t ) continue;.#i
f460: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f470: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
f480: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70     if( pLevel->p
f490: 49 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20  IdxInfo ){.     
f4a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
f4b0: 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 30 2c 20  v, OP_VOpen, 0, 
f4c0: 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  0, (const char*)
f4d0: 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50 33 5f  pTab->pVtab, P3_
f4e0: 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c 73 65  VTAB);.    }else
f4f0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
f500: 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
f510: 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
f520: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
f530: 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28 70 50  ite3OpenTable(pP
f540: 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e  arse, pTabItem->
f550: 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20 70 54  iCursor, iDb, pT
f560: 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61 64 29  ab, OP_OpenRead)
f570: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62  ;.      if( pTab
f580: 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66 28 42  ->nCol<(sizeof(B
f590: 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a 20 20  itmask)*8) ){.  
f5a0: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 62 20        Bitmask b 
f5b0: 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55  = pTabItem->colU
f5c0: 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  sed;.        int
f5d0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   n = 0;.        
f5e0: 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e 31 2c  for(; b; b=b>>1,
f5f0: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
f600: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
f610: 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33 56 64  eP2(v, sqlite3Vd
f620: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
f630: 2d 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20  -1, n);.        
f640: 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61 62 2d  assert( n<=pTab-
f650: 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20 20 7d  >nCol );.      }
f660: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f670: 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65 4c 6f    sqlite3TableLo
f680: 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62 2c 20  ck(pParse, iDb, 
f690: 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c 20 70  pTab->tnum, 0, p
f6a0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
f6b0: 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69   }.    pLevel->i
f6c0: 54 61 62 43 75 72 20 3d 20 70 54 61 62 49 74 65  TabCur = pTabIte
f6d0: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
f6e0: 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65  if( (pIx = pLeve
f6f0: 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20  l->pIdx)!=0 ){. 
f700: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b       KeyInfo *pK
f710: 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e 64 65  ey = sqlite3Inde
f720: 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73 65 2c  xKeyinfo(pParse,
f730: 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61 73 73   pIx);.      ass
f740: 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68 65 6d  ert( pIx->pSchem
f750: 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  a==pTab->pSchema
f760: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
f770: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f780: 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c 20 30  _Integer, iDb, 0
f790: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
f7a0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73 22 2c  ment((v, "# %s",
f7b0: 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b 0a 20   pIx->zName));. 
f7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f7d0: 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65  Op3(v, OP_OpenRe
f7e0: 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78  ad, iIdxCur, pIx
f7f0: 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20  ->tnum,.        
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
f810: 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b 45 59  ar*)pKey, P3_KEY
f820: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b 0a 20  INFO_HANDOFF);. 
f830: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c     }.    if( (pL
f840: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
f850: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30  ERE_IDX_ONLY)!=0
f860: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
f870: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
f880: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
f890: 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43  iIdxCur, pIx->nC
f8a0: 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a  olumn+1);.    }.
f8b0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
f8c0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
f8d0: 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a 20 20  se, iDb);.  }.  
f8e0: 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73  pWInfo->iTop = s
f8f0: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
f900: 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f 2a 20  tAddr(v);..  /* 
f910: 47 65 6e 65 72 61 74 65 20 74 68 65 20 63 6f 64  Generate the cod
f920: 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65 61 72  e to do the sear
f930: 63 68 2e 20 20 45 61 63 68 20 69 74 65 72 61 74  ch.  Each iterat
f940: 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72 0a 20  ion of the for. 
f950: 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77 20 67   ** loop below g
f960: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 66 6f  enerates code fo
f970: 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73 74 65  r a single neste
f980: 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20 56 4d  d loop of the VM
f990: 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e 0a 20  .  ** program.. 
f9a0: 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79 20 3d   */.  notReady =
f9b0: 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a 20 20   ~(Bitmask)0;.  
f9c0: 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d  for(i=0, pLevel=
f9d0: 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61  pWInfo->a; i<pTa
f9e0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
f9f0: 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
fa00: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e 74 20   int j;.    int 
fa10: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
fa20: 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68  >iCursor;  /* Th
fa30: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
fa40: 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
fa50: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
fa60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
fa70: 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
fa80: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
fa90: 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a  IdxCur;       /*
faa0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
fab0: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
fac0: 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61  /.    int omitTa
fad0: 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  ble;     /* True
fae0: 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
faf0: 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20 20 20  ndex only */.   
fb00: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
fb10: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
fb20: 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e 20 69  e need to scan i
fb30: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
fb40: 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74 65 6d  */..    pTabItem
fb50: 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b   = &pTabList->a[
fb60: 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a  pLevel->iFrom];.
fb70: 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 49      iCur = pTabI
fb80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
fb90: 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
fba0: 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  >pIdx;.    iIdxC
fbb0: 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
fbc0: 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76 20 3d  xCur;.    bRev =
fbd0: 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
fbe0: 26 20 57 48 45 52 45 5f 52 45 56 45 52 53 45 29  & WHERE_REVERSE)
fbf0: 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54 61 62  !=0;.    omitTab
fc00: 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c  le = (pLevel->fl
fc10: 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
fc20: 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  ONLY)!=0;..    /
fc30: 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c 73 20  * Create labels 
fc40: 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b 22 20  for the "break" 
fc50: 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22 20 69  and "continue" i
fc60: 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20 20 20  nstructions.    
fc70: 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ** for the curre
fc80: 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70 20 74  nt loop.  Jump t
fc90: 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b 20 6f  o brk to break o
fca0: 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a 20 20  ut of a loop..  
fcb0: 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63 6f 6e    ** Jump to con
fcc0: 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69 61 74  t to go immediat
fcd0: 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ely to the next 
fce0: 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
fcf0: 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20  .    ** loop..  
fd00: 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d 20 70    */.    brk = p
fd10: 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c  Level->brk = sql
fd20: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
fd30: 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74 20 3d  l(v);.    cont =
fd40: 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20   pLevel->cont = 
fd50: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
fd60: 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20 2f 2a  abel(v);..    /*
fd70: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
fd80: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 61  right table of a
fd90: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
fda0: 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a 20  , allocate and. 
fdb0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
fdc0: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 74   a memory cell t
fdd0: 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20 74  hat records if t
fde0: 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68 65  his table matche
fdf0: 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f 77  s any.    ** row
fe00: 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61 62   of the left tab
fe10: 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 0a  le of the join..
fe20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
fe30: 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30 20 26  Level->iFrom>0 &
fe40: 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e  & (pTabItem[-1].
fe50: 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45  jointype & JT_LE
fe60: 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  FT)!=0 ){.      
fe70: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65  if( !pParse->nMe
fe80: 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m ) pParse->nMem
fe90: 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ++;.      pLevel
fea0: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50  ->iLeftJoin = pP
feb0: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
fec0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fed0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e  ddOp(v, OP_MemIn
fee0: 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c  t, 0, pLevel->iL
fef0: 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20  eftJoin);.      
ff00: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
ff10: 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a 4f 49  "# init LEFT JOI
ff20: 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61 67 22  N no-match flag"
ff30: 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  ));.    }..#ifnd
ff40: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
ff50: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
ff60: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  if( pLevel->pIdx
ff70: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 63 68  Info ){.      ch
ff80: 61 72 20 2a 7a 53 70 61 63 65 3b 20 20 20 20 20  ar *zSpace;     
ff90: 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 4f 50 5f  /* Space for OP_
ffa0: 56 46 69 6c 74 65 72 20 74 6f 20 6d 61 72 73 68  VFilter to marsh
ffb0: 61 6c 6c 20 69 74 27 73 20 61 72 67 75 6d 65 6e  all it's argumen
ffc0: 74 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  ts */..      /* 
ffd0: 43 61 73 65 20 30 3a 20 20 54 68 61 74 20 74 61  Case 0:  That ta
ffe0: 62 6c 65 20 69 73 20 61 20 76 69 72 74 75 61 6c  ble is a virtual
fff0: 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74 68 65  -table.  Use the
10000 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56 4e 65   VFilter and VNe
10010 78 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  xt..      */.   
10020 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
10030 5f 69 6e 66 6f 20 2a 70 49 64 78 49 6e 66 6f 20  _info *pIdxInfo 
10040 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 49 6e  = pLevel->pIdxIn
10050 66 6f 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  fo;.      for(i=
10060 31 3b 20 69 3c 3d 70 49 64 78 49 6e 66 6f 2d 3e  1; i<=pIdxInfo->
10070 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10080 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
10090 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
100a0 30 3b 20 6a 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; j<pIdxInfo->n
100b0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29  Constraint; j++)
100c0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
100d0 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74  pIdxInfo->aConst
100e0 72 61 69 6e 74 55 73 61 67 65 5b 6a 5d 2e 61 72  raintUsage[j].ar
100f0 67 76 49 6e 64 65 78 3d 3d 69 20 29 7b 0a 20 20  gvIndex==i ){.  
10100 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
10110 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10120 2c 20 77 63 2e 61 5b 6a 5d 2e 70 45 78 70 72 2d  , wc.a[j].pExpr-
10130 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
10140 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10150 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10160 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
10170 3d 3d 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  ==pIdxInfo->nCon
10180 73 74 72 61 69 6e 74 20 29 20 62 72 65 61 6b 3b  straint ) break;
10190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
101a0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
101b0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
101c0 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  -1, 0);.      sq
101d0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
101e0 2c 20 4f 50 5f 42 6c 6f 62 2c 20 70 49 64 78 49  , OP_Blob, pIdxI
101f0 6e 66 6f 2d 3e 6e 50 6c 61 6e 2c 20 30 29 3b 0a  nfo->nPlan, 0);.
10200 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10210 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
10220 20 70 49 64 78 49 6e 66 6f 2d 3e 7a 50 6c 61 6e   pIdxInfo->zPlan
10230 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  , P3_DYNAMIC);. 
10240 20 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 7a       pIdxInfo->z
10250 50 6c 61 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  Plan = 0;.      
10260 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
10270 28 76 2c 20 4f 50 5f 56 46 69 6c 74 65 72 2c 20  (v, OP_VFilter, 
10280 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
10290 20 20 7a 53 70 61 63 65 20 3d 20 28 63 68 61 72    zSpace = (char
102a0 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
102b0 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 76  sizeof(sqlite3_v
102c0 61 6c 75 65 2a 29 2a 28 69 2d 31 29 29 3b 0a 20  alue*)*(i-1));. 
102d0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
102e0 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
102f0 7a 53 70 61 63 65 2c 20 50 33 5f 44 59 4e 41 4d  zSpace, P3_DYNAM
10300 49 43 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  IC);.      for(i
10310 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e  =0; i<pIdxInfo->
10320 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b  nConstraint; i++
10330 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10340 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
10350 61 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69  aintUsage[i].omi
10360 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64  t ){.          d
10370 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
10380 6c 2c 20 26 77 63 2e 61 5b 69 5d 29 3b 0a 20 20  l, &wc.a[i]);.  
10390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
103a0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
103b0 20 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20   = OP_VNext;.   
103c0 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
103d0 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
103e0 65 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33  el->p2 = sqlite3
103f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10400 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  v);.    }else.#e
10410 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
10420 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10430 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4c 65   */..    if( pLe
10440 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
10450 52 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20  RE_ROWID_EQ ){. 
10460 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
10470 20 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79   We can directly
10480 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e   reference a sin
10490 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e  gle row using an
104a0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
104b0 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70     equality comp
104c0 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74  arison against t
104d0 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20  he ROWID field. 
104e0 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20   Or.      **    
104f0 20 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e        we referen
10500 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73  ce multiple rows
10510 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20   using a "rowid 
10520 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20  IN (...)".      
10530 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  **          cons
10540 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  truct..      */.
10550 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69        pTerm = fi
10560 6e 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72  ndTerm(&wc, iCur
10570 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20  , -1, notReady, 
10580 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b  WO_EQ|WO_IN, 0);
10590 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
105a0 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20  Term!=0 );.     
105b0 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
105c0 70 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20  pExpr!=0 );.    
105d0 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
105e0 3e 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75  >leftCursor==iCu
105f0 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
10600 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20  t( omitTable==0 
10610 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75  );.      codeEqu
10620 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65  alityTerm(pParse
10630 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c  , pTerm, brk, pL
10640 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  evel);.      sql
10650 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
10660 20 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31   OP_MustBeInt, 1
10670 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71  , brk);.      sq
10680 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10690 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20  , OP_NotExists, 
106a0 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20  iCur, brk);.    
106b0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
106c0 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20  , "pk"));.      
106d0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
106e0 4e 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Noop;.    }else 
106f0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
10700 73 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f  s & WHERE_ROWID_
10710 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f  RANGE ){.      /
10720 2a 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61  * Case 2:  We ha
10730 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  ve an inequality
10740 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69   comparison agai
10750 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69  nst the ROWID fi
10760 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  eld..      */.  
10770 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d      int testOp =
10780 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20   OP_Noop;.      
10790 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20  int start;.     
107a0 20 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61   WhereTerm *pSta
107b0 72 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20  rt, *pEnd;..    
107c0 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61    assert( omitTa
107d0 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ble==0 );.      
107e0 70 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72  pStart = findTer
107f0 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
10800 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54   notReady, WO_GT
10810 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_GE, 0);.    
10820 20 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72    pEnd = findTer
10830 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c  m(&wc, iCur, -1,
10840 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54   notReady, WO_LT
10850 7c 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20  |WO_LE, 0);.    
10860 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20    if( bRev ){.  
10870 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53        pTerm = pS
10880 74 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53  tart;.        pS
10890 74 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20  tart = pEnd;.   
108a0 20 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72       pEnd = pTer
108b0 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  m;.      }.     
108c0 20 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20   if( pStart ){. 
108d0 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b         Expr *pX;
108e0 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53  .        pX = pS
108f0 74 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20  tart->pExpr;.   
10900 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21       assert( pX!
10910 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  =0 );.        as
10920 73 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65  sert( pStart->le
10930 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
10940 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
10950 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
10960 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
10970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
10980 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
10990 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d  rceInt, pX->op==
109a0 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LE || pX->op=
109b0 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20  =TK_GT, brk);.  
109c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
109d0 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f  eAddOp(v, bRev ?
109e0 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f   OP_MoveLt : OP_
109f0 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72  MoveGe, iCur, br
10a00 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  k);.        Vdbe
10a10 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
10a20 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61  ));.        disa
10a30 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20  bleTerm(pLevel, 
10a40 70 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d  pStart);.      }
10a50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
10a60 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10a70 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74  , bRev ? OP_Last
10a80 20 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43   : OP_Rewind, iC
10a90 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
10aa0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64  }.      if( pEnd
10ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
10ac0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58   *pX;.        pX
10ad0 20 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a   = pEnd->pExpr;.
10ae0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10af0 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  pX!=0 );.       
10b00 20 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c   assert( pEnd->l
10b10 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20  eftCursor==iCur 
10b20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10b30 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
10b40 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
10b50 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
10b60 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e  iMem = pParse->n
10b70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73  Mem++;.        s
10b80 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10b90 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
10ba0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29  pLevel->iMem, 1)
10bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58  ;.        if( pX
10bc0 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
10bd0 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a  X->op==TK_GT ){.
10be0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70            testOp
10bf0 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20   = bRev ? OP_Le 
10c00 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20  : OP_Ge;.       
10c10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10c20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20    testOp = bRev 
10c30 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b  ? OP_Lt : OP_Gt;
10c40 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10c50 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
10c60 4c 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20  Level, pEnd);.  
10c70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72      }.      star
10c80 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
10c90 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
10ca0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
10cb0 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76  = bRev ? OP_Prev
10cc0 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   : OP_Next;.    
10cd0 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
10ce0 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
10cf0 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
10d00 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21       if( testOp!
10d10 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
10d20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10d30 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64  ddOp(v, OP_Rowid
10d40 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  , iCur, 0);.    
10d50 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
10d60 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
10d70 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  ad, pLevel->iMem
10d80 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
10d90 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
10da0 2c 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45  , testOp, SQLITE
10db0 5f 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72  _AFF_NUMERIC, br
10dc0 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
10dd0 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
10de0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
10df0 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a  COLUMN_RANGE ){.
10e00 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a        /* Case 3:
10e10 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
10e20 65 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65  e term that refe
10e30 72 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  rs to the right-
10e40 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  most.      **   
10e50 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20        column of 
10e60 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20  the index is an 
10e70 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72  inequality.  For
10e80 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20   example, if.   
10e90 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
10ea0 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78  e index is on (x
10eb0 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48  ,y,z) and the WH
10ec0 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66  ERE clause is of
10ed0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20   the.      **   
10ee0 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20        form "x=5 
10ef0 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74  AND y<10" then t
10f00 68 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64  his case is used
10f10 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20  .  Only the.    
10f20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67    **         rig
10f30 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
10f40 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
10f50 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
10f60 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ust.      **    
10f70 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
10f80 22 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61  " and "IN" opera
10f90 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tors..      **. 
10fa0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
10fb0 54 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73  This case is als
10fc0 6f 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72  o used when ther
10fd0 65 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63  e are no WHERE c
10fe0 6c 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20  lause.      **  
10ff0 20 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e         constrain
11000 74 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20  ts but an index 
11010 69 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77  is selected anyw
11020 61 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20  ay, in order.   
11030 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f     **         to
11040 20 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75   force the outpu
11050 74 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f  t order to confo
11060 72 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42  rm to an ORDER B
11070 59 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  Y..      */.    
11080 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
11090 20 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65     int nEq = pLe
110a0 76 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20  vel->nEq;.      
110b0 69 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20  int topEq=0;    
110c0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
110d0 6f 70 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d  op limit uses ==
110e0 2e 20 46 61 6c 73 65 20 69 73 20 73 74 72 69 63  . False is stric
110f0 74 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69  tly < */.      i
11100 6e 74 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20  nt btmEq=0;     
11110 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74     /* True if bt
11120 6d 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e  m limit uses ==.
11130 20 46 61 6c 73 65 20 69 66 20 73 74 72 69 63 74   False if strict
11140 6c 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ly > */.      in
11150 74 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20  t topOp, btmOp; 
11160 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66    /* Operators f
11170 6f 72 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62  or the top and b
11180 6f 74 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75  ottom search bou
11190 6e 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nds */.      int
111a0 20 74 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69   testOp;.      i
111b0 6e 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20  nt nNotNull;    
111c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
111d0 72 6f 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68  rows of index th
111e0 61 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e  at must be non-N
111f0 55 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ULL */.      int
11200 20 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65   topLimit = (pLe
11210 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45  vel->flags & WHE
11220 52 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30  RE_TOP_LIMIT)!=0
11230 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c  ;.      int btmL
11240 69 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  imit = (pLevel->
11250 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54  flags & WHERE_BT
11260 4d 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20  M_LIMIT)!=0;..  
11270 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
11280 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
11290 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20   all constraint 
112a0 74 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f  terms using == o
112b0 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e  r IN.      ** an
112c0 64 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75  d level the valu
112d0 65 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d  es of those term
112e0 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  s on the stack..
112f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
11300 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65  odeAllEqualityTe
11310 72 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76  rms(pParse, pLev
11320 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64  el, &wc, notRead
11330 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20  y, brk);..      
11340 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65  /* Duplicate the
11350 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76   equality term v
11360 61 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68  alues because th
11370 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20  ey will all be. 
11380 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69       ** used twi
11390 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65  ce: once to make
113a0 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e   the termination
113b0 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f   key and once to
113c0 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20   make the.      
113d0 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20  ** start key..  
113e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72      */.      for
113f0 28 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b  (j=0; j<nEq; j++
11400 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11410 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
11420 50 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29  P_Dup, nEq-1, 0)
11430 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
11440 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
11450 68 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  hat comparison o
11460 70 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20  perators to use 
11470 66 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74  for top and bott
11480 6f 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61  om .      ** sea
11490 72 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20  rch bounds. For 
114a0 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64  an ascending ind
114b0 65 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62  ex, the bottom b
114c0 6f 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e  ound is a > or >
114d0 3d 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61  =.      ** opera
114e0 74 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20  tor and the top 
114f0 62 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20  bound is a < or 
11500 3c 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f  <= operator.  Fo
11510 72 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20  r a descending. 
11520 20 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68       ** index th
11530 65 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20  e operators are 
11540 72 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20  reversed..      
11550 2a 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c  */.      nNotNul
11560 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
11570 69 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  it;.      if( pI
11580 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e  dx->aSortOrder[n
11590 45 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41  Eq]==SQLITE_SO_A
115a0 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f  SC ){.        to
115b0 70 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c  pOp = WO_LT|WO_L
115c0 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70  E;.        btmOp
115d0 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a   = WO_GT|WO_GE;.
115e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
115f0 20 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f       topOp = WO_
11600 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
11610 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c    btmOp = WO_LT|
11620 57 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53  WO_LE;.        S
11630 57 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69  WAP(int, topLimi
11640 74 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20  t, btmLimit);.  
11650 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11660 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72  Generate the ter
11670 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54  mination key.  T
11680 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76  his is the key v
11690 61 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20  alue that.      
116a0 2a 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20  ** will end the 
116b0 73 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69  search.  There i
116c0 73 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e  s no termination
116d0 20 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20   key if there.  
116e0 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71      ** are no eq
116f0 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64  uality terms and
11700 20 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d   no "X<..." term
11710 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
11720 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a   ** 2002-Dec-04:
11730 20 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72   On a reverse-or
11740 64 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f  der scan, the so
11750 2d 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61  -called "termina
11760 74 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b  tion".      ** k
11770 65 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65  ey computed here
11780 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
11790 62 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20  being the start 
117a0 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  key..      */.  
117b0 20 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74      if( topLimit
117c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72   ){.        Expr
117d0 20 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e   *pX;.        in
117e0 74 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f  t k = pIdx->aiCo
117f0 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  lumn[j];.       
11800 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
11810 6d 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20  m(&wc, iCur, k, 
11820 6e 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c  notReady, topOp,
11830 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   pIdx);.        
11840 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30  assert( pTerm!=0
11850 20 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d   );.        pX =
11860 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
11870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
11880 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
11890 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
118a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
118b0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
118c0 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
118d0 20 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54        topEq = pT
118e0 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26  erm->eOperator &
118f0 20 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a   (WO_LE|WO_GE);.
11900 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
11910 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72  erm(pLevel, pTer
11920 6d 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74  m);.        test
11930 4f 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20  Op = OP_IdxGE;. 
11940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11950 20 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71      testOp = nEq
11960 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20  >0 ? OP_IdxGE : 
11970 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
11980 20 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20   topEq = 1;.    
11990 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65    }.      if( te
119a0 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b  stOp!=OP_Noop ){
119b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
119c0 6c 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d  l = nEq + topLim
119d0 69 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76  it;.        pLev
119e0 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
119f0 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
11a00 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
11a10 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c  be(v, nCol, nEq,
11a20 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
11a30 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
11a40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
11a50 70 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d  p = topEq ? OP_M
11a60 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c  oveLe : OP_MoveL
11a70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
11a80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11a90 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72   op, iIdxCur, br
11aa0 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  k);.        }els
11ab0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
11ac0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11ad0 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
11ae0 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a  evel->iMem, 1);.
11af0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11b00 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
11b10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
11b20 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
11b30 5f 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20  _Last, iIdxCur, 
11b40 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
11b50 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
11b60 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20   the start key. 
11b70 20 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79   This is the key
11b80 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68   that defines th
11b90 65 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a  e lower.      **
11ba0 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65   bound on the se
11bb0 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20  arch.  There is 
11bc0 6e 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20  no start key if 
11bd0 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20  there are no.   
11be0 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74     ** equality t
11bf0 65 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72  erms and if ther
11c00 65 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20  e is no "X>..." 
11c10 74 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20  term.  In.      
11c20 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65  ** that case, ge
11c30 6e 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64  nerate a "Rewind
11c40 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e  " instruction in
11c50 20 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20   place of the.  
11c60 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79      ** start key
11c70 20 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a   search..      *
11c80 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d  *.      ** 2002-
11c90 44 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63  Dec-04: In the c
11ca0 61 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65  ase of a reverse
11cb0 2d 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74  -order search, t
11cc0 68 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20  he so-called.   
11cd0 20 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65     ** "start" ke
11ce0 79 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70  y really ends up
11cf0 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74   being used as t
11d00 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b  he termination k
11d10 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
11d20 20 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20     if( btmLimit 
11d30 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11d40 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
11d50 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
11d60 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
11d70 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
11d80 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
11d90 6f 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20  otReady, btmOp, 
11da0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
11db0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
11dc0 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
11dd0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
11de0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
11df0 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
11e00 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
11e10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
11e20 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
11e30 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
11e40 20 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65       btmEq = pTe
11e50 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
11e60 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
11e70 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
11e80 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
11e90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11ea0 20 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20          btmEq = 
11eb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
11ec0 20 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74   if( nEq>0 || bt
11ed0 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20  mLimit ){.      
11ee0 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71    int nCol = nEq
11ef0 20 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20   + btmLimit;.   
11f00 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50       buildIndexP
11f10 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c  robe(v, nCol, 0,
11f20 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
11f30 20 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b       if( bRev ){
11f40 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65  .          pLeve
11f50 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
11f60 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
11f70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
11f80 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
11f90 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
11fa0 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  m, 1);.         
11fb0 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78   testOp = OP_Idx
11fc0 4c 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  LT;.        }els
11fd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
11fe0 20 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50   op = btmEq ? OP
11ff0 5f 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76  _MoveGe : OP_Mov
12000 65 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  eGt;.          s
12010 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
12020 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20  v, op, iIdxCur, 
12030 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  brk);.        }.
12040 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12050 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
12060 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  testOp = OP_Noop
12070 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12090 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65  beAddOp(v, OP_Re
120a0 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62  wind, iIdxCur, b
120b0 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
120c0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
120d0 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74  the the top of t
120e0 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65  he loop.  If the
120f0 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74  re is a terminat
12100 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79  ion.      ** key
12110 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74   we have to test
12120 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e   for that key an
12130 64 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74  d abort at the t
12140 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  op of the.      
12150 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a  ** loop..      *
12160 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20  /.      start = 
12170 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
12180 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
12190 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f   if( testOp!=OP_
121a0 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Noop ){.        
121b0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
121c0 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
121d0 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29  pLevel->iMem, 0)
121e0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
121f0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65  3VdbeAddOp(v, te
12200 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  stOp, iIdxCur, b
12210 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rk);.        if(
12220 20 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76   (topEq && !bRev
12230 29 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20  ) || (!btmEq && 
12240 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20  bRev) ){.       
12250 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
12260 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b  angeP3(v, -1, "+
12270 22 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  ", P3_STATIC);. 
12280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12290 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
122a0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
122b0 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
122c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
122d0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
122e0 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e  IdxIsNull, nNotN
122f0 75 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20  ull, cont);.    
12300 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65    if( !omitTable
12310 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12320 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12330 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64  OP_IdxRowid, iId
12340 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  xCur, 0);.      
12350 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12360 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c  Op(v, OP_MoveGe,
12370 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
12380 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63   }..      /* Rec
12390 6f 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74  ord the instruct
123a0 69 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d  ion used to term
123b0 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a  inate the loop..
123c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
123d0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
123e0 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
123f0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
12400 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72  el->p1 = iIdxCur
12410 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
12420 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20  p2 = start;.    
12430 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
12440 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
12450 43 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20  COLUMN_EQ ){.   
12460 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
12470 68 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78  here is an index
12480 20 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f   and all terms o
12490 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
124a0 73 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  se that.      **
124b0 20 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20            refer 
124c0 74 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69  to the index usi
124d0 6e 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22  ng the "==" or "
124e0 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20  IN" operators.. 
124f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
12500 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
12510 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
12520 3e 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  >nEq;..      /* 
12530 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
12540 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f   evaluate all co
12550 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75  nstraint terms u
12560 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20  sing == or IN.  
12570 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65      ** and leave
12580 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
12590 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68  hose terms on th
125a0 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a  e stack..      *
125b0 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45  /.      codeAllE
125c0 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61  qualityTerms(pPa
125d0 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63  rse, pLevel, &wc
125e0 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29  , notReady, brk)
125f0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
12600 72 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65  rate a single ke
12610 79 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  y that will be u
12620 73 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72  sed to both star
12630 74 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a  t and terminate.
12640 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61        ** the sea
12650 72 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  rch.      */.   
12660 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f     buildIndexPro
12670 62 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72  be(v, nEq, 0, br
12680 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20  k, pIdx);.      
12690 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
126a0 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
126b0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
126c0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e  );..      /* Gen
126d0 65 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74  erate code (1) t
126e0 6f 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69  o move to the fi
126f0 72 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65  rst matching ele
12700 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c  ment of the tabl
12710 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e  e..      ** Then
12720 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   generate code (
12730 32 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f  2) that jumps to
12740 20 22 62 72 6b 22 20 61 66 74 65 72 20 74 68 65   "brk" after the
12750 20 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a   cursor is past.
12760 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
12770 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65  t matching eleme
12780 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  nt of the table.
12790 20 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69    The code (1) i
127a0 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20  s executed.     
127b0 20 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74   ** once to init
127c0 69 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63  ialize the searc
127d0 68 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20  h, the code (2) 
127e0 69 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f  is executed befo
127f0 72 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a  re each.      **
12800 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   iteration of th
12810 65 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66  e scan to see if
12820 20 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69   the scan has fi
12830 6e 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20  nished. */.     
12840 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
12850 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20       /* Scan in 
12860 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
12870 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12880 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12890 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c  MoveLe, iIdxCur,
128a0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
128b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
128c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
128d0 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
128e0 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
128f0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12900 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69  p(v, OP_IdxLT, i
12910 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
12920 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
12930 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
12940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12950 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20   /* Scan in the 
12960 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f  forward order */
12970 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12980 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12990 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c  MoveGe, iIdxCur,
129a0 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
129b0 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
129c0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
129d0 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69  mLoad, pLevel->i
129e0 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Mem, 0);.       
129f0 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
12a00 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64  v, OP_IdxGE, iId
12a10 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20  xCur, brk, "+", 
12a20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  P3_STATIC);.    
12a30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
12a40 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
12a50 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
12a60 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
12a70 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20  owKey, iIdxCur, 
12a80 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
12a90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
12aa0 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c  _IdxIsNull, nEq,
12ab0 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
12ac0 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
12ad0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12ae0 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
12af0 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
12b00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
12b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12b20 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
12b30 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
12b40 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
12b50 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
12b60 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
12b70 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
12b80 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a        /* Case 5:
12b90 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73    There is no us
12ba0 61 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20  able index.  We 
12bb0 6d 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65  must do a comple
12bc0 74 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  te.      **     
12bd0 20 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65       scan of the
12be0 20 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20   entire table.. 
12bf0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
12c00 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d  sert( omitTable=
12c10 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
12c20 72 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20  rt( bRev==0 );. 
12c30 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
12c40 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  = OP_Next;.     
12c50 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
12c60 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
12c70 2d 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74  ->p2 = 1 + sqlit
12c80 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
12c90 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
12ca0 62 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  brk);.    }.    
12cb0 6e 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74  notReady &= ~get
12cc0 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69  Mask(&maskSet, i
12cd0 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Cur);..    /* In
12ce0 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73  sert code to tes
12cf0 74 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65  t every subexpre
12d00 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62  ssion that can b
12d10 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20  e completely.   
12d20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69   ** computed usi
12d30 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ng the current s
12d40 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20  et of tables..  
12d50 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65    */.    for(pTe
12d60 72 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54  rm=wc.a, j=wc.nT
12d70 65 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70  erm; j>0; j--, p
12d80 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
12d90 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69  xpr *pE;.      i
12da0 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20  f( pTerm->flags 
12db0 26 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  & (TERM_VIRTUAL|
12dc0 54 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f  TERM_CODED) ) co
12dd0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
12de0 28 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71  ( (pTerm->prereq
12df0 41 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21  All & notReady)!
12e00 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
12e10 20 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d       pE = pTerm-
12e20 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73  >pExpr;.      as
12e30 73 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20  sert( pE!=0 );. 
12e40 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
12e50 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45  >iLeftJoin && !E
12e60 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
12e70 45 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20  E, EP_FromJoin) 
12e80 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  ){.        conti
12e90 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
12ea0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
12eb0 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
12ec0 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20  , cont, 1);.    
12ed0 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c    pTerm->flags |
12ee0 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20  = TERM_CODED;.  
12ef0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
12f00 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
12f10 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
12f20 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
12f30 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
12f40 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
12f50 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
12f60 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
12f70 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
12f80 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a  table.  .    */.
12f90 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
12fa0 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
12fb0 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d     pLevel->top =
12fc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
12fd0 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
12fe0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
12ff0 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c  Op(v, OP_MemInt,
13000 20 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66   1, pLevel->iLef
13010 74 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64  tJoin);.      Vd
13020 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
13030 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49   record LEFT JOI
13040 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20  N hit"));.      
13050 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20  for(pTerm=wc.a, 
13060 6a 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b  j=0; j<wc.nTerm;
13070 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   j++, pTerm++){.
13080 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
13090 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d  m->flags & (TERM
130a0 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f  _VIRTUAL|TERM_CO
130b0 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  DED) ) continue;
130c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
130d0 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26  erm->prereqAll &
130e0 20 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20   notReady)!=0 ) 
130f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13100 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d    assert( pTerm-
13110 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20  >pExpr );.      
13120 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
13130 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
13140 72 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c  rm->pExpr, cont,
13150 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65   1);.        pTe
13160 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52  rm->flags |= TER
13170 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d  M_CODED;.      }
13180 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
13190 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20  ef SQLITE_TEST  
131a0 2f 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61  /* For testing a
131b0 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65  nd debugging use
131c0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65   only */.  /* Re
131d0 63 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72  cord in the quer
131e0 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69  y plan informati
131f0 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72  on about the cur
13200 72 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20  rent table.  ** 
13210 61 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73  and the index us
13220 65 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20  ed to access it 
13230 28 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68  (if any).  If th
13240 65 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20  e table itself. 
13250 20 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c   ** is not used,
13260 20 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73   its name is jus
13270 74 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69  t '{}'.  If no i
13280 6e 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a  ndex is used.  *
13290 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c  * the index is l
132a0 69 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20  isted as "{}".  
132b0 49 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b  If the primary k
132c0 65 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20  ey is used the. 
132d0 20 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69   ** index name i
132e0 73 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f  s '*'..  */.  fo
132f0 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
13300 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
13310 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
13320 69 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65  int n;.    pLeve
13330 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
13340 5d 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20  ];.    pTabItem 
13350 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70  = &pTabList->a[p
13360 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20  Level->iFrom];. 
13370 20 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d     z = pTabItem-
13380 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28  >zAlias;.    if(
13390 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62   z==0 ) z = pTab
133a0 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d  Item->pTab->zNam
133b0 65 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  e;.    n = strle
133c0 6e 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b  n(z);.    if( n+
133d0 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
133e0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
133f0 61 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20  an)-10 ){.      
13400 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
13410 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e  s & WHERE_IDX_ON
13420 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  LY ){.        st
13430 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
13440 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
13450 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20  , "{}");.       
13460 20 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20   nQPlan += 2;.  
13470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13480 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
13490 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
134a0 50 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20  Plan], z);.     
134b0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a     nQPlan += n;.
134c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
134d0 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
134e0 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27  [nQPlan++] = ' '
134f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13500 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
13510 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c  (WHERE_ROWID_EQ|
13520 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47  WHERE_ROWID_RANG
13530 45 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63  E) ){.      strc
13540 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72  py(&sqlite3_quer
13550 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20  y_plan[nQPlan], 
13560 22 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50  "* ");.      nQP
13570 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65  lan += 2;.    }e
13580 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  lse if( pLevel->
13590 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
135a0 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33   strcpy(&sqlite3
135b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c  _query_plan[nQPl
135c0 61 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20  an], "{} ");.   
135d0 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a     nQPlan += 3;.
135e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
135f0 20 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76   n = strlen(pLev
13600 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29  el->pIdx->zName)
13610 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51  ;.      if( n+nQ
13620 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71  Plan < sizeof(sq
13630 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
13640 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73  )-2 ){.        s
13650 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71  trcpy(&sqlite3_q
13660 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e  uery_plan[nQPlan
13670 5d 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d  ], pLevel->pIdx-
13680 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  >zName);.       
13690 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20   nQPlan += n;.  
136a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75        sqlite3_qu
136b0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b  ery_plan[nQPlan+
136c0 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
136d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68  }.    }.  }.  wh
136e0 69 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26  ile( nQPlan>0 &&
136f0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
13700 6c 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27  lan[nQPlan-1]=='
13710 20 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   ' ){.    sqlite
13720 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e  3_query_plan[--n
13730 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a  QPlan] = 0;.  }.
13740 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f    sqlite3_query_
13750 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30  plan[nQPlan] = 0
13760 3b 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a  ;.  nQPlan = 0;.
13770 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13780 5f 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67  _TEST // Testing
13790 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75   and debugging u
137a0 73 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a  se only */..  /*
137b0 20 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74   Record the cont
137c0 69 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73  inuation address
137d0 20 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66   in the WhereInf
137e0 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  o structure.  Th
137f0 65 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70  en.  ** clean up
13800 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
13810 2f 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e  /.  pWInfo->iCon
13820 74 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20  tinue = cont;.  
13830 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72  whereClauseClear
13840 28 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20  (&wc);.  return 
13850 70 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75  pWInfo;..  /* Ju
13860 6d 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f  mp here if mallo
13870 63 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65  c fails */.where
13880 42 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68  BeginNoMem:.  wh
13890 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
138a0 77 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f  wc);.  whereInfo
138b0 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
138c0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
138d0 2a 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  ** Generate the 
138e0 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45  end of the WHERE
138f0 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d   loop.  See comm
13900 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69  ents on .** sqli
13910 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20  te3WhereBegin() 
13920 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
13930 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  nformation..*/.v
13940 6f 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65  oid sqlite3Where
13950 45 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70  End(WhereInfo *p
13960 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a  WInfo){.  Vdbe *
13970 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72  v = pWInfo->pPar
13980 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
13990 20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   i;.  WhereLevel
139a0 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c   *pLevel;.  SrcL
139b0 69 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20  ist *pTabList = 
139c0 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74  pWInfo->pTabList
139d0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
139e0 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f   loop terminatio
139f0 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66  n code..  */.  f
13a00 6f 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  or(i=pTabList->n
13a10 53 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Src-1; i>=0; i--
13a20 29 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20  ){.    pLevel = 
13a30 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20  &pWInfo->a[i];. 
13a40 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
13a50 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c  solveLabel(v, pL
13a60 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20  evel->cont);.   
13a70 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21   if( pLevel->op!
13a80 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20  =OP_Noop ){.    
13a90 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13aa0 4f 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70  Op(v, pLevel->op
13ab0 2c 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c  , pLevel->p1, pL
13ac0 65 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d  evel->p2);.    }
13ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13ae0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13af0 70 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20  pLevel->brk);.  
13b00 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49    if( pLevel->nI
13b10 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a  n ){.      int *
13b20 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  a;.      int j;.
13b30 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76        for(j=pLev
13b40 65 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76  el->nIn, a=&pLev
13b50 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 32 2d  el->aInLoop[j*2-
13b60 32 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d  2]; j>0; j--, a-
13b70 3d 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  =2){.        sql
13b80 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13b90 20 4f 50 5f 4e 65 78 74 2c 20 61 5b 30 5d 2c 20   OP_Next, a[0], 
13ba0 61 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  a[1]);.        s
13bb0 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65  qlite3VdbeJumpHe
13bc0 72 65 28 76 2c 20 61 5b 31 5d 2d 31 29 3b 0a 20  re(v, a[1]-1);. 
13bd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
13be0 69 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e  iteFree(pLevel->
13bf0 61 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a  aInLoop);.    }.
13c00 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
13c10 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
13c20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
13c30 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
13c40 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13c50 5f 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65  _IfMemPos, pLeve
13c60 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29  l->iLeftJoin, 0)
13c70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13c80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
13c90 75 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74  ullRow, pTabList
13ca0 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20  ->a[i].iCursor, 
13cb0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  0);.      if( pL
13cc0 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30  evel->iIdxCur>=0
13cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
13ce0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13cf0 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76  OP_NullRow, pLev
13d00 65 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b  el->iIdxCur, 0);
13d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
13d20 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13d30 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
13d40 4c 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20  Level->top);.   
13d50 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
13d60 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b  mpHere(v, addr);
13d70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
13d80 20 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69   The "break" poi
13d90 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74  nt is here, just
13da0 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
13db0 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e   the outer loop.
13dc0 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20  .  ** Set it..  
13dd0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13de0 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
13df0 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b  pWInfo->iBreak);
13e00 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c  ..  /* Close all
13e10 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20   of the cursors 
13e20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64  that were opened
13e30 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65   by sqlite3Where
13e40 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  Begin..  */.  fo
13e50 72 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57  r(i=0, pLevel=pW
13e60 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c  Info->a; i<pTabL
13e70 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
13e80 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73  pLevel++){.    s
13e90 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
13ea0 65 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26  em *pTabItem = &
13eb0 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76  pTabList->a[pLev
13ec0 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20  el->iFrom];.    
13ed0 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
13ee0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
13ef0 20 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d    assert( pTab!=
13f00 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61  0 );.    if( pTa
13f10 62 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54  b->isEphem || pT
13f20 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
13f30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
13f40 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26  (pLevel->flags &
13f50 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29   WHERE_IDX_ONLY)
13f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
13f70 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13f80 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49   OP_Close, pTabI
13f90 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29  tem->iCursor, 0)
13fa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13fb0 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20  pLevel->pIdx!=0 
13fc0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13fd0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13fe0 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69  Close, pLevel->i
13ff0 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
14000 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63  }..    /* Make c
14010 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74 69  ursor substituti
14020 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77 68  ons for cases wh
14030 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75  ere we want to u
14040 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74  se.    ** just t
14050 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76  he index and nev
14060 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68 65  er reference the
14070 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a   table..    ** .
14080 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20      ** Calls to 
14090 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74  the code generat
140a0 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71  or in between sq
140b0 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20  lite3WhereBegin 
140c0 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  and.    ** sqlit
140d0 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20  e3WhereEnd will 
140e0 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64  have created cod
140f0 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65  e that reference
14100 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  s the table.    
14110 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68  ** directly.  Th
14120 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c  is loop scans al
14130 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b  l that code look
14140 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a  ing for opcodes.
14150 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65      ** that refe
14160 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20  rence the table 
14170 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65  and converts the
14180 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74  m into opcodes t
14190 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72  hat.    ** refer
141a0 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a  ence the index..
141b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
141c0 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57  Level->flags & W
141d0 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b  HERE_IDX_ONLY ){
141e0 0a 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c  .      int k, j,
141f0 20 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62   last;.      Vdb
14200 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20  eOp *pOp;.      
14210 49 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c  Index *pIdx = pL
14220 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20  evel->pIdx;..   
14230 20 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21     assert( pIdx!
14240 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20  =0 );.      pOp 
14250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  = sqlite3VdbeGet
14260 4f 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54  Op(v, pWInfo->iT
14270 6f 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20  op);.      last 
14280 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
14290 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
142a0 20 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d     for(k=pWInfo-
142b0 3e 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b  >iTop; k<last; k
142c0 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  ++, pOp++){.    
142d0 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21      if( pOp->p1!
142e0 3d 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72  =pLevel->iTabCur
142f0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
14300 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70       if( pOp->op
14310 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20  code==OP_Column 
14320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70  ){.          pOp
14330 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  ->p1 = pLevel->i
14340 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20  IdxCur;.        
14350 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64    for(j=0; j<pId
14360 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29  x->nColumn; j++)
14370 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
14380 28 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d  ( pOp->p2==pIdx-
14390 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a  >aiColumn[j] ){.
143a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f                pO
143b0 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20  p->p2 = j;.     
143c0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
143d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
143e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143f0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
14400 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69  >opcode==OP_Rowi
14410 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  d ){.          p
14420 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d  Op->p1 = pLevel-
14430 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20  >iIdxCur;.      
14440 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20      pOp->opcode 
14450 3d 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20  = OP_IdxRowid;. 
14460 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14470 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50   pOp->opcode==OP
14480 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20  _NullRow ){.    
14490 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64        pOp->opcod
144a0 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  e = OP_Noop;.   
144b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
144c0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46     }.  }..  /* F
144d0 69 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a  inal cleanup.  *
144e0 2f 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65  /.  whereInfoFre
144f0 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74  e(pWInfo);.  ret
14500 75 72 6e 3b 0a 7d 0a                             urn;.}.