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

Artifact 0f1fcc2c7446b6dd947bf0069487b3ff282043ee:


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 39   where.c,v 1.219
0340: 20 32 30 30 36 2f 30 36 2f 31 39 20 30 34 3a 34   2006/06/19 04:4
0350: 39 3a 33 35 20 64 61 6e 69 65 6c 6b 31 39 37 37  9:35 danielk1977
0360: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0370: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75 6d 62  ../*.** The numb
0390: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 61 20  er of bits in a 
03a0: 42 69 74 6d 61 73 6b 2e 20 20 22 42 4d 53 22 20  Bitmask.  "BMS" 
03b0: 6d 65 61 6e 73 20 22 42 69 74 4d 61 73 6b 20 53  means "BitMask S
03c0: 69 7a 65 22 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ize"..*/.#define
03d0: 20 42 4d 53 20 20 28 73 69 7a 65 6f 66 28 42 69   BMS  (sizeof(Bi
03e0: 74 6d 61 73 6b 29 2a 38 29 0a 0a 2f 2a 0a 2a 2a  tmask)*8)../*.**
03f0: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   Determine the n
0400: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
0410: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 2e 0a 2a  s in an array..*
0420: 2f 0a 23 64 65 66 69 6e 65 20 41 52 52 41 59 53  /.#define ARRAYS
0430: 49 5a 45 28 58 29 20 20 28 73 69 7a 65 6f 66 28  IZE(X)  (sizeof(
0440: 58 29 2f 73 69 7a 65 6f 66 28 58 5b 30 5d 29 29  X)/sizeof(X[0]))
0450: 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 63 65 20 6f 75  ../*.** Trace ou
0460: 74 70 75 74 20 6d 61 63 72 6f 73 0a 2a 2f 0a 23  tput macros.*/.#
0470: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
0480: 45 5f 54 45 53 54 29 20 7c 7c 20 64 65 66 69 6e  E_TEST) || defin
0490: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
04a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 65  .int sqlite3_whe
04b0: 72 65 5f 74 72 61 63 65 20 3d 20 30 3b 0a 23 20  re_trace = 0;.# 
04c0: 64 65 66 69 6e 65 20 54 52 41 43 45 28 58 29 20  define TRACE(X) 
04d0: 20 69 66 28 73 71 6c 69 74 65 33 5f 77 68 65 72   if(sqlite3_wher
04e0: 65 5f 74 72 61 63 65 29 20 73 71 6c 69 74 65 33  e_trace) sqlite3
04f0: 44 65 62 75 67 50 72 69 6e 74 66 20 58 0a 23 65  DebugPrintf X.#e
0500: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 54 52 41  lse.# define TRA
0510: 43 45 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CE(X).#endif../*
0520: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
0530: 63 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  ce.*/.typedef st
0540: 72 75 63 74 20 57 68 65 72 65 43 6c 61 75 73 65  ruct WhereClause
0550: 20 57 68 65 72 65 43 6c 61 75 73 65 3b 0a 0a 2f   WhereClause;../
0560: 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67  *.** The query g
0570: 65 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e  enerator uses an
0580: 20 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e   array of instan
0590: 63 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75  ces of this stru
05a0: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70  cture to.** help
05b0: 20 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20   it analyze the 
05c0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  subexpressions o
05d0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
05e0: 73 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a  se.  Each WHERE.
05f0: 2a 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70  ** clause subexp
0600: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
0610: 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74  ated from the ot
0620: 68 65 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f  hers by an AND o
0630: 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41  perator..**.** A
0640: 6c 6c 20 57 68 65 72 65 54 65 72 6d 73 20 61 72  ll WhereTerms ar
0650: 65 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f  e collected into
0660: 20 61 20 73 69 6e 67 6c 65 20 57 68 65 72 65 43   a single WhereC
0670: 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65 2e  lause structure.
0680: 20 20 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77    .** The follow
0690: 69 6e 67 20 69 64 65 6e 74 69 74 79 20 68 6f 6c  ing identity hol
06a0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ds:.**.**       
06b0: 20 57 68 65 72 65 54 65 72 6d 2e 70 57 43 2d 3e   WhereTerm.pWC->
06c0: 61 5b 57 68 65 72 65 54 65 72 6d 2e 69 64 78 5d  a[WhereTerm.idx]
06d0: 20 3d 3d 20 57 68 65 72 65 54 65 72 6d 0a 2a 2a   == WhereTerm.**
06e0: 0a 2a 2a 20 57 68 65 6e 20 61 20 74 65 72 6d 20  .** When a term 
06f0: 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a  is of the form:.
0700: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
0710: 20 20 20 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e     X <op> <expr>
0720: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 58 20 69  .**.** where X i
0730: 73 20 61 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  s a column name 
0740: 61 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 65 20  and <op> is one 
0750: 6f 66 20 63 65 72 74 61 69 6e 20 6f 70 65 72 61  of certain opera
0760: 74 6f 72 73 2c 0a 2a 2a 20 74 68 65 6e 20 57 68  tors,.** then Wh
0770: 65 72 65 54 65 72 6d 2e 6c 65 66 74 43 75 72 73  ereTerm.leftCurs
0780: 6f 72 20 61 6e 64 20 57 68 65 72 65 54 65 72 6d  or and WhereTerm
0790: 2e 6c 65 66 74 43 6f 6c 75 6d 6e 20 72 65 63 6f  .leftColumn reco
07a0: 72 64 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72  rd the.** cursor
07b0: 20 6e 75 6d 62 65 72 20 61 6e 64 20 63 6f 6c 75   number and colu
07c0: 6d 6e 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e  mn number for X.
07d0: 20 20 57 68 65 72 65 54 65 72 6d 2e 6f 70 65 72    WhereTerm.oper
07e0: 61 74 6f 72 20 72 65 63 6f 72 64 73 0a 2a 2a 20  ator records.** 
07f0: 74 68 65 20 3c 6f 70 3e 20 75 73 69 6e 67 20 61  the <op> using a
0800: 20 62 69 74 6d 61 73 6b 20 65 6e 63 6f 64 69 6e   bitmask encodin
0810: 67 20 64 65 66 69 6e 65 64 20 62 79 20 57 4f 5f  g defined by WO_
0820: 78 78 78 20 62 65 6c 6f 77 2e 20 20 54 68 65 0a  xxx below.  The.
0830: 2a 2a 20 75 73 65 20 6f 66 20 61 20 62 69 74 6d  ** use of a bitm
0840: 61 73 6b 20 65 6e 63 6f 64 69 6e 67 20 66 6f 72  ask encoding for
0850: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 20 61 6c   the operator al
0860: 6c 6f 77 73 20 75 73 20 74 6f 20 73 65 61 72 63  lows us to searc
0870: 68 0a 2a 2a 20 71 75 69 63 6b 6c 79 20 66 6f 72  h.** quickly for
0880: 20 74 65 72 6d 73 20 74 68 61 74 20 6d 61 74 63   terms that matc
0890: 68 20 61 6e 79 20 6f 66 20 73 65 76 65 72 61 6c  h any of several
08a0: 20 64 69 66 66 65 72 65 6e 74 20 6f 70 65 72 61   different opera
08b0: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72  tors..**.** prer
08c0: 65 71 52 69 67 68 74 20 61 6e 64 20 70 72 65 72  eqRight and prer
08d0: 65 71 41 6c 6c 20 72 65 63 6f 72 64 20 73 65 74  eqAll record set
08e0: 73 20 6f 66 20 63 75 72 73 6f 72 20 6e 75 6d 62  s of cursor numb
08f0: 65 72 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 79  ers,.** but they
0900: 20 64 6f 20 73 6f 20 69 6e 64 69 72 65 63 74 6c   do so indirectl
0910: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 45 78 70  y.  A single Exp
0920: 72 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74 75  rMaskSet structu
0930: 72 65 20 74 72 61 6e 73 6c 61 74 65 73 0a 2a 2a  re translates.**
0940: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 69   cursor number i
0950: 6e 74 6f 20 62 69 74 73 20 61 6e 64 20 74 68 65  nto bits and the
0960: 20 74 72 61 6e 73 6c 61 74 65 64 20 62 69 74 20   translated bit 
0970: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
0980: 20 70 72 65 72 65 71 0a 2a 2a 20 66 69 65 6c 64   prereq.** field
0990: 73 2e 20 20 54 68 65 20 74 72 61 6e 73 6c 61 74  s.  The translat
09a0: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 6f  ion is used in o
09b0: 72 64 65 72 20 74 6f 20 6d 61 78 69 6d 69 7a 65  rder to maximize
09c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
09d0: 2a 20 62 69 74 73 20 74 68 61 74 20 77 69 6c 6c  * bits that will
09e0: 20 66 69 74 20 69 6e 20 61 20 42 69 74 6d 61 73   fit in a Bitmas
09f0: 6b 2e 20 20 54 68 65 20 56 44 42 45 20 63 75 72  k.  The VDBE cur
0a00: 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68  sor numbers migh
0a10: 74 20 62 65 0a 2a 2a 20 73 70 72 65 61 64 20 6f  t be.** spread o
0a20: 75 74 20 6f 76 65 72 20 74 68 65 20 6e 6f 6e 2d  ut over the non-
0a30: 6e 65 67 61 74 69 76 65 20 69 6e 74 65 67 65 72  negative integer
0a40: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  s.  For example,
0a50: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 6e   the cursor.** n
0a60: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 20  umbers might be 
0a70: 33 2c 20 38 2c 20 39 2c 20 31 30 2c 20 32 30 2c  3, 8, 9, 10, 20,
0a80: 20 32 33 2c 20 34 31 2c 20 61 6e 64 20 34 35 2e   23, 41, and 45.
0a90: 20 20 54 68 65 20 45 78 70 72 4d 61 73 6b 53 65    The ExprMaskSe
0aa0: 74 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65 73 20  t.** translates 
0ab0: 74 68 65 73 65 20 73 70 61 72 73 65 20 63 75 72  these sparse cur
0ac0: 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f  sor numbers into
0ad0: 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e 74   consecutive int
0ae0: 65 67 65 72 73 0a 2a 2a 20 62 65 67 69 6e 6e 69  egers.** beginni
0af0: 6e 67 20 77 69 74 68 20 30 20 69 6e 20 6f 72 64  ng with 0 in ord
0b00: 65 72 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 62  er to make the b
0b10: 65 73 74 20 70 6f 73 73 69 62 6c 65 20 75 73 65  est possible use
0b20: 20 6f 66 20 74 68 65 20 61 76 61 69 6c 61 62 6c   of the availabl
0b30: 65 0a 2a 2a 20 62 69 74 73 20 69 6e 20 74 68 65  e.** bits in the
0b40: 20 42 69 74 6d 61 73 6b 2e 20 20 53 6f 2c 20 69   Bitmask.  So, i
0b50: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
0b60: 6f 76 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20  ove, the cursor 
0b70: 6e 75 6d 62 65 72 73 0a 2a 2a 20 77 6f 75 6c 64  numbers.** would
0b80: 20 62 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   be mapped into 
0b90: 69 6e 74 65 67 65 72 73 20 30 20 74 68 72 6f 75  integers 0 throu
0ba0: 67 68 20 37 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  gh 7..*/.typedef
0bb0: 20 73 74 72 75 63 74 20 57 68 65 72 65 54 65 72   struct WhereTer
0bc0: 6d 20 57 68 65 72 65 54 65 72 6d 3b 0a 73 74 72  m WhereTerm;.str
0bd0: 75 63 74 20 57 68 65 72 65 54 65 72 6d 20 7b 0a  uct WhereTerm {.
0be0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20    Expr *pExpr;  
0bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
0c00: 6e 74 65 72 20 74 6f 20 74 68 65 20 73 75 62 65  nter to the sube
0c10: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  xpression */.  i
0c20: 31 36 20 69 50 61 72 65 6e 74 3b 20 20 20 20 20  16 iParent;     
0c30: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
0c40: 65 20 70 57 43 2d 3e 61 5b 69 50 61 72 65 6e 74  e pWC->a[iParent
0c50: 5d 20 77 68 65 6e 20 74 68 69 73 20 74 65 72 6d  ] when this term
0c60: 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 69   disabled */.  i
0c70: 31 36 20 6c 65 66 74 43 75 72 73 6f 72 3b 20 20  16 leftCursor;  
0c80: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
0c90: 20 6e 75 6d 62 65 72 20 6f 66 20 58 20 69 6e 20   number of X in 
0ca0: 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22 20  "X <op> <expr>" 
0cb0: 2a 2f 0a 20 20 69 31 36 20 6c 65 66 74 43 6f 6c  */.  i16 leftCol
0cc0: 75 6d 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  umn;         /* 
0cd0: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 6f 66  Column number of
0ce0: 20 58 20 69 6e 20 22 58 20 3c 6f 70 3e 20 3c 65   X in "X <op> <e
0cf0: 78 70 72 3e 22 20 2a 2f 0a 20 20 75 31 36 20 65  xpr>" */.  u16 e
0d00: 4f 70 65 72 61 74 6f 72 3b 20 20 20 20 20 20 20  Operator;       
0d10: 20 20 20 2f 2a 20 41 20 57 4f 5f 78 78 20 76 61     /* A WO_xx va
0d20: 6c 75 65 20 64 65 73 63 72 69 62 69 6e 67 20 3c  lue describing <
0d30: 6f 70 3e 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  op> */.  u8 flag
0d40: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
0d50: 20 2f 2a 20 42 69 74 20 66 6c 61 67 73 2e 20 20   /* Bit flags.  
0d60: 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 75  See below */.  u
0d70: 38 20 6e 43 68 69 6c 64 3b 20 20 20 20 20 20 20  8 nChild;       
0d80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0d90: 20 6f 66 20 63 68 69 6c 64 72 65 6e 20 74 68 61   of children tha
0da0: 74 20 6d 75 73 74 20 64 69 73 61 62 6c 65 20 75  t must disable u
0db0: 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75  s */.  WhereClau
0dc0: 73 65 20 2a 70 57 43 3b 20 20 20 20 20 20 20 2f  se *pWC;       /
0dd0: 2a 20 54 68 65 20 63 6c 61 75 73 65 20 74 68 69  * The clause thi
0de0: 73 20 74 65 72 6d 20 69 73 20 70 61 72 74 20 6f  s term is part o
0df0: 66 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70  f */.  Bitmask p
0e00: 72 65 72 65 71 52 69 67 68 74 3b 20 20 20 20 2f  rereqRight;    /
0e10: 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62  * Bitmask of tab
0e20: 6c 65 73 20 75 73 65 64 20 62 79 20 70 52 69 67  les used by pRig
0e30: 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ht */.  Bitmask 
0e40: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
0e50: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0e60: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0e70: 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  by p */.};../*.*
0e80: 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  * Allowed values
0e90: 20 6f 66 20 57 68 65 72 65 54 65 72 6d 2e 66 6c   of WhereTerm.fl
0ea0: 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 54  ags.*/.#define T
0eb0: 45 52 4d 5f 44 59 4e 41 4d 49 43 20 20 20 20 30  ERM_DYNAMIC    0
0ec0: 78 30 31 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  x01   /* Need to
0ed0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70   call sqlite3Exp
0ee0: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 20 2a  rDelete(pExpr) *
0ef0: 2f 0a 23 64 65 66 69 6e 65 20 54 45 52 4d 5f 56  /.#define TERM_V
0f00: 49 52 54 55 41 4c 20 20 20 20 30 78 30 32 20 20  IRTUAL    0x02  
0f10: 20 2f 2a 20 41 64 64 65 64 20 62 79 20 74 68 65   /* Added by the
0f20: 20 6f 70 74 69 6d 69 7a 65 72 2e 20 20 44 6f 20   optimizer.  Do 
0f30: 6e 6f 74 20 63 6f 64 65 20 2a 2f 0a 23 64 65 66  not code */.#def
0f40: 69 6e 65 20 54 45 52 4d 5f 43 4f 44 45 44 20 20  ine TERM_CODED  
0f50: 20 20 20 20 30 78 30 34 20 20 20 2f 2a 20 54 68      0x04   /* Th
0f60: 69 73 20 74 65 72 6d 20 69 73 20 61 6c 72 65 61  is term is alrea
0f70: 64 79 20 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66  dy coded */.#def
0f80: 69 6e 65 20 54 45 52 4d 5f 43 4f 50 49 45 44 20  ine TERM_COPIED 
0f90: 20 20 20 20 30 78 30 38 20 20 20 2f 2a 20 48 61      0x08   /* Ha
0fa0: 73 20 61 20 63 68 69 6c 64 20 2a 2f 0a 23 64 65  s a child */.#de
0fb0: 66 69 6e 65 20 54 45 52 4d 5f 4f 52 5f 4f 4b 20  fine TERM_OR_OK 
0fc0: 20 20 20 20 20 30 78 31 30 20 20 20 2f 2a 20 55       0x10   /* U
0fd0: 73 65 64 20 64 75 72 69 6e 67 20 4f 52 2d 63 6c  sed during OR-cl
0fe0: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
0ff0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
1000: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1010: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1020: 20 68 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72   holds all infor
1030: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a  mation about a.*
1040: 2a 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  * WHERE clause. 
1050: 20 4d 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20   Mostly this is 
1060: 61 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  a container for 
1070: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72  one or more Wher
1080: 65 54 65 72 6d 73 2e 0a 2a 2f 0a 73 74 72 75 63  eTerms..*/.struc
1090: 74 20 57 68 65 72 65 43 6c 61 75 73 65 20 7b 0a  t WhereClause {.
10a0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b    Parse *pParse;
10b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
10c0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
10d0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b   */.  int nTerm;
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d  * Number of term
1100: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  s */.  int nSlot
1110: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1120: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
1130: 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  ries in a[] */. 
1140: 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b 20 20   WhereTerm *a;  
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
1160: 68 20 61 5b 5d 20 64 65 73 63 72 69 62 65 73 20  h a[] describes 
1170: 61 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  a term of the WH
1180: 45 52 45 20 63 6c 75 61 73 65 20 2a 2f 0a 20 20  ERE cluase */.  
1190: 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74 69  WhereTerm aStati
11a0: 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49 6e 69 74  c[10];   /* Init
11b0: 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63 65  ial static space
11c0: 20 66 6f 72 20 61 5b 5d 20 2a 2f 0a 7d 3b 0a 0a   for a[] */.};..
11d0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
11e0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
11f0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
1200: 70 73 20 74 72 61 63 6b 20 6f 66 20 61 20 6d 61  ps track of a ma
1210: 70 70 69 6e 67 0a 2a 2a 20 62 65 74 77 65 65 6e  pping.** between
1220: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1230: 62 65 72 73 20 61 6e 64 20 62 69 74 73 20 6f 66  bers and bits of
1240: 20 74 68 65 20 62 69 74 6d 61 73 6b 73 20 69 6e   the bitmasks in
1250: 20 57 68 65 72 65 54 65 72 6d 2e 0a 2a 2a 0a 2a   WhereTerm..**.*
1260: 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f  * The VDBE curso
1270: 72 20 6e 75 6d 62 65 72 73 20 61 72 65 20 73 6d  r numbers are sm
1280: 61 6c 6c 20 69 6e 74 65 67 65 72 73 20 63 6f 6e  all integers con
1290: 74 61 69 6e 65 64 20 69 6e 20 0a 2a 2a 20 53 72  tained in .** Sr
12a0: 63 4c 69 73 74 5f 69 74 65 6d 2e 69 43 75 72 73  cList_item.iCurs
12b0: 6f 72 20 61 6e 64 20 45 78 70 72 2e 69 54 61 62  or and Expr.iTab
12c0: 6c 65 20 66 69 65 6c 64 73 2e 20 20 46 6f 72 20  le fields.  For 
12d0: 61 6e 79 20 67 69 76 65 6e 20 57 48 45 52 45 20  any given WHERE 
12e0: 0a 2a 2a 20 63 6c 61 75 73 65 2c 20 74 68 65 20  .** clause, the 
12f0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 6d  cursor numbers m
1300: 69 67 68 74 20 6e 6f 74 20 62 65 67 69 6e 20 77  ight not begin w
1310: 69 74 68 20 30 20 61 6e 64 20 74 68 65 79 20 6d  ith 0 and they m
1320: 69 67 68 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20  ight.** contain 
1330: 67 61 70 73 20 69 6e 20 74 68 65 20 6e 75 6d 62  gaps in the numb
1340: 65 72 69 6e 67 20 73 65 71 75 65 6e 63 65 2e 20  ering sequence. 
1350: 20 42 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   But we want to 
1360: 6d 61 6b 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20  make maximum.** 
1370: 75 73 65 20 6f 66 20 74 68 65 20 62 69 74 73 20  use of the bits 
1380: 69 6e 20 6f 75 72 20 62 69 74 6d 61 73 6b 73 2e  in our bitmasks.
1390: 20 20 54 68 69 73 20 73 74 72 75 63 74 75 72 65    This structure
13a0: 20 70 72 6f 76 69 64 65 73 20 61 20 6d 61 70 70   provides a mapp
13b0: 69 6e 67 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ing.** from the 
13c0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75  sparse cursor nu
13d0: 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65  mbers into conse
13e0: 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73 20  cutive integers 
13f0: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 77 69 74  beginning.** wit
1400: 68 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 45 78  h 0..**.** If Ex
1410: 70 72 4d 61 73 6b 53 65 74 2e 69 78 5b 41 5d 3d  prMaskSet.ix[A]=
1420: 3d 42 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  =B it means that
1430: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
1440: 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2a 20 63 6f   a Bitmask.** co
1450: 72 72 65 73 70 6f 6e 64 73 20 56 44 42 45 20 63  rresponds VDBE c
1460: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 42 2e 20  ursor number B. 
1470: 20 54 68 65 20 41 2d 74 68 20 62 69 74 20 6f 66   The A-th bit of
1480: 20 61 20 62 69 74 6d 61 73 6b 20 69 73 20 31 3c   a bitmask is 1<
1490: 3c 41 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 65 78  <A..**.** For ex
14a0: 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 57 48  ample, if the WH
14b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
14c0: 73 73 69 6f 6e 20 75 73 65 64 20 74 68 65 73 65  ssion used these
14d0: 20 56 44 42 45 0a 2a 2a 20 63 75 72 73 6f 72 73   VDBE.** cursors
14e0: 3a 20 20 34 2c 20 35 2c 20 38 2c 20 32 39 2c 20  :  4, 5, 8, 29, 
14f0: 35 37 2c 20 37 33 2e 20 20 54 68 65 6e 20 74 68  57, 73.  Then th
1500: 65 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 73  e  ExprMaskSet s
1510: 74 72 75 63 74 75 72 65 0a 2a 2a 20 77 6f 75 6c  tructure.** woul
1520: 64 20 6d 61 70 20 74 68 6f 73 65 20 63 75 72 73  d map those curs
1530: 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20  or numbers into 
1540: 62 69 74 73 20 30 20 74 68 72 6f 75 67 68 20 35  bits 0 through 5
1550: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1560: 74 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73  t the mapping is
1570: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79   not necessarily
1580: 20 6f 72 64 65 72 65 64 2e 20 20 49 6e 20 74 68   ordered.  In th
1590: 65 20 65 78 61 6d 70 6c 65 0a 2a 2a 20 61 62 6f  e example.** abo
15a0: 76 65 2c 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ve, the mapping 
15b0: 6d 69 67 68 74 20 67 6f 20 6c 69 6b 65 20 74 68  might go like th
15c0: 69 73 3a 20 20 34 2d 3e 33 2c 20 35 2d 3e 31 2c  is:  4->3, 5->1,
15d0: 20 38 2d 3e 32 2c 20 32 39 2d 3e 30 2c 0a 2a 2a   8->2, 29->0,.**
15e0: 20 35 37 2d 3e 35 2c 20 37 33 2d 3e 34 2e 20 20   57->5, 73->4.  
15f0: 4f 72 20 6f 6e 65 20 6f 66 20 37 31 39 20 6f 74  Or one of 719 ot
1600: 68 65 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  her combinations
1610: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 2e 20   might be used. 
1620: 49 74 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 72  It.** does not r
1630: 65 61 6c 6c 79 20 6d 61 74 74 65 72 2e 20 20 57  eally matter.  W
1640: 68 61 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  hat is important
1650: 20 69 73 20 74 68 61 74 20 73 70 61 72 73 65 20   is that sparse 
1660: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
1670: 73 20 61 6c 6c 20 67 65 74 20 6d 61 70 70 65 64  s all get mapped
1680: 20 69 6e 74 6f 20 62 69 74 20 6e 75 6d 62 65 72   into bit number
1690: 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
16a0: 68 20 30 20 61 6e 64 20 63 6f 6e 74 61 69 6e 0a  h 0 and contain.
16b0: 2a 2a 20 6e 6f 20 67 61 70 73 2e 0a 2a 2f 0a 74  ** no gaps..*/.t
16c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78  ypedef struct Ex
16d0: 70 72 4d 61 73 6b 53 65 74 20 45 78 70 72 4d 61  prMaskSet ExprMa
16e0: 73 6b 53 65 74 3b 0a 73 74 72 75 63 74 20 45 78  skSet;.struct Ex
16f0: 70 72 4d 61 73 6b 53 65 74 20 7b 0a 20 20 69 6e  prMaskSet {.  in
1700: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
1710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1720: 75 6d 62 65 72 20 6f 66 20 61 73 73 69 67 6e 65  umber of assigne
1730: 64 20 63 75 72 73 6f 72 20 76 61 6c 75 65 73 20  d cursor values 
1740: 2a 2f 0a 20 20 69 6e 74 20 69 78 5b 73 69 7a 65  */.  int ix[size
1750: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 5d 3b 20  of(Bitmask)*8]; 
1760: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 61 73 73     /* Cursor ass
1770: 69 67 6e 65 64 20 74 6f 20 65 61 63 68 20 62 69  igned to each bi
1780: 74 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  t */.};.../*.** 
1790: 42 69 74 6d 61 73 6b 73 20 66 6f 72 20 74 68 65  Bitmasks for the
17a0: 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74 20   operators that 
17b0: 69 6e 64 69 63 65 73 20 61 72 65 20 61 62 6c 65  indices are able
17c0: 20 74 6f 20 65 78 70 6c 6f 69 74 2e 20 20 41 6e   to exploit.  An
17d0: 0a 2a 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e  .** OR-ed combin
17e0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 73 65 20 76  ation of these v
17f0: 61 6c 75 65 73 20 63 61 6e 20 62 65 20 75 73 65  alues can be use
1800: 64 20 77 68 65 6e 20 73 65 61 72 63 68 69 6e 67  d when searching
1810: 20 66 6f 72 0a 2a 2a 20 74 65 72 6d 73 20 69 6e   for.** terms in
1820: 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73   the where claus
1830: 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 57 4f  e..*/.#define WO
1840: 5f 49 4e 20 20 20 20 20 31 0a 23 64 65 66 69 6e  _IN     1.#defin
1850: 65 20 57 4f 5f 45 51 20 20 20 20 20 32 0a 23 64  e WO_EQ     2.#d
1860: 65 66 69 6e 65 20 57 4f 5f 4c 54 20 20 20 20 20  efine WO_LT     
1870: 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 4c 54 2d 54  (WO_EQ<<(TK_LT-T
1880: 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65 20 57  K_EQ)).#define W
1890: 4f 5f 4c 45 20 20 20 20 20 28 57 4f 5f 45 51 3c  O_LE     (WO_EQ<
18a0: 3c 28 54 4b 5f 4c 45 2d 54 4b 5f 45 51 29 29 0a  <(TK_LE-TK_EQ)).
18b0: 23 64 65 66 69 6e 65 20 57 4f 5f 47 54 20 20 20  #define WO_GT   
18c0: 20 20 28 57 4f 5f 45 51 3c 3c 28 54 4b 5f 47 54    (WO_EQ<<(TK_GT
18d0: 2d 54 4b 5f 45 51 29 29 0a 23 64 65 66 69 6e 65  -TK_EQ)).#define
18e0: 20 57 4f 5f 47 45 20 20 20 20 20 28 57 4f 5f 45   WO_GE     (WO_E
18f0: 51 3c 3c 28 54 4b 5f 47 45 2d 54 4b 5f 45 51 29  Q<<(TK_GE-TK_EQ)
1900: 29 0a 23 64 65 66 69 6e 65 20 57 4f 5f 4d 41 54  ).#define WO_MAT
1910: 43 48 20 20 36 34 0a 0a 2f 2a 0a 2a 2a 20 56 61  CH  64../*.** Va
1920: 6c 75 65 20 66 6f 72 20 66 6c 61 67 73 20 72 65  lue for flags re
1930: 74 75 72 6e 65 64 20 62 79 20 62 65 73 74 49 6e  turned by bestIn
1940: 64 65 78 28 29 0a 2a 2f 0a 23 64 65 66 69 6e 65  dex().*/.#define
1950: 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 20   WHERE_ROWID_EQ 
1960: 20 20 20 20 20 20 30 78 30 30 30 31 20 20 20 2f        0x0001   /
1970: 2a 20 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20  * rowid=EXPR or 
1980: 72 6f 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 2a  rowid IN (...) *
1990: 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f  /.#define WHERE_
19a0: 52 4f 57 49 44 5f 52 41 4e 47 45 20 20 20 20 30  ROWID_RANGE    0
19b0: 78 30 30 30 32 20 20 20 2f 2a 20 72 6f 77 69 64  x0002   /* rowid
19c0: 3c 45 58 50 52 20 61 6e 64 2f 6f 72 20 72 6f 77  <EXPR and/or row
19d0: 69 64 3e 45 58 50 52 20 2a 2f 0a 23 64 65 66 69  id>EXPR */.#defi
19e0: 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f  ne WHERE_COLUMN_
19f0: 45 51 20 20 20 20 20 20 30 78 30 30 31 30 20 20  EQ      0x0010  
1a00: 20 2f 2a 20 78 3d 45 58 50 52 20 6f 72 20 78 20   /* x=EXPR or x 
1a10: 49 4e 20 28 2e 2e 2e 29 20 2a 2f 0a 23 64 65 66  IN (...) */.#def
1a20: 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  ine WHERE_COLUMN
1a30: 5f 52 41 4e 47 45 20 20 20 30 78 30 30 32 30 20  _RANGE   0x0020 
1a40: 20 20 2f 2a 20 78 3c 45 58 50 52 20 61 6e 64 2f    /* x<EXPR and/
1a50: 6f 72 20 78 3e 45 58 50 52 20 2a 2f 0a 23 64 65  or x>EXPR */.#de
1a60: 66 69 6e 65 20 57 48 45 52 45 5f 43 4f 4c 55 4d  fine WHERE_COLUM
1a70: 4e 5f 49 4e 20 20 20 20 20 20 30 78 30 30 34 30  N_IN      0x0040
1a80: 20 20 20 2f 2a 20 78 20 49 4e 20 28 2e 2e 2e 29     /* x IN (...)
1a90: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48 45 52   */.#define WHER
1aa0: 45 5f 54 4f 50 5f 4c 49 4d 49 54 20 20 20 20 20  E_TOP_LIMIT     
1ab0: 20 30 78 30 31 30 30 20 20 20 2f 2a 20 78 3c 45   0x0100   /* x<E
1ac0: 58 50 52 20 6f 72 20 78 3c 3d 45 58 50 52 20 63  XPR or x<=EXPR c
1ad0: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 23 64 65  onstraint */.#de
1ae0: 66 69 6e 65 20 57 48 45 52 45 5f 42 54 4d 5f 4c  fine WHERE_BTM_L
1af0: 49 4d 49 54 20 20 20 20 20 20 30 78 30 32 30 30  IMIT      0x0200
1b00: 20 20 20 2f 2a 20 78 3e 45 58 50 52 20 6f 72 20     /* x>EXPR or 
1b10: 78 3e 3d 45 58 50 52 20 63 6f 6e 73 74 72 61 69  x>=EXPR constrai
1b20: 6e 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 57 48  nt */.#define WH
1b30: 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 20 20 20  ERE_IDX_ONLY    
1b40: 20 20 20 30 78 30 38 30 30 20 20 20 2f 2a 20 55     0x0800   /* U
1b50: 73 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2d 20  se index only - 
1b60: 6f 6d 69 74 20 74 61 62 6c 65 20 2a 2f 0a 23 64  omit table */.#d
1b70: 65 66 69 6e 65 20 57 48 45 52 45 5f 4f 52 44 45  efine WHERE_ORDE
1b80: 52 42 59 20 20 20 20 20 20 20 20 30 78 31 30 30  RBY        0x100
1b90: 30 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 77 69  0   /* Output wi
1ba0: 6c 6c 20 61 70 70 65 61 72 20 69 6e 20 63 6f 72  ll appear in cor
1bb0: 72 65 63 74 20 6f 72 64 65 72 20 2a 2f 0a 23 64  rect order */.#d
1bc0: 65 66 69 6e 65 20 57 48 45 52 45 5f 52 45 56 45  efine WHERE_REVE
1bd0: 52 53 45 20 20 20 20 20 20 20 20 30 78 32 30 30  RSE        0x200
1be0: 30 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72  0   /* Scan in r
1bf0: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
1c00: 23 64 65 66 69 6e 65 20 57 48 45 52 45 5f 55 4e  #define WHERE_UN
1c10: 49 51 55 45 20 20 20 20 20 20 20 20 20 30 78 34  IQUE         0x4
1c20: 30 30 30 20 20 20 2f 2a 20 53 65 6c 65 63 74 73  000   /* Selects
1c30: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1c40: 65 20 72 6f 77 20 2a 2f 0a 23 64 65 66 69 6e 65  e row */.#define
1c50: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
1c60: 42 4c 45 20 20 20 30 78 38 30 30 30 20 20 20 2f  BLE   0x8000   /
1c70: 2a 20 55 73 65 20 76 69 72 74 75 61 6c 2d 74 61  * Use virtual-ta
1c80: 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ble processing *
1c90: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
1ca0: 69 7a 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  ize a preallocat
1cb0: 65 64 20 57 68 65 72 65 43 6c 61 75 73 65 20 73  ed WhereClause s
1cc0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
1cd0: 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c  tic void whereCl
1ce0: 61 75 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c  auseInit(WhereCl
1cf0: 61 75 73 65 20 2a 70 57 43 2c 20 50 61 72 73 65  ause *pWC, Parse
1d00: 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 57 43   *pParse){.  pWC
1d10: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
1d20: 65 3b 0a 20 20 70 57 43 2d 3e 6e 54 65 72 6d 20  e;.  pWC->nTerm 
1d30: 3d 20 30 3b 0a 20 20 70 57 43 2d 3e 6e 53 6c 6f  = 0;.  pWC->nSlo
1d40: 74 20 3d 20 41 52 52 41 59 53 49 5a 45 28 70 57  t = ARRAYSIZE(pW
1d50: 43 2d 3e 61 53 74 61 74 69 63 29 3b 0a 20 20 70  C->aStatic);.  p
1d60: 57 43 2d 3e 61 20 3d 20 70 57 43 2d 3e 61 53 74  WC->a = pWC->aSt
1d70: 61 74 69 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  atic;.}../*.** D
1d80: 65 61 6c 6c 6f 63 61 74 65 20 61 20 57 68 65 72  eallocate a Wher
1d90: 65 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72  eClause structur
1da0: 65 2e 20 20 54 68 65 20 57 68 65 72 65 43 6c 61  e.  The WhereCla
1db0: 75 73 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  use structure.**
1dc0: 20 69 74 73 65 6c 66 20 69 73 20 6e 6f 74 20 66   itself is not f
1dd0: 72 65 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  reed.  This rout
1de0: 69 6e 65 20 69 73 20 74 68 65 20 69 6e 76 65 72  ine is the inver
1df0: 73 65 20 6f 66 20 77 68 65 72 65 43 6c 61 75 73  se of whereClaus
1e00: 65 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  eInit()..*/.stat
1e10: 69 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61  ic void whereCla
1e20: 75 73 65 43 6c 65 61 72 28 57 68 65 72 65 43 6c  useClear(WhereCl
1e30: 61 75 73 65 20 2a 70 57 43 29 7b 0a 20 20 69 6e  ause *pWC){.  in
1e40: 74 20 69 3b 0a 20 20 57 68 65 72 65 54 65 72 6d  t i;.  WhereTerm
1e50: 20 2a 61 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43   *a;.  for(i=pWC
1e60: 2d 3e 6e 54 65 72 6d 2d 31 2c 20 61 3d 70 57 43  ->nTerm-1, a=pWC
1e70: 2d 3e 61 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20  ->a; i>=0; i--, 
1e80: 61 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d  a++){.    if( a-
1e90: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 44 59  >flags & TERM_DY
1ea0: 4e 41 4d 49 43 20 29 7b 0a 20 20 20 20 20 20 73  NAMIC ){.      s
1eb0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ec0: 28 61 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  (a->pExpr);.    
1ed0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 57 43 2d  }.  }.  if( pWC-
1ee0: 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  >a!=pWC->aStatic
1ef0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
1f00: 65 65 28 70 57 43 2d 3e 61 29 3b 0a 20 20 7d 0a  ee(pWC->a);.  }.
1f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
1f20: 65 77 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68  ew entries to th
1f30: 65 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74  e WhereClause st
1f40: 72 75 63 74 75 72 65 2e 20 20 49 6e 63 72 65 61  ructure.  Increa
1f50: 73 65 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  se the allocated
1f60: 0a 2a 2a 20 73 70 61 63 65 20 61 73 20 6e 65 63  .** space as nec
1f70: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 57 41  essary..**.** WA
1f80: 52 4e 49 4e 47 3a 20 20 54 68 69 73 20 72 6f 75  RNING:  This rou
1f90: 74 69 6e 65 20 6d 69 67 68 74 20 72 65 61 6c 6c  tine might reall
1fa0: 6f 63 61 74 65 20 74 68 65 20 73 70 61 63 65 20  ocate the space 
1fb0: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 2a 2a  used to store.**
1fc0: 20 57 68 65 72 65 54 65 72 6d 73 2e 20 20 41 6c   WhereTerms.  Al
1fd0: 6c 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 57 68  l pointers to Wh
1fe0: 65 72 65 54 65 72 6d 73 20 73 68 6f 75 6c 64 20  ereTerms should 
1ff0: 62 65 20 69 6e 76 61 6c 69 64 65 64 20 61 66 74  be invalided aft
2000: 65 72 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 74 68  er.** calling th
2010: 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 53 75 63  is routine.  Suc
2020: 68 20 70 6f 69 6e 74 65 72 73 20 6d 61 79 20 62  h pointers may b
2030: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 64 20  e reinitialized 
2040: 62 79 20 72 65 66 65 72 65 6e 63 69 6e 67 0a 2a  by referencing.*
2050: 2a 20 74 68 65 20 70 57 43 2d 3e 61 5b 5d 20 61  * the pWC->a[] a
2060: 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
2070: 69 6e 74 20 77 68 65 72 65 43 6c 61 75 73 65 49  int whereClauseI
2080: 6e 73 65 72 74 28 57 68 65 72 65 43 6c 61 75 73  nsert(WhereClaus
2090: 65 20 2a 70 57 43 2c 20 45 78 70 72 20 2a 70 2c  e *pWC, Expr *p,
20a0: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 57   int flags){.  W
20b0: 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b  hereTerm *pTerm;
20c0: 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
20d0: 28 20 70 57 43 2d 3e 6e 54 65 72 6d 3e 3d 70 57  ( pWC->nTerm>=pW
20e0: 43 2d 3e 6e 53 6c 6f 74 20 29 7b 0a 20 20 20 20  C->nSlot ){.    
20f0: 57 68 65 72 65 54 65 72 6d 20 2a 70 4f 6c 64 20  WhereTerm *pOld 
2100: 3d 20 70 57 43 2d 3e 61 3b 0a 20 20 20 20 70 57  = pWC->a;.    pW
2110: 43 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  C->a = sqliteMal
2120: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 57 43 2d  loc( sizeof(pWC-
2130: 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 53 6c 6f  >a[0])*pWC->nSlo
2140: 74 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70  t*2 );.    if( p
2150: 57 43 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72  WC->a==0 ) retur
2160: 6e 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  n 0;.    memcpy(
2170: 70 57 43 2d 3e 61 2c 20 70 4f 6c 64 2c 20 73 69  pWC->a, pOld, si
2180: 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d 29 2a  zeof(pWC->a[0])*
2190: 70 57 43 2d 3e 6e 54 65 72 6d 29 3b 0a 20 20 20  pWC->nTerm);.   
21a0: 20 69 66 28 20 70 4f 6c 64 21 3d 70 57 43 2d 3e   if( pOld!=pWC->
21b0: 61 53 74 61 74 69 63 20 29 7b 0a 20 20 20 20 20  aStatic ){.     
21c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 6c 64   sqliteFree(pOld
21d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57 43  );.    }.    pWC
21e0: 2d 3e 6e 53 6c 6f 74 20 2a 3d 20 32 3b 0a 20 20  ->nSlot *= 2;.  
21f0: 7d 0a 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43  }.  pTerm = &pWC
2200: 2d 3e 61 5b 69 64 78 20 3d 20 70 57 43 2d 3e 6e  ->a[idx = pWC->n
2210: 54 65 72 6d 5d 3b 0a 20 20 70 57 43 2d 3e 6e 54  Term];.  pWC->nT
2220: 65 72 6d 2b 2b 3b 0a 20 20 70 54 65 72 6d 2d 3e  erm++;.  pTerm->
2230: 70 45 78 70 72 20 3d 20 70 3b 0a 20 20 70 54 65  pExpr = p;.  pTe
2240: 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67  rm->flags = flag
2250: 73 3b 0a 20 20 70 54 65 72 6d 2d 3e 70 57 43 20  s;.  pTerm->pWC 
2260: 3d 20 70 57 43 3b 0a 20 20 70 54 65 72 6d 2d 3e  = pWC;.  pTerm->
2270: 69 50 61 72 65 6e 74 20 3d 20 2d 31 3b 0a 20 20  iParent = -1;.  
2280: 72 65 74 75 72 6e 20 69 64 78 3b 0a 7d 0a 0a 2f  return idx;.}../
2290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
22a0: 65 20 69 64 65 6e 74 69 66 69 65 73 20 73 75 62  e identifies sub
22b0: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
22c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
22d0: 77 68 65 72 65 0a 2a 2a 20 65 61 63 68 20 73 75  where.** each su
22e0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
22f0: 65 70 61 72 61 74 65 64 20 62 79 20 74 68 65 20  eparated by the 
2300: 41 4e 44 20 6f 70 65 72 61 74 6f 72 20 6f 72 20  AND operator or 
2310: 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 6f 70  some other.** op
2320: 65 72 61 74 6f 72 20 73 70 65 63 69 66 69 65 64  erator specified
2330: 20 69 6e 20 74 68 65 20 6f 70 20 70 61 72 61 6d   in the op param
2340: 65 74 65 72 2e 20 20 54 68 65 20 57 68 65 72 65  eter.  The Where
2350: 43 6c 61 75 73 65 20 73 74 72 75 63 74 75 72 65  Clause structure
2360: 0a 2a 2a 20 69 73 20 66 69 6c 6c 65 64 20 77 69  .** is filled wi
2370: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  th pointers to s
2380: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
2390: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
23a0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
23b0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
23c0: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
23d0: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
23e0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
23f0: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
2400: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
2410: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
2420: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
2430: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
2440: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
2450: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
2460: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
2470: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
2480: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
2490: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
24a0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
24b0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
24c0: 65 20 73 6c 6f 74 5b 5d 20 65 6e 74 72 69 65 73  e slot[] entries
24d0: 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74 72   point to substr
24e0: 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70 45  ucture within pE
24f0: 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  xpr..**.** In th
2500: 65 20 70 72 65 76 69 6f 75 73 20 73 65 6e 74 65  e previous sente
2510: 6e 63 65 20 61 6e 64 20 69 6e 20 74 68 65 20 64  nce and in the d
2520: 69 61 67 72 61 6d 2c 20 22 73 6c 6f 74 5b 5d 22  iagram, "slot[]"
2530: 20 72 65 66 65 72 73 20 74 6f 0a 2a 2a 20 74 68   refers to.** th
2540: 65 20 57 68 65 72 65 43 6c 61 75 73 65 2e 61 5b  e WhereClause.a[
2550: 5d 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 61  ] array.  This a
2560: 72 72 61 79 20 67 72 6f 77 73 20 61 73 20 6e 65  rray grows as ne
2570: 65 64 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 0a  eded to contain.
2580: 2a 2a 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20  ** all terms of 
2590: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
25a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
25b0: 20 77 68 65 72 65 53 70 6c 69 74 28 57 68 65 72   whereSplit(Wher
25c0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
25d0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 6f  pr *pExpr, int o
25e0: 70 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  p){.  if( pExpr=
25f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2600: 66 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 6f 70  f( pExpr->op!=op
2610: 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c 61   ){.    whereCla
2620: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
2630: 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  Expr, 0);.  }els
2640: 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69  e{.    whereSpli
2650: 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70 4c  t(pWC, pExpr->pL
2660: 65 66 74 2c 20 6f 70 29 3b 0a 20 20 20 20 77 68  eft, op);.    wh
2670: 65 72 65 53 70 6c 69 74 28 70 57 43 2c 20 70 45  ereSplit(pWC, pE
2680: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 29  xpr->pRight, op)
2690: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
26a0: 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70  nitialize an exp
26b0: 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74  ression mask set
26c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74  .*/.#define init
26d0: 4d 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73  MaskSet(P)  mems
26e0: 65 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(P, 0, sizeof(
26f0: 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  *P))../*.** Retu
2700: 72 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66  rn the bitmask f
2710: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  or the given cur
2720: 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  sor number.  Ret
2730: 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72  urn 0 if.** iCur
2740: 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  sor is not in th
2750: 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  e set..*/.static
2760: 20 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b   Bitmask getMask
2770: 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d  (ExprMaskSet *pM
2780: 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72  askSet, int iCur
2790: 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  sor){.  int i;. 
27a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73   for(i=0; i<pMas
27b0: 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20  kSet->n; i++){. 
27c0: 20 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d     if( pMaskSet-
27d0: 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20  >ix[i]==iCursor 
27e0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
27f0: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b  ((Bitmask)1)<<i;
2800: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2810: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
2820: 43 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73  Create a new mas
2830: 6b 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75  k for cursor iCu
2840: 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  rsor..**.** Ther
2850: 65 20 69 73 20 6f 6e 65 20 63 75 72 73 6f 72 20  e is one cursor 
2860: 70 65 72 20 74 61 62 6c 65 20 69 6e 20 74 68 65  per table in the
2870: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54   FROM clause.  T
2880: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
2890: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
28a0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
28b0: 69 74 65 64 20 62 79 20 61 20 74 65 73 74 20 65  ited by a test e
28c0: 61 72 6c 79 20 69 6e 20 74 68 65 0a 2a 2a 20 73  arly in the.** s
28d0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
28e0: 28 29 20 72 6f 75 74 69 6e 65 2e 20 20 53 6f 20  () routine.  So 
28f0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
2900: 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 5d 0a   pMaskSet->ix[].
2910: 2a 2a 20 61 72 72 61 79 20 77 69 6c 6c 20 6e 65  ** array will ne
2920: 76 65 72 20 6f 76 65 72 66 6c 6f 77 2e 0a 2a 2f  ver overflow..*/
2930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
2940: 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61 73 6b  ateMask(ExprMask
2950: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 69  Set *pMaskSet, i
2960: 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20 61  nt iCursor){.  a
2970: 73 73 65 72 74 28 20 70 4d 61 73 6b 53 65 74 2d  ssert( pMaskSet-
2980: 3e 6e 20 3c 20 41 52 52 41 59 53 49 5a 45 28 70  >n < ARRAYSIZE(p
2990: 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 3b 0a  MaskSet->ix) );.
29a0: 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70    pMaskSet->ix[p
29b0: 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20  MaskSet->n++] = 
29c0: 69 43 75 72 73 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  iCursor;.}../*.*
29d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
29e0: 61 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c  alks (recursivel
29f0: 79 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  y) an expression
2a00: 20 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61   tree and genera
2a10: 74 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b  tes.** a bitmask
2a20: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63   indicating whic
2a30: 68 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65  h tables are use
2a40: 64 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73  d in that expres
2a50: 73 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a  sion.** tree..**
2a60: 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72  .** In order for
2a70: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f   this routine to
2a80: 20 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69   work, the calli
2a90: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
2aa0: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
2ab0: 73 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69  sly invoked sqli
2ac0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
2ad0: 6d 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70  mes() on the exp
2ae0: 72 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a  ression.  See.**
2af0: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
2b00: 65 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74  ent on that rout
2b10: 69 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  ine for addition
2b20: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2b30: 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78  ** The sqlite3Ex
2b40: 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29  prResolveNames()
2b50: 20 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20   routines looks 
2b60: 66 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  for column names
2b70: 20 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65   and.** sets the
2b80: 69 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b  ir opcodes to TK
2b90: 5f 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69  _COLUMN and thei
2ba0: 72 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  r Expr.iTable fi
2bb0: 65 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56  elds to.** the V
2bc0: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
2bd0: 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  r of the table. 
2be0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75   This routine ju
2bf0: 73 74 20 68 61 73 20 74 6f 0a 2a 2a 20 74 72 61  st has to.** tra
2c00: 6e 73 6c 61 74 65 20 74 68 65 20 63 75 72 73 6f  nslate the curso
2c10: 72 20 6e 75 6d 62 65 72 73 20 69 6e 74 6f 20 62  r numbers into b
2c20: 69 74 6d 61 73 6b 20 76 61 6c 75 65 73 20 61 6e  itmask values an
2c30: 64 20 4f 52 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  d OR all.** the 
2c40: 62 69 74 6d 61 73 6b 73 20 74 6f 67 65 74 68 65  bitmasks togethe
2c50: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42 69 74  r..*/.static Bit
2c60: 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62  mask exprListTab
2c70: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
2c80: 53 65 74 2a 2c 20 45 78 70 72 4c 69 73 74 2a 29  Set*, ExprList*)
2c90: 3b 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  ;.static Bitmask
2ca0: 20 65 78 70 72 53 65 6c 65 63 74 54 61 62 6c 65   exprSelectTable
2cb0: 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65  Usage(ExprMaskSe
2cc0: 74 2a 2c 20 53 65 6c 65 63 74 2a 29 3b 0a 73 74  t*, Select*);.st
2cd0: 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70  atic Bitmask exp
2ce0: 72 54 61 62 6c 65 55 73 61 67 65 28 45 78 70 72  rTableUsage(Expr
2cf0: 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65  MaskSet *pMaskSe
2d00: 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 42  t, Expr *p){.  B
2d10: 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b  itmask mask = 0;
2d20: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2d30: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
2d40: 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29  >op==TK_COLUMN )
2d50: 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67 65 74  {.    mask = get
2d60: 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c 20 70  Mask(pMaskSet, p
2d70: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 72  ->iTable);.    r
2d80: 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a  eturn mask;.  }.
2d90: 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54 61 62    mask = exprTab
2da0: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2db0: 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  , p->pRight);.  
2dc0: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c  mask |= exprTabl
2dd0: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
2de0: 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 6d 61   p->pLeft);.  ma
2df0: 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61  sk |= exprListTa
2e00: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2e10: 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20  t, p->pList);.  
2e20: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 53 65 6c 65  mask |= exprSele
2e30: 63 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  ctTableUsage(pMa
2e40: 73 6b 53 65 74 2c 20 70 2d 3e 70 53 65 6c 65 63  skSet, p->pSelec
2e50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 61 73  t);.  return mas
2e60: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2e70: 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61 62 6c  ask exprListTabl
2e80: 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b 53  eUsage(ExprMaskS
2e90: 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78  et *pMaskSet, Ex
2ea0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a  prList *pList){.
2eb0: 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74 6d 61    int i;.  Bitma
2ec0: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
2ed0: 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
2ee0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
2ef0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
2f00: 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70       mask |= exp
2f10: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2f20: 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  kSet, pList->a[i
2f30: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a  ].pExpr);.    }.
2f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d 61 73    }.  return mas
2f50: 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69 74 6d  k;.}.static Bitm
2f60: 61 73 6b 20 65 78 70 72 53 65 6c 65 63 74 54 61  ask exprSelectTa
2f70: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
2f80: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2f90: 53 65 6c 65 63 74 20 2a 70 53 29 7b 0a 20 20 42  Select *pS){.  B
2fa0: 69 74 6d 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 69  itmask mask;.  i
2fb0: 66 28 20 70 53 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pS==0 ){.    
2fc0: 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  mask = 0;.  }els
2fd0: 65 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 65 78  e{.    mask = ex
2fe0: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
2ff0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70  (pMaskSet, pS->p
3000: 45 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b  EList);.    mask
3010: 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c   |= exprListTabl
3020: 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c  eUsage(pMaskSet,
3030: 20 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a   pS->pGroupBy);.
3040: 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72      mask |= expr
3050: 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70  ListTableUsage(p
3060: 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72  MaskSet, pS->pOr
3070: 64 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b  derBy);.    mask
3080: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
3090: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d  ge(pMaskSet, pS-
30a0: 3e 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61  >pWhere);.    ma
30b0: 73 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55  sk |= exprTableU
30c0: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
30d0: 53 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d  S->pHaving);.  }
30e0: 0a 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a  .  return mask;.
30f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3100: 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65  TRUE if the give
3110: 6e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e  n operator is on
3120: 65 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f  e of the operato
3130: 72 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c  rs that is.** al
3140: 6c 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64  lowed for an ind
3150: 65 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61  exable WHERE cla
3160: 75 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61  use term.  The a
3170: 6c 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73  llowed operators
3180: 20 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22   are.** "=", "<"
3190: 2c 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d  , ">", "<=", ">=
31a0: 22 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a  ", and "IN"..*/.
31b0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77  static int allow
31c0: 65 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20  edOp(int op){.  
31d0: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
31e0: 5f 45 51 20 26 26 20 54 4b 5f 47 54 3c 54 4b 5f  _EQ && TK_GT<TK_
31f0: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3200: 54 4b 5f 4c 54 3e 54 4b 5f 45 51 20 26 26 20 54  TK_LT>TK_EQ && T
3210: 4b 5f 4c 54 3c 54 4b 5f 47 45 20 29 3b 0a 20 20  K_LT<TK_GE );.  
3220: 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3e 54 4b  assert( TK_LE>TK
3230: 5f 45 51 20 26 26 20 54 4b 5f 4c 45 3c 54 4b 5f  _EQ && TK_LE<TK_
3240: 47 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  GE );.  assert( 
3250: 54 4b 5f 47 45 3d 3d 54 4b 5f 45 51 2b 34 20 29  TK_GE==TK_EQ+4 )
3260: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d 3d 54  ;.  return op==T
3270: 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f  K_IN || (op>=TK_
3280: 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47 45 29  EQ && op<=TK_GE)
3290: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20  ;.}../*.** Swap 
32a0: 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66 20 74  two objects of t
32b0: 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ype T..*/.#defin
32c0: 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c 42 29  e SWAP(TYPE,A,B)
32d0: 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d 42 3b   {TYPE t=A; A=B;
32e0: 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   B=t;}../*.** Co
32f0: 6d 6d 75 74 65 20 61 20 63 6f 6d 70 61 72 69 73  mmute a comparis
3300: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 45  ion operator.  E
3310: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74 68  xpressions of th
3320: 65 20 66 6f 72 6d 20 22 58 20 6f 70 20 59 22 0a  e form "X op Y".
3330: 2a 2a 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ** are converted
3340: 20 69 6e 74 6f 20 22 59 20 6f 70 20 58 22 2e 0a   into "Y op X"..
3350: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
3360: 78 70 72 43 6f 6d 6d 75 74 65 28 45 78 70 72 20  xprCommute(Expr 
3370: 2a 70 45 78 70 72 29 7b 0a 20 20 61 73 73 65 72  *pExpr){.  asser
3380: 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70 45 78  t( allowedOp(pEx
3390: 70 72 2d 3e 6f 70 29 20 26 26 20 70 45 78 70 72  pr->op) && pExpr
33a0: 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op!=TK_IN );. 
33b0: 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70   SWAP(CollSeq*,p
33c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43  Expr->pRight->pC
33d0: 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  oll,pExpr->pLeft
33e0: 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 53 57 41 50  ->pColl);.  SWAP
33f0: 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52  (Expr*,pExpr->pR
3400: 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66  ight,pExpr->pLef
3410: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
3420: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b 0a 20 20  >op>=TK_GT ){.  
3430: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d    assert( TK_LT=
3440: 3d 54 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20  =TK_GT+2 );.    
3450: 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54  assert( TK_GE==T
3460: 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20 61 73  K_LE+2 );.    as
3470: 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45  sert( TK_GT>TK_E
3480: 51 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Q );.    assert(
3490: 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20 29 3b 0a   TK_GT<TK_LE );.
34a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
34b0: 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20  r->op>=TK_GT && 
34c0: 70 45 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45  pExpr->op<=TK_GE
34d0: 20 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f   );.    pExpr->o
34e0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d  p = ((pExpr->op-
34f0: 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b  TK_GT)^2)+TK_GT;
3500: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  .  }.}../*.** Tr
3510: 61 6e 73 6c 61 74 65 20 66 72 6f 6d 20 54 4b 5f  anslate from TK_
3520: 78 78 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 57  xx operator to W
3530: 4f 5f 78 78 20 62 69 74 6d 61 73 6b 2e 0a 2a 2f  O_xx bitmask..*/
3540: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 72  .static int oper
3550: 61 74 6f 72 4d 61 73 6b 28 69 6e 74 20 6f 70 29  atorMask(int op)
3560: 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 61 73 73  {.  int c;.  ass
3570: 65 72 74 28 20 61 6c 6c 6f 77 65 64 4f 70 28 6f  ert( allowedOp(o
3580: 70 29 20 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  p) );.  if( op==
3590: 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 63 20 3d  TK_IN ){.    c =
35a0: 20 57 4f 5f 49 4e 3b 0a 20 20 7d 65 6c 73 65 7b   WO_IN;.  }else{
35b0: 0a 20 20 20 20 63 20 3d 20 57 4f 5f 45 51 3c 3c  .    c = WO_EQ<<
35c0: 28 6f 70 2d 54 4b 5f 45 51 29 3b 0a 20 20 7d 0a  (op-TK_EQ);.  }.
35d0: 20 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b    assert( op!=TK
35e0: 5f 49 4e 20 7c 7c 20 63 3d 3d 57 4f 5f 49 4e 20  _IN || c==WO_IN 
35f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70 21  );.  assert( op!
3600: 3d 54 4b 5f 45 51 20 7c 7c 20 63 3d 3d 57 4f 5f  =TK_EQ || c==WO_
3610: 45 51 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EQ );.  assert( 
3620: 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 63 3d 3d  op!=TK_LT || c==
3630: 57 4f 5f 4c 54 20 29 3b 0a 20 20 61 73 73 65 72  WO_LT );.  asser
3640: 74 28 20 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20  t( op!=TK_LE || 
3650: 63 3d 3d 57 4f 5f 4c 45 20 29 3b 0a 20 20 61 73  c==WO_LE );.  as
3660: 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f 47 54 20  sert( op!=TK_GT 
3670: 7c 7c 20 63 3d 3d 57 4f 5f 47 54 20 29 3b 0a 20  || c==WO_GT );. 
3680: 20 61 73 73 65 72 74 28 20 6f 70 21 3d 54 4b 5f   assert( op!=TK_
3690: 47 45 20 7c 7c 20 63 3d 3d 57 4f 5f 47 45 20 29  GE || c==WO_GE )
36a0: 3b 0a 20 20 72 65 74 75 72 6e 20 63 3b 0a 7d 0a  ;.  return c;.}.
36b0: 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f  ./*.** Search fo
36c0: 72 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  r a term in the 
36d0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
36e0: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
36f0: 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 22   "X <op> <expr>"
3700: 0a 2a 2a 20 77 68 65 72 65 20 58 20 69 73 20 61  .** where X is a
3710: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
3720: 65 20 69 43 6f 6c 75 6d 6e 20 6f 66 20 74 61 62  e iColumn of tab
3730: 6c 65 20 69 43 75 72 20 61 6e 64 20 3c 6f 70 3e  le iCur and <op>
3740: 20 69 73 20 6f 6e 65 20 6f 66 0a 2a 2a 20 74 68   is one of.** th
3750: 65 20 57 4f 5f 78 78 20 6f 70 65 72 61 74 6f 72  e WO_xx operator
3760: 20 63 6f 64 65 73 20 73 70 65 63 69 66 69 65 64   codes specified
3770: 20 62 79 20 74 68 65 20 6f 70 20 70 61 72 61 6d   by the op param
3780: 65 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  eter..** Return 
3790: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
37a0: 20 74 65 72 6d 2e 20 20 52 65 74 75 72 6e 20 30   term.  Return 0
37b0: 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
37c0: 2f 0a 73 74 61 74 69 63 20 57 68 65 72 65 54 65  /.static WhereTe
37d0: 72 6d 20 2a 66 69 6e 64 54 65 72 6d 28 0a 20 20  rm *findTerm(.  
37e0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
37f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
3800: 52 45 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20  RE clause to be 
3810: 73 65 61 72 63 68 65 64 20 2a 2f 0a 20 20 69 6e  searched */.  in
3820: 74 20 69 43 75 72 2c 20 20 20 20 20 20 20 20 20  t iCur,         
3830: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75      /* Cursor nu
3840: 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a 2f 0a 20  mber of LHS */. 
3850: 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 2c 20 20 20   int iColumn,   
3860: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
3870: 20 6e 75 6d 62 65 72 20 6f 66 20 4c 48 53 20 2a   number of LHS *
3880: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
3890: 65 61 64 79 2c 20 20 20 20 20 2f 2a 20 52 48 53  eady,     /* RHS
38a0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
38b0: 70 20 77 69 74 68 20 74 68 69 73 20 6d 61 73 6b  p with this mask
38c0: 20 2a 2f 0a 20 20 75 31 36 20 6f 70 2c 20 20 20   */.  u16 op,   
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
38e0: 61 73 6b 20 6f 66 20 57 4f 5f 78 78 20 76 61 6c  ask of WO_xx val
38f0: 75 65 73 20 64 65 73 63 72 69 62 69 6e 67 20 6f  ues describing o
3900: 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 49 6e 64  perator */.  Ind
3910: 65 78 20 2a 70 49 64 78 20 20 20 20 20 20 20 20  ex *pIdx        
3920: 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20 63 6f     /* Must be co
3930: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 74 68  mpatible with th
3940: 69 73 20 69 6e 64 65 78 2c 20 69 66 20 6e 6f 74  is index, if not
3950: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 57 68   NULL */.){.  Wh
3960: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a  ereTerm *pTerm;.
3970: 20 20 69 6e 74 20 6b 3b 0a 20 20 66 6f 72 28 70    int k;.  for(p
3980: 54 65 72 6d 3d 70 57 43 2d 3e 61 2c 20 6b 3d 70  Term=pWC->a, k=p
3990: 57 43 2d 3e 6e 54 65 72 6d 3b 20 6b 3b 20 6b 2d  WC->nTerm; k; k-
39a0: 2d 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  -, pTerm++){.   
39b0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74   if( pTerm->left
39c0: 43 75 72 73 6f 72 3d 3d 69 43 75 72 0a 20 20 20  Cursor==iCur.   
39d0: 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70      && (pTerm->p
39e0: 72 65 72 65 71 52 69 67 68 74 20 26 20 6e 6f 74  rereqRight & not
39f0: 52 65 61 64 79 29 3d 3d 30 0a 20 20 20 20 20 20  Ready)==0.      
3a00: 20 26 26 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43   && pTerm->leftC
3a10: 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 0a 20  olumn==iColumn. 
3a20: 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d 2d        && (pTerm-
3a30: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 6f 70 29  >eOperator & op)
3a40: 21 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  !=0.    ){.     
3a50: 20 69 66 28 20 69 43 75 72 3e 3d 30 20 26 26 20   if( iCur>=0 && 
3a60: 70 49 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20  pIdx ){.        
3a70: 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d  Expr *pX = pTerm
3a80: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
3a90: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
3aa0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64  .        char id
3ab0: 78 61 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e  xaff;.        in
3ac0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 50 61 72  t j;.        Par
3ad0: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 57 43  se *pParse = pWC
3ae0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 20 20 20  ->pParse;..     
3af0: 20 20 20 69 64 78 61 66 66 20 3d 20 70 49 64 78     idxaff = pIdx
3b00: 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69  ->pTable->aCol[i
3b10: 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79  Column].affinity
3b20: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
3b30: 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e  qlite3IndexAffin
3b40: 69 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66  ityOk(pX, idxaff
3b50: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
3b60: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
3b70: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
3b80: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65  (pParse, pX->pLe
3b90: 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ft);.        if(
3ba0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
3bb0: 20 20 20 20 20 69 66 28 20 70 58 2d 3e 70 52 69       if( pX->pRi
3bc0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ght ){.         
3bd0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
3be0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
3bf0: 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74  arse, pX->pRight
3c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
3c10: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43           if( !pC
3c20: 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  oll ){.         
3c30: 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73     pColl = pPars
3c40: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
3c50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
3c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
3c70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  for(j=0; j<pIdx-
3c80: 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78  >nColumn && pIdx
3c90: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 21 3d 69  ->aiColumn[j]!=i
3ca0: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 7d 0a 20  Column; j++){}. 
3cb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a         assert( j
3cc0: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 29  <pIdx->nColumn )
3cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
3ce0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
3cf0: 6c 6c 2d 3e 7a 4e 61 6d 65 2c 20 70 49 64 78 2d  ll->zName, pIdx-
3d00: 3e 61 7a 43 6f 6c 6c 5b 6a 5d 29 20 29 20 63 6f  >azColl[j]) ) co
3d10: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
3d20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 54 65        return pTe
3d30: 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rm;.    }.  }.  
3d40: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
3d50: 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63  Forward referenc
3d60: 65 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e */.static void
3d70: 20 65 78 70 72 41 6e 61 6c 79 7a 65 28 53 72 63   exprAnalyze(Src
3d80: 4c 69 73 74 2a 2c 20 45 78 70 72 4d 61 73 6b 53  List*, ExprMaskS
3d90: 65 74 2a 2c 20 57 68 65 72 65 43 6c 61 75 73 65  et*, WhereClause
3da0: 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20  *, int);../*.** 
3db0: 43 61 6c 6c 20 65 78 70 72 41 6e 61 6c 79 7a 65  Call exprAnalyze
3dc0: 20 6f 6e 20 61 6c 6c 20 74 65 72 6d 73 20 69 6e   on all terms in
3dd0: 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e   a WHERE clause.
3de0: 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74    .**.**.*/.stat
3df0: 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61 6c  ic void exprAnal
3e00: 79 7a 65 41 6c 6c 28 0a 20 20 53 72 63 4c 69 73  yzeAll(.  SrcLis
3e10: 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20  t *pTabList,    
3e20: 20 20 20 2f 2a 20 74 68 65 20 46 52 4f 4d 20 63     /* the FROM c
3e30: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d  lause */.  ExprM
3e40: 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74  askSet *pMaskSet
3e50: 2c 20 20 20 2f 2a 20 74 61 62 6c 65 20 6d 61 73  ,   /* table mas
3e60: 6b 73 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61  ks */.  WhereCla
3e70: 75 73 65 20 2a 70 57 43 20 20 20 20 20 20 20 20  use *pWC        
3e80: 20 2f 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c   /* the WHERE cl
3e90: 61 75 73 65 20 74 6f 20 62 65 20 61 6e 61 6c 79  ause to be analy
3ea0: 7a 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  zed */.){.  int 
3eb0: 69 3b 0a 20 20 66 6f 72 28 69 3d 70 57 43 2d 3e  i;.  for(i=pWC->
3ec0: 6e 54 65 72 6d 2d 31 3b 20 69 3e 3d 30 3b 20 69  nTerm-1; i>=0; i
3ed0: 2d 2d 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61  --){.    exprAna
3ee0: 6c 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 70  lyze(pTabList, p
3ef0: 4d 61 73 6b 53 65 74 2c 20 70 57 43 2c 20 69 29  MaskSet, pWC, i)
3f00: 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
3f10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49 4b   SQLITE_OMIT_LIK
3f20: 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 0a 2f  E_OPTIMIZATION./
3f30: 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65  *.** Check to se
3f40: 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 65  e if the given e
3f50: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 4c  xpression is a L
3f60: 49 4b 45 20 6f 72 20 47 4c 4f 42 20 6f 70 65 72  IKE or GLOB oper
3f70: 61 74 6f 72 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ator that.** can
3f80: 20 62 65 20 6f 70 74 69 6d 69 7a 65 64 20 75 73   be optimized us
3f90: 69 6e 67 20 69 6e 65 71 75 61 6c 69 74 79 20 63  ing inequality c
3fa0: 6f 6e 73 74 72 61 69 6e 74 73 2e 20 20 52 65 74  onstraints.  Ret
3fb0: 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69  urn TRUE if it i
3fc0: 73 0a 2a 2a 20 73 6f 20 61 6e 64 20 66 61 6c 73  s.** so and fals
3fd0: 65 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  e if not..**.** 
3fe0: 49 6e 20 6f 72 64 65 72 20 66 6f 72 20 74 68 65  In order for the
3ff0: 20 6f 70 65 72 61 74 6f 72 20 74 6f 20 62 65 20   operator to be 
4000: 6f 70 74 69 6d 69 7a 69 62 6c 65 2c 20 74 68 65  optimizible, the
4010: 20 52 48 53 20 6d 75 73 74 20 62 65 20 61 20 73   RHS must be a s
4020: 74 72 69 6e 67 0a 2a 2a 20 6c 69 74 65 72 61 6c  tring.** literal
4030: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 62   that does not b
4040: 65 67 69 6e 20 77 69 74 68 20 61 20 77 69 6c 64  egin with a wild
4050: 63 61 72 64 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  card.  .*/.stati
4060: 63 20 69 6e 74 20 69 73 4c 69 6b 65 4f 72 47 6c  c int isLikeOrGl
4070: 6f 62 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ob(.  sqlite3 *d
4080: 62 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64  b,      /* The d
4090: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 45 78 70  atabase */.  Exp
40a0: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 2f  r *pExpr,      /
40b0: 2a 20 54 65 73 74 20 74 68 69 73 20 65 78 70 72  * Test this expr
40c0: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ession */.  int 
40d0: 2a 70 6e 50 61 74 74 65 72 6e 2c 20 20 20 2f 2a  *pnPattern,   /*
40e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 77   Number of non-w
40f0: 69 6c 64 63 61 72 64 20 70 72 65 66 69 78 20 63  ildcard prefix c
4100: 68 61 72 61 63 74 65 72 73 20 2a 2f 0a 20 20 69  haracters */.  i
4110: 6e 74 20 2a 70 69 73 43 6f 6d 70 6c 65 74 65 20  nt *pisComplete 
4120: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
4130: 6f 6e 6c 79 20 77 69 6c 64 63 61 72 64 20 69 73  only wildcard is
4140: 20 25 20 69 6e 20 74 68 65 20 6c 61 73 74 20 63   % in the last c
4150: 68 61 72 61 63 74 65 72 20 2a 2f 0a 29 7b 0a 20  haracter */.){. 
4160: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
4170: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
4180: 2a 70 4c 65 66 74 3b 0a 20 20 45 78 70 72 4c 69  *pLeft;.  ExprLi
4190: 73 74 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  st *pList;.  int
41a0: 20 63 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 6e   c, cnt;.  int n
41b0: 6f 43 61 73 65 3b 0a 20 20 63 68 61 72 20 77 63  oCase;.  char wc
41c0: 5b 33 5d 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  [3];.  CollSeq *
41d0: 70 43 6f 6c 6c 3b 0a 0a 20 20 69 66 28 20 21 73  pColl;..  if( !s
41e0: 71 6c 69 74 65 33 49 73 4c 69 6b 65 46 75 6e 63  qlite3IsLikeFunc
41f0: 74 69 6f 6e 28 64 62 2c 20 70 45 78 70 72 2c 20  tion(db, pExpr, 
4200: 26 6e 6f 43 61 73 65 2c 20 77 63 29 20 29 7b 0a  &noCase, wc) ){.
4210: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4220: 7d 0a 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70  }.  pList = pExp
4230: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 70 52 69 67  r->pList;.  pRig
4240: 68 74 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 30 5d  ht = pList->a[0]
4250: 2e 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70 52  .pExpr;.  if( pR
4260: 69 67 68 74 2d 3e 6f 70 21 3d 54 4b 5f 53 54 52  ight->op!=TK_STR
4270: 49 4e 47 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ING ){.    retur
4280: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 66 74  n 0;.  }.  pLeft
4290: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70   = pList->a[1].p
42a0: 45 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 66  Expr;.  if( pLef
42b0: 74 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op!=TK_COLUMN
42c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
42d0: 3b 0a 20 20 7d 0a 20 20 70 43 6f 6c 6c 20 3d 20  ;.  }.  pColl = 
42e0: 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 20 20  pLeft->pColl;.  
42f0: 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 7b 0a  if( pColl==0 ){.
4300: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e      pColl = db->
4310: 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 7d 0a 20  pDfltColl;.  }. 
4320: 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 74 79 70   if( (pColl->typ
4330: 65 21 3d 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42  e!=SQLITE_COLL_B
4340: 49 4e 41 52 59 20 7c 7c 20 6e 6f 43 61 73 65 29  INARY || noCase)
4350: 20 26 26 0a 20 20 20 20 20 20 28 70 43 6f 6c 6c   &&.      (pColl
4360: 2d 3e 74 79 70 65 21 3d 53 51 4c 49 54 45 5f 43  ->type!=SQLITE_C
4370: 4f 4c 4c 5f 4e 4f 43 41 53 45 20 7c 7c 20 21 6e  OLL_NOCASE || !n
4380: 6f 43 61 73 65 29 20 29 7b 0a 20 20 20 20 72 65  oCase) ){.    re
4390: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
43a0: 6c 69 74 65 33 44 65 71 75 6f 74 65 45 78 70 72  lite3DequoteExpr
43b0: 28 70 52 69 67 68 74 29 3b 0a 20 20 7a 20 3d 20  (pRight);.  z = 
43c0: 28 63 68 61 72 20 2a 29 70 52 69 67 68 74 2d 3e  (char *)pRight->
43d0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 66 6f 72 28 63  token.z;.  for(c
43e0: 6e 74 3d 30 3b 20 28 63 3d 7a 5b 63 6e 74 5d 29  nt=0; (c=z[cnt])
43f0: 21 3d 30 20 26 26 20 63 21 3d 77 63 5b 30 5d 20  !=0 && c!=wc[0] 
4400: 26 26 20 63 21 3d 77 63 5b 31 5d 20 26 26 20 63  && c!=wc[1] && c
4410: 21 3d 77 63 5b 32 5d 3b 20 63 6e 74 2b 2b 29 7b  !=wc[2]; cnt++){
4420: 7d 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 7c  }.  if( cnt==0 |
4430: 7c 20 32 35 35 3d 3d 28 75 38 29 7a 5b 63 6e 74  | 255==(u8)z[cnt
4440: 5d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ] ){.    return 
4450: 30 3b 0a 20 20 7d 0a 20 20 2a 70 69 73 43 6f 6d  0;.  }.  *pisCom
4460: 70 6c 65 74 65 20 3d 20 7a 5b 63 6e 74 5d 3d 3d  plete = z[cnt]==
4470: 77 63 5b 30 5d 20 26 26 20 7a 5b 63 6e 74 2b 31  wc[0] && z[cnt+1
4480: 5d 3d 3d 30 3b 0a 20 20 2a 70 6e 50 61 74 74 65  ]==0;.  *pnPatte
4490: 72 6e 20 3d 20 63 6e 74 3b 0a 20 20 72 65 74 75  rn = cnt;.  retu
44a0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
44b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 49  * SQLITE_OMIT_LI
44c0: 4b 45 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  KE_OPTIMIZATION 
44d0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  */../*.** Check 
44e0: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 67 69  to see if the gi
44f0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ven expression i
4500: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a 2a  s of the form.**
4510: 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75  .**         colu
4520: 6d 6e 20 4d 41 54 43 48 20 65 78 70 72 0a 2a 2a  mn MATCH expr.**
4530: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 74 68 65  .** If it is the
4540: 6e 20 72 65 74 75 72 6e 20 54 52 55 45 2e 20 20  n return TRUE.  
4550: 49 66 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 46  If not, return F
4560: 41 4c 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ALSE..*/.static 
4570: 69 6e 74 20 69 73 4d 61 74 63 68 4f 66 43 6f 6c  int isMatchOfCol
4580: 75 6d 6e 28 0a 20 20 45 78 70 72 20 2a 70 45 78  umn(.  Expr *pEx
4590: 70 72 20 20 20 20 20 20 2f 2a 20 54 65 73 74 20  pr      /* Test 
45a0: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
45b0: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73 74  */.){.  ExprList
45c0: 20 2a 70 4c 69 73 74 3b 0a 0a 20 20 69 66 28 20   *pList;..  if( 
45d0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 46 55  pExpr->op!=TK_FU
45e0: 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20 20 72 65  NCTION ){.    re
45f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
4600: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
4610: 21 3d 35 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  !=5 || sqlite3St
4620: 72 4e 49 43 6d 70 28 70 45 78 70 72 2d 3e 74 6f  rNICmp(pExpr->to
4630: 6b 65 6e 2e 7a 2c 22 6d 61 74 63 68 22 2c 35 29  ken.z,"match",5)
4640: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
4650: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 69 73 74  n 0;.  }.  pList
4660: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
4670: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  .  if( pList->nE
4680: 78 70 72 21 3d 32 20 29 7b 0a 20 20 20 20 72 65  xpr!=2 ){.    re
4690: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
46a0: 28 20 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ( pList->a[1].pE
46b0: 78 70 72 2d 3e 6f 70 20 21 3d 20 54 4b 5f 43 4f  xpr->op != TK_CO
46c0: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 72 65 74 75  LUMN ){.    retu
46d0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
46e0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 1;.}../*.** I
46f0: 66 20 74 68 65 20 70 42 61 73 65 20 65 78 70 72  f the pBase expr
4700: 65 73 73 69 6f 6e 20 6f 72 69 67 69 6e 61 74 65  ession originate
4710: 64 20 69 6e 20 74 68 65 20 4f 4e 20 6f 72 20 55  d in the ON or U
4720: 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 0a 2a  SING clause of.*
4730: 2a 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74  * a join, then t
4740: 72 61 6e 73 66 65 72 20 74 68 65 20 61 70 70 72  ransfer the appr
4750: 6f 70 72 69 61 74 65 20 6d 61 72 6b 69 6e 67 73  opriate markings
4760: 20 6f 76 65 72 20 74 6f 20 64 65 72 69 76 65 64   over to derived
4770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4780: 20 74 72 61 6e 73 66 65 72 4a 6f 69 6e 4d 61 72   transferJoinMar
4790: 6b 69 6e 67 73 28 45 78 70 72 20 2a 70 44 65 72  kings(Expr *pDer
47a0: 69 76 65 64 2c 20 45 78 70 72 20 2a 70 42 61 73  ived, Expr *pBas
47b0: 65 29 7b 0a 20 20 70 44 65 72 69 76 65 64 2d 3e  e){.  pDerived->
47c0: 66 6c 61 67 73 20 7c 3d 20 70 42 61 73 65 2d 3e  flags |= pBase->
47d0: 66 6c 61 67 73 20 26 20 45 50 5f 46 72 6f 6d 4a  flags & EP_FromJ
47e0: 6f 69 6e 3b 0a 20 20 70 44 65 72 69 76 65 64 2d  oin;.  pDerived-
47f0: 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c 65  >iRightJoinTable
4800: 20 3d 20 70 42 61 73 65 2d 3e 69 52 69 67 68 74   = pBase->iRight
4810: 4a 6f 69 6e 54 61 62 6c 65 3b 0a 7d 0a 0a 0a 2f  JoinTable;.}.../
4820: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
4830: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
4840: 73 20 61 6e 20 57 68 65 72 65 54 65 72 6d 20 73  s an WhereTerm s
4850: 74 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e  tructure with on
4860: 6c 79 20 74 68 65 0a 2a 2a 20 22 70 45 78 70 72  ly the.** "pExpr
4870: 22 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69  " field filled i
4880: 6e 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74  n.  The job of t
4890: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
48a0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a  o analyze the.**
48b0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61   subexpression a
48c0: 6e 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20  nd populate all 
48d0: 74 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73  the other fields
48e0: 20 6f 66 20 74 68 65 20 57 68 65 72 65 54 65 72   of the WhereTer
48f0: 6d 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a  m.** structure..
4900: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
4910: 72 65 73 73 69 6f 6e 20 69 73 20 6f 66 20 74 68  ression is of th
4920: 65 20 66 6f 72 6d 20 22 3c 65 78 70 72 3e 20 3c  e form "<expr> <
4930: 6f 70 3e 20 58 22 20 69 74 20 67 65 74 73 20 63  op> X" it gets c
4940: 6f 6d 6d 75 74 65 64 0a 2a 2a 20 74 6f 20 74 68  ommuted.** to th
4950: 65 20 73 74 61 6e 64 61 72 64 20 66 6f 72 6d 20  e standard form 
4960: 6f 66 20 22 58 20 3c 6f 70 3e 20 3c 65 78 70 72  of "X <op> <expr
4970: 3e 22 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  >".  If the expr
4980: 65 73 73 69 6f 6e 20 69 73 20 6f 66 0a 2a 2a 20  ession is of.** 
4990: 74 68 65 20 66 6f 72 6d 20 22 58 20 3c 6f 70 3e  the form "X <op>
49a0: 20 59 22 20 77 68 65 72 65 20 62 6f 74 68 20 58   Y" where both X
49b0: 20 61 6e 64 20 59 20 61 72 65 20 63 6f 6c 75 6d   and Y are colum
49c0: 6e 73 2c 20 74 68 65 6e 20 74 68 65 20 6f 72 69  ns, then the ori
49d0: 67 69 6e 61 6c 0a 2a 2a 20 65 78 70 72 65 73 73  ginal.** express
49e0: 69 6f 6e 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ion is unchanged
49f0: 20 61 6e 64 20 61 20 6e 65 77 20 76 69 72 74 75   and a new virtu
4a00: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  al expression of
4a10: 20 74 68 65 20 66 6f 72 6d 0a 2a 2a 20 22 59 20   the form.** "Y 
4a20: 3c 6f 70 3e 20 58 22 20 69 73 20 61 64 64 65 64  <op> X" is added
4a30: 20 74 6f 20 74 68 65 20 57 48 45 52 45 20 63 6c   to the WHERE cl
4a40: 61 75 73 65 20 61 6e 64 20 61 6e 61 6c 79 7a 65  ause and analyze
4a50: 64 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f  d separately..*/
4a60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
4a70: 72 41 6e 61 6c 79 7a 65 28 0a 20 20 53 72 63 4c  rAnalyze(.  SrcL
4a80: 69 73 74 20 2a 70 53 72 63 2c 20 20 20 20 20 20  ist *pSrc,      
4a90: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 46 52 4f        /* the FRO
4aa0: 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  M clause */.  Ex
4ab0: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
4ac0: 53 65 74 2c 20 20 20 20 2f 2a 20 74 61 62 6c 65  Set,    /* table
4ad0: 20 6d 61 73 6b 73 20 2a 2f 0a 20 20 57 68 65 72   masks */.  Wher
4ae0: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20  eClause *pWC,   
4af0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 57 48 45        /* the WHE
4b00: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  RE clause */.  i
4b10: 6e 74 20 69 64 78 54 65 72 6d 20 20 20 20 20 20  nt idxTerm      
4b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
4b30: 78 20 6f 66 20 74 68 65 20 74 65 72 6d 20 74 6f  x of the term to
4b40: 20 62 65 20 61 6e 61 6c 79 7a 65 64 20 2a 2f 0a   be analyzed */.
4b50: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
4b60: 70 54 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b  pTerm = &pWC->a[
4b70: 69 64 78 54 65 72 6d 5d 3b 0a 20 20 45 78 70 72  idxTerm];.  Expr
4b80: 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d   *pExpr = pTerm-
4b90: 3e 70 45 78 70 72 3b 0a 20 20 42 69 74 6d 61 73  >pExpr;.  Bitmas
4ba0: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20  k prereqLeft;.  
4bb0: 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 41 6c  Bitmask prereqAl
4bc0: 6c 3b 0a 20 20 69 6e 74 20 6e 50 61 74 74 65 72  l;.  int nPatter
4bd0: 6e 3b 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6c  n;.  int isCompl
4be0: 65 74 65 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  ete;..  if( sqli
4bf0: 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65 64 28  te3MallocFailed(
4c00: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 72  ) ) return;.  pr
4c10: 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54  ereqLeft = exprT
4c20: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
4c30: 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  et, pExpr->pLeft
4c40: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
4c50: 6f 70 3d 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20  op==TK_IN ){.   
4c60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
4c70: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
4c80: 20 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69   pTerm->prereqRi
4c90: 67 68 74 20 3d 20 65 78 70 72 4c 69 73 74 54 61  ght = exprListTa
4ca0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4cb0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  t, pExpr->pList)
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4cd0: 20 20 20 20 20 20 20 20 20 20 20 7c 20 65 78 70             | exp
4ce0: 72 53 65 6c 65 63 74 54 61 62 6c 65 55 73 61 67  rSelectTableUsag
4cf0: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70  e(pMaskSet, pExp
4d00: 72 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d  r->pSelect);.  }
4d10: 65 6c 73 65 7b 0a 20 20 20 20 70 54 65 72 6d 2d  else{.    pTerm-
4d20: 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20 65  >prereqRight = e
4d30: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
4d40: 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70  askSet, pExpr->p
4d50: 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 70 72  Right);.  }.  pr
4d60: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
4d70: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
4d80: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66 28  t, pExpr);.  if(
4d90: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4da0: 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a  (pExpr, EP_FromJ
4db0: 6f 69 6e 29 20 29 7b 0a 20 20 20 20 70 72 65 72  oin) ){.    prer
4dc0: 65 71 41 6c 6c 20 7c 3d 20 67 65 74 4d 61 73 6b  eqAll |= getMask
4dd0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72  (pMaskSet, pExpr
4de0: 2d 3e 69 52 69 67 68 74 4a 6f 69 6e 54 61 62 6c  ->iRightJoinTabl
4df0: 65 29 3b 0a 20 20 7d 0a 20 20 70 54 65 72 6d 2d  e);.  }.  pTerm-
4e00: 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72 65  >prereqAll = pre
4e10: 72 65 71 41 6c 6c 3b 0a 20 20 70 54 65 72 6d 2d  reqAll;.  pTerm-
4e20: 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 2d 31  >leftCursor = -1
4e30: 3b 0a 20 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  ;.  pTerm->iPare
4e40: 6e 74 20 3d 20 2d 31 3b 0a 20 20 70 54 65 72 6d  nt = -1;.  pTerm
4e50: 2d 3e 65 4f 70 65 72 61 74 6f 72 20 3d 20 30 3b  ->eOperator = 0;
4e60: 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70  .  if( allowedOp
4e70: 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28  (pExpr->op) && (
4e80: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
4e90: 68 74 20 26 20 70 72 65 72 65 71 4c 65 66 74 29  ht & prereqLeft)
4ea0: 3d 3d 30 20 29 7b 0a 20 20 20 20 45 78 70 72 20  ==0 ){.    Expr 
4eb0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
4ec0: 70 4c 65 66 74 3b 0a 20 20 20 20 45 78 70 72 20  pLeft;.    Expr 
4ed0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
4ee0: 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 69 66 28  >pRight;.    if(
4ef0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pLeft->op==TK_C
4f00: 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70  OLUMN ){.      p
4f10: 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72  Term->leftCursor
4f20: 20 3d 20 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65   = pLeft->iTable
4f30: 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6c  ;.      pTerm->l
4f40: 65 66 74 43 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66  eftColumn = pLef
4f50: 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  t->iColumn;.    
4f60: 20 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74    pTerm->eOperat
4f70: 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72 4d 61 73  or = operatorMas
4f80: 6b 28 70 45 78 70 72 2d 3e 6f 70 29 3b 0a 20 20  k(pExpr->op);.  
4f90: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 52 69 67    }.    if( pRig
4fa0: 68 74 20 26 26 20 70 52 69 67 68 74 2d 3e 6f 70  ht && pRight->op
4fb0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20  ==TK_COLUMN ){. 
4fc0: 20 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a       WhereTerm *
4fd0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 45 78 70 72  pNew;.      Expr
4fe0: 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66   *pDup;.      if
4ff0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
5000: 73 6f 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  sor>=0 ){.      
5010: 20 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20    int idxNew;.  
5020: 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c        pDup = sql
5030: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 78 70  ite3ExprDup(pExp
5040: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 64 78 4e  r);.        idxN
5050: 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73 65  ew = whereClause
5060: 49 6e 73 65 72 74 28 70 57 43 2c 20 70 44 75 70  Insert(pWC, pDup
5070: 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54  , TERM_VIRTUAL|T
5080: 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20  ERM_DYNAMIC);.  
5090: 20 20 20 20 20 20 69 66 28 20 69 64 78 4e 65 77        if( idxNew
50a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
50b0: 20 20 20 20 20 20 70 4e 65 77 20 3d 20 26 70 57        pNew = &pW
50c0: 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a 20 20  C->a[idxNew];.  
50d0: 20 20 20 20 20 20 70 4e 65 77 2d 3e 69 50 61 72        pNew->iPar
50e0: 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20  ent = idxTerm;. 
50f0: 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26         pTerm = &
5100: 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b  pWC->a[idxTerm];
5110: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
5120: 6e 43 68 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20  nChild = 1;.    
5130: 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73      pTerm->flags
5140: 20 7c 3d 20 54 45 52 4d 5f 43 4f 50 49 45 44 3b   |= TERM_COPIED;
5150: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
5160: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 78        pDup = pEx
5170: 70 72 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  pr;.        pNew
5180: 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 20 20   = pTerm;.      
5190: 7d 0a 20 20 20 20 20 20 65 78 70 72 43 6f 6d 6d  }.      exprComm
51a0: 75 74 65 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ute(pDup);.     
51b0: 20 70 4c 65 66 74 20 3d 20 70 44 75 70 2d 3e 70   pLeft = pDup->p
51c0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 70 4e 65 77  Left;.      pNew
51d0: 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 3d 20 70  ->leftCursor = p
51e0: 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20  Left->iTable;.  
51f0: 20 20 20 20 70 4e 65 77 2d 3e 6c 65 66 74 43 6f      pNew->leftCo
5200: 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69 43  lumn = pLeft->iC
5210: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e 65  olumn;.      pNe
5220: 77 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d  w->prereqRight =
5230: 20 70 72 65 72 65 71 4c 65 66 74 3b 0a 20 20 20   prereqLeft;.   
5240: 20 20 20 70 4e 65 77 2d 3e 70 72 65 72 65 71 41     pNew->prereqA
5250: 6c 6c 20 3d 20 70 72 65 72 65 71 41 6c 6c 3b 0a  ll = prereqAll;.
5260: 20 20 20 20 20 20 70 4e 65 77 2d 3e 65 4f 70 65        pNew->eOpe
5270: 72 61 74 6f 72 20 3d 20 6f 70 65 72 61 74 6f 72  rator = operator
5280: 4d 61 73 6b 28 70 44 75 70 2d 3e 6f 70 29 3b 0a  Mask(pDup->op);.
5290: 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64      }.  }..#ifnd
52a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
52b0: 45 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54  ETWEEN_OPTIMIZAT
52c0: 49 4f 4e 0a 20 20 2f 2a 20 49 66 20 61 20 74 65  ION.  /* If a te
52d0: 72 6d 20 69 73 20 74 68 65 20 42 45 54 57 45 45  rm is the BETWEE
52e0: 4e 20 6f 70 65 72 61 74 6f 72 2c 20 63 72 65 61  N operator, crea
52f0: 74 65 20 74 77 6f 20 6e 65 77 20 76 69 72 74 75  te two new virtu
5300: 61 6c 20 74 65 72 6d 73 0a 20 20 2a 2a 20 74 68  al terms.  ** th
5310: 61 74 20 64 65 66 69 6e 65 20 74 68 65 20 72 61  at define the ra
5320: 6e 67 65 20 74 68 61 74 20 74 68 65 20 42 45 54  nge that the BET
5330: 57 45 45 4e 20 69 6d 70 6c 65 6d 65 6e 74 73 2e  WEEN implements.
5340: 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20 69 66 28  .  */.  else if(
5350: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
5360: 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 45 78  ETWEEN ){.    Ex
5370: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
5380: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
5390: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 61    int i;.    sta
53a0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 6f 70 73  tic const u8 ops
53b0: 5b 5d 20 3d 20 7b 54 4b 5f 47 45 2c 20 54 4b 5f  [] = {TK_GE, TK_
53c0: 4c 45 7d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  LE};.    assert(
53d0: 20 70 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20   pList!=0 );.   
53e0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
53f0: 6e 45 78 70 72 3d 3d 32 20 29 3b 0a 20 20 20 20  nExpr==2 );.    
5400: 66 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b  for(i=0; i<2; i+
5410: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
5420: 70 4e 65 77 45 78 70 72 3b 0a 20 20 20 20 20 20  pNewExpr;.      
5430: 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20 20  int idxNew;.    
5440: 20 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c    pNewExpr = sql
5450: 69 74 65 33 45 78 70 72 28 6f 70 73 5b 69 5d 2c  ite3Expr(ops[i],
5460: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
5470: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 2c 0a 20  pExpr->pLeft),. 
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5490: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
54a0: 74 65 33 45 78 70 72 44 75 70 28 70 4c 69 73 74  te3ExprDup(pList
54b0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 2c 20 30  ->a[i].pExpr), 0
54c0: 29 3b 0a 20 20 20 20 20 20 69 64 78 4e 65 77 20  );.      idxNew 
54d0: 3d 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 73  = whereClauseIns
54e0: 65 72 74 28 70 57 43 2c 20 70 4e 65 77 45 78 70  ert(pWC, pNewExp
54f0: 72 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  r, TERM_VIRTUAL|
5500: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
5510: 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79 7a 65       exprAnalyze
5520: 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65 74 2c  (pSrc, pMaskSet,
5530: 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b 0a 20   pWC, idxNew);. 
5540: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57       pTerm = &pW
5550: 43 2d 3e 61 5b 69 64 78 54 65 72 6d 5d 3b 0a 20  C->a[idxTerm];. 
5560: 20 20 20 20 20 70 57 43 2d 3e 61 5b 69 64 78 4e       pWC->a[idxN
5570: 65 77 5d 2e 69 50 61 72 65 6e 74 20 3d 20 69 64  ew].iParent = id
5580: 78 54 65 72 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  xTerm;.    }.   
5590: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
55a0: 20 32 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f   2;.  }.#endif /
55b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 45  * SQLITE_OMIT_BE
55c0: 54 57 45 45 4e 5f 4f 50 54 49 4d 49 5a 41 54 49  TWEEN_OPTIMIZATI
55d0: 4f 4e 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  ON */..#if !defi
55e0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
55f0: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 29  OR_OPTIMIZATION)
5600: 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
5610: 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
5620: 59 29 0a 20 20 2f 2a 20 41 74 74 65 6d 70 74 20  Y).  /* Attempt 
5630: 74 6f 20 63 6f 6e 76 65 72 74 20 4f 52 2d 63 6f  to convert OR-co
5640: 6e 6e 65 63 74 65 64 20 74 65 72 6d 73 20 69 6e  nnected terms in
5650: 74 6f 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f  to an IN operato
5660: 72 20 73 6f 20 74 68 61 74 0a 20 20 2a 2a 20 74  r so that.  ** t
5670: 68 65 79 20 63 61 6e 20 6d 61 6b 65 20 75 73 65  hey can make use
5680: 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 45 78   of indices.  Ex
5690: 61 6d 70 6c 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  ample:.  **.  **
56a0: 20 20 20 20 20 20 78 20 3d 20 65 78 70 72 31 20        x = expr1 
56b0: 20 4f 52 20 20 65 78 70 72 32 20 3d 20 78 20 20   OR  expr2 = x  
56c0: 4f 52 20 20 78 20 3d 20 65 78 70 72 33 0a 20 20  OR  x = expr3.  
56d0: 2a 2a 0a 20 20 2a 2a 20 69 73 20 63 6f 6e 76 65  **.  ** is conve
56e0: 72 74 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 0a 20  rted into.  **. 
56f0: 20 2a 2a 20 20 20 20 20 20 78 20 49 4e 20 28 65   **      x IN (e
5700: 78 70 72 31 2c 65 78 70 72 32 2c 65 78 70 72 33  xpr1,expr2,expr3
5710: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73  ).  **.  ** This
5720: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 75   optimization mu
5730: 73 74 20 62 65 20 6f 6d 69 74 74 65 64 20 69 66  st be omitted if
5740: 20 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 69   OMIT_SUBQUERY i
5750: 73 20 64 65 66 69 6e 65 64 20 62 65 63 61 75 73  s defined becaus
5760: 65 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 69  e.  ** the compi
5770: 6c 65 72 20 66 6f 72 20 74 68 65 20 74 68 65 20  ler for the the 
5780: 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20 70  IN operator is p
5790: 61 72 74 20 6f 66 20 73 75 62 2d 71 75 65 72 69  art of sub-queri
57a0: 65 73 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 20  es..  */.  else 
57b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
57c0: 4b 5f 4f 52 20 29 7b 0a 20 20 20 20 69 6e 74 20  K_OR ){.    int 
57d0: 6f 6b 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a  ok;.    int i, j
57e0: 3b 0a 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d  ;.    int iColum
57f0: 6e 2c 20 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  n, iCursor;.    
5800: 57 68 65 72 65 43 6c 61 75 73 65 20 73 4f 72 3b  WhereClause sOr;
5810: 0a 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a  .    WhereTerm *
5820: 70 4f 72 54 65 72 6d 3b 0a 0a 20 20 20 20 61 73  pOrTerm;..    as
5830: 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c  sert( (pTerm->fl
5840: 61 67 73 20 26 20 54 45 52 4d 5f 44 59 4e 41 4d  ags & TERM_DYNAM
5850: 49 43 29 3d 3d 30 20 29 3b 0a 20 20 20 20 77 68  IC)==0 );.    wh
5860: 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26 73  ereClauseInit(&s
5870: 4f 72 2c 20 70 57 43 2d 3e 70 50 61 72 73 65 29  Or, pWC->pParse)
5880: 3b 0a 20 20 20 20 77 68 65 72 65 53 70 6c 69 74  ;.    whereSplit
5890: 28 26 73 4f 72 2c 20 70 45 78 70 72 2c 20 54 4b  (&sOr, pExpr, TK
58a0: 5f 4f 52 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  _OR);.    exprAn
58b0: 61 6c 79 7a 65 41 6c 6c 28 70 53 72 63 2c 20 70  alyzeAll(pSrc, p
58c0: 4d 61 73 6b 53 65 74 2c 20 26 73 4f 72 29 3b 0a  MaskSet, &sOr);.
58d0: 20 20 20 20 61 73 73 65 72 74 28 20 73 4f 72 2e      assert( sOr.
58e0: 6e 54 65 72 6d 3e 30 20 29 3b 0a 20 20 20 20 6a  nTerm>0 );.    j
58f0: 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20   = 0;.    do{.  
5900: 20 20 20 20 69 43 6f 6c 75 6d 6e 20 3d 20 73 4f      iColumn = sO
5910: 72 2e 61 5b 6a 5d 2e 6c 65 66 74 43 6f 6c 75 6d  r.a[j].leftColum
5920: 6e 3b 0a 20 20 20 20 20 20 69 43 75 72 73 6f 72  n;.      iCursor
5930: 20 3d 20 73 4f 72 2e 61 5b 6a 5d 2e 6c 65 66 74   = sOr.a[j].left
5940: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 6f 6b  Cursor;.      ok
5950: 20 3d 20 69 43 75 72 73 6f 72 3e 3d 30 3b 0a 20   = iCursor>=0;. 
5960: 20 20 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e       for(i=sOr.n
5970: 54 65 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d  Term-1, pOrTerm=
5980: 73 4f 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f  sOr.a; i>=0 && o
5990: 6b 3b 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b  k; i--, pOrTerm+
59a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
59b0: 70 4f 72 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  pOrTerm->eOperat
59c0: 6f 72 21 3d 57 4f 5f 45 51 20 29 7b 0a 20 20 20  or!=WO_EQ ){.   
59d0: 20 20 20 20 20 20 20 67 6f 74 6f 20 6f 72 5f 6e         goto or_n
59e0: 6f 74 5f 70 6f 73 73 69 62 6c 65 3b 0a 20 20 20  ot_possible;.   
59f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5a00: 66 28 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  f( pOrTerm->left
5a10: 43 75 72 73 6f 72 3d 3d 69 43 75 72 73 6f 72 20  Cursor==iCursor 
5a20: 26 26 20 70 4f 72 54 65 72 6d 2d 3e 6c 65 66 74  && pOrTerm->left
5a30: 43 6f 6c 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20  Column==iColumn 
5a40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  ){.          pOr
5a50: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
5a60: 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20 20 20 20 20  ERM_OR_OK;.     
5a70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
5a80: 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  rTerm->flags & T
5a90: 45 52 4d 5f 43 4f 50 49 45 44 29 21 3d 30 20 7c  ERM_COPIED)!=0 |
5aa0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
5ab0: 20 20 20 20 20 20 28 28 70 4f 72 54 65 72 6d 2d        ((pOrTerm-
5ac0: 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 56 49  >flags & TERM_VI
5ad0: 52 54 55 41 4c 29 21 3d 30 20 26 26 0a 20 20 20  RTUAL)!=0 &&.   
5ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5af0: 20 20 28 73 4f 72 2e 61 5b 70 4f 72 54 65 72 6d    (sOr.a[pOrTerm
5b00: 2d 3e 69 50 61 72 65 6e 74 5d 2e 66 6c 61 67 73  ->iParent].flags
5b10: 20 26 20 54 45 52 4d 5f 4f 52 5f 4f 4b 29 21 3d   & TERM_OR_OK)!=
5b20: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
5b30: 70 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  pOrTerm->flags &
5b40: 3d 20 7e 54 45 52 4d 5f 4f 52 5f 4f 4b 3b 0a 20  = ~TERM_OR_OK;. 
5b50: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
5b60: 20 20 20 20 20 20 20 20 6f 6b 20 3d 20 30 3b 0a          ok = 0;.
5b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5b80: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 21 6f  }.    }while( !o
5b90: 6b 20 26 26 20 28 73 4f 72 2e 61 5b 6a 2b 2b 5d  k && (sOr.a[j++]
5ba0: 2e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  .flags & TERM_CO
5bb0: 50 49 45 44 29 21 3d 30 20 26 26 20 6a 3c 73 4f  PIED)!=0 && j<sO
5bc0: 72 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20 20 69  r.nTerm );.    i
5bd0: 66 28 20 6f 6b 20 29 7b 0a 20 20 20 20 20 20 45  f( ok ){.      E
5be0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
5bf0: 20 30 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a   0;.      Expr *
5c00: 70 4e 65 77 2c 20 2a 70 44 75 70 3b 0a 20 20 20  pNew, *pDup;.   
5c10: 20 20 20 66 6f 72 28 69 3d 73 4f 72 2e 6e 54 65     for(i=sOr.nTe
5c20: 72 6d 2d 31 2c 20 70 4f 72 54 65 72 6d 3d 73 4f  rm-1, pOrTerm=sO
5c30: 72 2e 61 3b 20 69 3e 3d 30 20 26 26 20 6f 6b 3b  r.a; i>=0 && ok;
5c40: 20 69 2d 2d 2c 20 70 4f 72 54 65 72 6d 2b 2b 29   i--, pOrTerm++)
5c50: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
5c60: 4f 72 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20  OrTerm->flags & 
5c70: 54 45 52 4d 5f 4f 52 5f 4f 4b 29 3d 3d 30 20 29  TERM_OR_OK)==0 )
5c80: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
5c90: 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65     pDup = sqlite
5ca0: 33 45 78 70 72 44 75 70 28 70 4f 72 54 65 72 6d  3ExprDup(pOrTerm
5cb0: 2d 3e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  ->pExpr->pRight)
5cc0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 20  ;.        pList 
5cd0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
5ce0: 74 41 70 70 65 6e 64 28 70 4c 69 73 74 2c 20 70  tAppend(pList, p
5cf0: 44 75 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Dup, 0);.      }
5d00: 0a 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71  .      pDup = sq
5d10: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 43 4f 4c  lite3Expr(TK_COL
5d20: 55 4d 4e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  UMN, 0, 0, 0);. 
5d30: 20 20 20 20 20 69 66 28 20 70 44 75 70 20 29 7b       if( pDup ){
5d40: 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69  .        pDup->i
5d50: 54 61 62 6c 65 20 3d 20 69 43 75 72 73 6f 72 3b  Table = iCursor;
5d60: 0a 20 20 20 20 20 20 20 20 70 44 75 70 2d 3e 69  .        pDup->i
5d70: 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 75 6d 6e  Column = iColumn
5d80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5d90: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 45 78  pNew = sqlite3Ex
5da0: 70 72 28 54 4b 5f 49 4e 2c 20 70 44 75 70 2c 20  pr(TK_IN, pDup, 
5db0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
5dc0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20   pNew ){.       
5dd0: 20 69 6e 74 20 69 64 78 4e 65 77 3b 0a 20 20 20   int idxNew;.   
5de0: 20 20 20 20 20 74 72 61 6e 73 66 65 72 4a 6f 69       transferJoi
5df0: 6e 4d 61 72 6b 69 6e 67 73 28 70 4e 65 77 2c 20  nMarkings(pNew, 
5e00: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
5e10: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c  pNew->pList = pL
5e20: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69 64 78  ist;.        idx
5e30: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
5e40: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
5e50: 77 2c 20 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c  w, TERM_VIRTUAL|
5e60: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 29 3b 0a 20  TERM_DYNAMIC);. 
5e70: 20 20 20 20 20 20 20 65 78 70 72 41 6e 61 6c 79         exprAnaly
5e80: 7a 65 28 70 53 72 63 2c 20 70 4d 61 73 6b 53 65  ze(pSrc, pMaskSe
5e90: 74 2c 20 70 57 43 2c 20 69 64 78 4e 65 77 29 3b  t, pWC, idxNew);
5ea0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
5eb0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
5ec0: 5d 3b 0a 20 20 20 20 20 20 20 20 70 57 43 2d 3e  ];.        pWC->
5ed0: 61 5b 69 64 78 4e 65 77 5d 2e 69 50 61 72 65 6e  a[idxNew].iParen
5ee0: 74 20 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20  t = idxTerm;.   
5ef0: 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68 69       pTerm->nChi
5f00: 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ld = 1;.      }e
5f10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
5f20: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
5f30: 74 65 28 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  te(pList);.     
5f40: 20 7d 0a 20 20 20 20 7d 0a 6f 72 5f 6e 6f 74 5f   }.    }.or_not_
5f50: 70 6f 73 73 69 62 6c 65 3a 0a 20 20 20 20 77 68  possible:.    wh
5f60: 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26  ereClauseClear(&
5f70: 73 4f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sOr);.  }.#endif
5f80: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
5f90: 4f 52 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 20  OR_OPTIMIZATION 
5fa0: 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
5fb0: 54 45 5f 4f 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54  TE_OMIT_LIKE_OPT
5fc0: 49 4d 49 5a 41 54 49 4f 4e 0a 20 20 2f 2a 20 41  IMIZATION.  /* A
5fd0: 64 64 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  dd constraints t
5fe0: 6f 20 72 65 64 75 63 65 20 74 68 65 20 73 65 61  o reduce the sea
5ff0: 72 63 68 20 73 70 61 63 65 20 6f 6e 20 61 20 4c  rch space on a L
6000: 49 4b 45 20 6f 72 20 47 4c 4f 42 0a 20 20 2a 2a  IKE or GLOB.  **
6010: 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 2a 2f 0a   operator..  */.
6020: 20 20 69 66 28 20 69 73 4c 69 6b 65 4f 72 47 6c    if( isLikeOrGl
6030: 6f 62 28 70 57 43 2d 3e 70 50 61 72 73 65 2d 3e  ob(pWC->pParse->
6040: 64 62 2c 20 70 45 78 70 72 2c 20 26 6e 50 61 74  db, pExpr, &nPat
6050: 74 65 72 6e 2c 20 26 69 73 43 6f 6d 70 6c 65 74  tern, &isComplet
6060: 65 29 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a  e) ){.    Expr *
6070: 70 4c 65 66 74 2c 20 2a 70 52 69 67 68 74 3b 0a  pLeft, *pRight;.
6080: 20 20 20 20 45 78 70 72 20 2a 70 53 74 72 31 2c      Expr *pStr1,
6090: 20 2a 70 53 74 72 32 3b 0a 20 20 20 20 45 78 70   *pStr2;.    Exp
60a0: 72 20 2a 70 4e 65 77 45 78 70 72 31 2c 20 2a 70  r *pNewExpr1, *p
60b0: 4e 65 77 45 78 70 72 32 3b 0a 20 20 20 20 69 6e  NewExpr2;.    in
60c0: 74 20 69 64 78 4e 65 77 31 2c 20 69 64 78 4e 65  t idxNew1, idxNe
60d0: 77 32 3b 0a 0a 20 20 20 20 70 4c 65 66 74 20 3d  w2;..    pLeft =
60e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
60f0: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70  [1].pExpr;.    p
6100: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
6110: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
6120: 3b 0a 20 20 20 20 70 53 74 72 31 20 3d 20 73 71  ;.    pStr1 = sq
6130: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 53 54 52  lite3Expr(TK_STR
6140: 49 4e 47 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  ING, 0, 0, 0);. 
6150: 20 20 20 69 66 28 20 70 53 74 72 31 20 29 7b 0a     if( pStr1 ){.
6160: 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f 6b        sqlite3Tok
6170: 65 6e 43 6f 70 79 28 26 70 53 74 72 31 2d 3e 74  enCopy(&pStr1->t
6180: 6f 6b 65 6e 2c 20 26 70 52 69 67 68 74 2d 3e 74  oken, &pRight->t
6190: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 53 74  oken);.      pSt
61a0: 72 31 2d 3e 74 6f 6b 65 6e 2e 6e 20 3d 20 6e 50  r1->token.n = nP
61b0: 61 74 74 65 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  attern;.    }.  
61c0: 20 20 70 53 74 72 32 20 3d 20 73 71 6c 69 74 65    pStr2 = sqlite
61d0: 33 45 78 70 72 44 75 70 28 70 53 74 72 31 29 3b  3ExprDup(pStr1);
61e0: 0a 20 20 20 20 69 66 28 20 70 53 74 72 32 20 29  .    if( pStr2 )
61f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
6200: 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e 64 79 6e  pStr2->token.dyn
6210: 20 29 3b 0a 20 20 20 20 20 20 2b 2b 2a 28 75 38   );.      ++*(u8
6220: 2a 29 26 70 53 74 72 32 2d 3e 74 6f 6b 65 6e 2e  *)&pStr2->token.
6230: 7a 5b 6e 50 61 74 74 65 72 6e 2d 31 5d 3b 0a 20  z[nPattern-1];. 
6240: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 45 78 70     }.    pNewExp
6250: 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
6260: 28 54 4b 5f 47 45 2c 20 73 71 6c 69 74 65 33 45  (TK_GE, sqlite3E
6270: 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20 70  xprDup(pLeft), p
6280: 53 74 72 31 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str1, 0);.    id
6290: 78 4e 65 77 31 20 3d 20 77 68 65 72 65 43 6c 61  xNew1 = whereCla
62a0: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
62b0: 4e 65 77 45 78 70 72 31 2c 20 54 45 52 4d 5f 56  NewExpr1, TERM_V
62c0: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
62d0: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
62e0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
62f0: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
6300: 77 31 29 3b 0a 20 20 20 20 70 4e 65 77 45 78 70  w1);.    pNewExp
6310: 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
6320: 28 54 4b 5f 4c 54 2c 20 73 71 6c 69 74 65 33 45  (TK_LT, sqlite3E
6330: 78 70 72 44 75 70 28 70 4c 65 66 74 29 2c 20 70  xprDup(pLeft), p
6340: 53 74 72 32 2c 20 30 29 3b 0a 20 20 20 20 69 64  Str2, 0);.    id
6350: 78 4e 65 77 32 20 3d 20 77 68 65 72 65 43 6c 61  xNew2 = whereCla
6360: 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70  useInsert(pWC, p
6370: 4e 65 77 45 78 70 72 32 2c 20 54 45 52 4d 5f 56  NewExpr2, TERM_V
6380: 49 52 54 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41  IRTUAL|TERM_DYNA
6390: 4d 49 43 29 3b 0a 20 20 20 20 65 78 70 72 41 6e  MIC);.    exprAn
63a0: 61 6c 79 7a 65 28 70 53 72 63 2c 20 70 4d 61 73  alyze(pSrc, pMas
63b0: 6b 53 65 74 2c 20 70 57 43 2c 20 69 64 78 4e 65  kSet, pWC, idxNe
63c0: 77 32 29 3b 0a 20 20 20 20 70 54 65 72 6d 20 3d  w2);.    pTerm =
63d0: 20 26 70 57 43 2d 3e 61 5b 69 64 78 54 65 72 6d   &pWC->a[idxTerm
63e0: 5d 3b 0a 20 20 20 20 69 66 28 20 69 73 43 6f 6d  ];.    if( isCom
63f0: 70 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 70  plete ){.      p
6400: 57 43 2d 3e 61 5b 69 64 78 4e 65 77 31 5d 2e 69  WC->a[idxNew1].i
6410: 50 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d  Parent = idxTerm
6420: 3b 0a 20 20 20 20 20 20 70 57 43 2d 3e 61 5b 69  ;.      pWC->a[i
6430: 64 78 4e 65 77 32 5d 2e 69 50 61 72 65 6e 74 20  dxNew2].iParent 
6440: 3d 20 69 64 78 54 65 72 6d 3b 0a 20 20 20 20 20  = idxTerm;.     
6450: 20 70 54 65 72 6d 2d 3e 6e 43 68 69 6c 64 20 3d   pTerm->nChild =
6460: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   2;.    }.  }.#e
6470: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
6480: 4d 49 54 5f 4c 49 4b 45 5f 4f 50 54 49 4d 49 5a  MIT_LIKE_OPTIMIZ
6490: 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 6e 64 65  ATION */..#ifnde
64a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
64b0: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a 20  RTUALTABLE.  /* 
64c0: 41 64 64 20 61 20 57 4f 5f 4d 41 54 43 48 20 61  Add a WO_MATCH a
64d0: 75 78 69 6c 69 61 72 79 20 74 65 72 6d 20 74 6f  uxiliary term to
64e0: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
64f0: 73 65 74 20 69 66 20 74 68 65 0a 20 20 2a 2a 20  set if the.  ** 
6500: 63 75 72 72 65 6e 74 20 65 78 70 72 65 73 73 69  current expressi
6510: 6f 6e 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  on is of the for
6520: 6d 3a 20 20 63 6f 6c 75 6d 6e 20 4d 41 54 43 48  m:  column MATCH
6530: 20 65 78 70 72 2e 0a 20 20 2a 2a 20 54 68 69 73   expr..  ** This
6540: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
6550: 75 73 65 64 20 62 79 20 74 68 65 20 78 42 65 73  used by the xBes
6560: 74 49 6e 64 65 78 20 6d 65 74 68 6f 64 73 20 6f  tIndex methods o
6570: 66 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 74  f.  ** virtual t
6580: 61 62 6c 65 73 2e 20 20 54 68 65 20 6e 61 74 69  ables.  The nati
6590: 76 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69 7a  ve query optimiz
65a0: 65 72 20 64 6f 65 73 20 6e 6f 74 20 61 74 74 65  er does not atte
65b0: 6d 70 74 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 61  mpt.  ** to do a
65c0: 6e 79 74 68 69 6e 67 20 77 69 74 68 20 4d 41 54  nything with MAT
65d0: 43 48 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  CH functions..  
65e0: 2a 2f 0a 20 20 69 66 28 20 69 73 4d 61 74 63 68  */.  if( isMatch
65f0: 4f 66 43 6f 6c 75 6d 6e 28 70 45 78 70 72 29 20  OfColumn(pExpr) 
6600: 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 4e 65  ){.    int idxNe
6610: 77 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 52 69  w;.    Expr *pRi
6620: 67 68 74 2c 20 2a 70 4c 65 66 74 3b 0a 20 20 20  ght, *pLeft;.   
6630: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 4e 65 77   WhereTerm *pNew
6640: 54 65 72 6d 3b 0a 20 20 20 20 42 69 74 6d 61 73  Term;.    Bitmas
6650: 6b 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 2c 20  k prereqColumn, 
6660: 70 72 65 72 65 71 45 78 70 72 3b 0a 0a 20 20 20  prereqExpr;..   
6670: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
6680: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
6690: 70 72 3b 0a 20 20 20 20 70 4c 65 66 74 20 3d 20  pr;.    pLeft = 
66a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
66b0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 70 72  1].pExpr;.    pr
66c0: 65 72 65 71 45 78 70 72 20 3d 20 65 78 70 72 54  ereqExpr = exprT
66d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
66e0: 65 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  et, pRight);.   
66f0: 20 70 72 65 72 65 71 43 6f 6c 75 6d 6e 20 3d 20   prereqColumn = 
6700: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
6710: 4d 61 73 6b 53 65 74 2c 20 70 4c 65 66 74 29 3b  MaskSet, pLeft);
6720: 0a 20 20 20 20 69 66 28 20 28 70 72 65 72 65 71  .    if( (prereq
6730: 45 78 70 72 20 26 20 70 72 65 72 65 71 43 6f 6c  Expr & prereqCol
6740: 75 6d 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  umn)==0 ){.     
6750: 20 45 78 70 72 20 2a 70 4e 65 77 45 78 70 72 3b   Expr *pNewExpr;
6760: 0a 20 20 20 20 20 20 70 4e 65 77 45 78 70 72 20  .      pNewExpr 
6770: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b  = sqlite3Expr(TK
6780: 5f 4d 41 54 43 48 2c 20 30 2c 20 73 71 6c 69 74  _MATCH, 0, sqlit
6790: 65 33 45 78 70 72 44 75 70 28 70 52 69 67 68 74  e3ExprDup(pRight
67a0: 29 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 64 78  ), 0);.      idx
67b0: 4e 65 77 20 3d 20 77 68 65 72 65 43 6c 61 75 73  New = whereClaus
67c0: 65 49 6e 73 65 72 74 28 70 57 43 2c 20 70 4e 65  eInsert(pWC, pNe
67d0: 77 45 78 70 72 2c 20 54 45 52 4d 5f 56 49 52 54  wExpr, TERM_VIRT
67e0: 55 41 4c 7c 54 45 52 4d 5f 44 59 4e 41 4d 49 43  UAL|TERM_DYNAMIC
67f0: 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 54 65 72  );.      pNewTer
6800: 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 69 64 78 4e  m = &pWC->a[idxN
6810: 65 77 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77 54  ew];.      pNewT
6820: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
6830: 20 3d 20 70 72 65 72 65 71 45 78 70 72 3b 0a 20   = prereqExpr;. 
6840: 20 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 6c       pNewTerm->l
6850: 65 66 74 43 75 72 73 6f 72 20 3d 20 70 4c 65 66  eftCursor = pLef
6860: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
6870: 20 70 4e 65 77 54 65 72 6d 2d 3e 6c 65 66 74 43   pNewTerm->leftC
6880: 6f 6c 75 6d 6e 20 3d 20 70 4c 65 66 74 2d 3e 69  olumn = pLeft->i
6890: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 4e  Column;.      pN
68a0: 65 77 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f  ewTerm->eOperato
68b0: 72 20 3d 20 57 4f 5f 4d 41 54 43 48 3b 0a 20 20  r = WO_MATCH;.  
68c0: 20 20 20 20 70 4e 65 77 54 65 72 6d 2d 3e 69 50      pNewTerm->iP
68d0: 61 72 65 6e 74 20 3d 20 69 64 78 54 65 72 6d 3b  arent = idxTerm;
68e0: 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26  .      pTerm = &
68f0: 70 57 43 2d 3e 61 5b 69 64 78 4e 65 77 5d 3b 0a  pWC->a[idxNew];.
6900: 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 6e 43 68        pTerm->nCh
6910: 69 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  ild = 1;.      p
6920: 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  Term->flags |= T
6930: 45 52 4d 5f 43 4f 50 49 45 44 3b 0a 20 20 20 20  ERM_COPIED;.    
6940: 20 20 70 4e 65 77 54 65 72 6d 2d 3e 70 72 65 72    pNewTerm->prer
6950: 65 71 41 6c 6c 20 3d 20 70 54 65 72 6d 2d 3e 70  eqAll = pTerm->p
6960: 72 65 72 65 71 41 6c 6c 3b 0a 20 20 20 20 7d 0a  rereqAll;.    }.
6970: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
6980: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
6990: 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 0a 2f 2a  LTABLE */.}.../*
69a0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
69b0: 20 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78   decides if pIdx
69c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
69d0: 73 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45  satisfy the ORDE
69e0: 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20  R BY.** clause. 
69f0: 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72   If it can, it r
6a00: 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49  eturns 1.  If pI
6a10: 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  dx cannot satisf
6a20: 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42  y the.** ORDER B
6a30: 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72  Y clause, this r
6a40: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30  outine returns 0
6a50: 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79  ..**.** pOrderBy
6a60: 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20   is an ORDER BY 
6a70: 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45  clause from a SE
6a80: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
6a90: 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20   pTab is the.** 
6aa0: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
6ab0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
6ac0: 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20  se of that same 
6ad0: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
6ae0: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c   and.** the tabl
6af0: 65 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e  e has a cursor n
6b00: 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e  umber of "base".
6b10: 20 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64    pIdx is an ind
6b20: 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a  ex on pTab..**.*
6b30: 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20  * nEqCol is the 
6b40: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
6b50: 73 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61  s of pIdx that a
6b60: 72 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c  re used as equal
6b70: 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e  ity.** constrain
6b80: 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73  ts.  Any of thes
6b90: 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65  e columns may be
6ba0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68   missing from th
6bb0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
6bc0: 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74  ause and the mat
6bd0: 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20  ch can still be 
6be0: 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  a success..**.**
6bf0: 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   All terms of th
6c00: 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74 20  e ORDER BY that 
6c10: 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74 68  match against th
6c20: 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20  e index must be 
6c30: 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f 72  either.** ASC or
6c40: 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20 6f   DESC.  (Terms o
6c50: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  f the ORDER BY c
6c60: 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20 65  lause past the e
6c70: 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a 2a  nd of a UNIQUE.*
6c80: 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20 6e  * index do not n
6c90: 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74  eed to satisfy t
6ca0: 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e 29  his constraint.)
6cb0: 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61 6c    The *pbRev val
6cc0: 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ue is.** set to 
6cd0: 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42  1 if the ORDER B
6ce0: 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 20  Y clause is all 
6cf0: 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20 73  DESC and it is s
6d00: 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74 68  et to 0 if.** th
6d10: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
6d20: 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a 2f  e is all ASC..*/
6d30: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53 6f  .static int isSo
6d40: 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50 61  rtingIndex(.  Pa
6d50: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
6d60: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
6d70: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49 6e   context */.  In
6d80: 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20 20  dex *pIdx,      
6d90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
6da0: 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69 6e  ex we are testin
6db0: 67 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c  g */.  int base,
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6dd0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
6de0: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 74 6f  for the table to
6df0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
6e00: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
6e10: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
6e20: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
6e30: 2f 0a 20 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20  /.  int nEqCol, 
6e40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6e50: 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78 20 63  umber of index c
6e60: 6f 6c 75 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63  olumns with == c
6e70: 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20  onstraints */.  
6e80: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
6e90: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
6ea0: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
6eb0: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
6ec0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
6ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ee0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
6ef0: 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72 74 4f 72   */.  int sortOr
6f00: 64 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20  der = 0;        
6f10: 20 20 20 20 20 20 2f 2a 20 58 4f 52 20 6f 66 20        /* XOR of 
6f20: 69 6e 64 65 78 20 61 6e 64 20 4f 52 44 45 52 20  index and ORDER 
6f30: 42 59 20 73 6f 72 74 20 64 69 72 65 63 74 69 6f  BY sort directio
6f40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  n */.  int nTerm
6f50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6f60: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
6f70: 20 6f 66 20 4f 52 44 45 52 20 42 59 20 74 65 72   of ORDER BY ter
6f80: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 45  ms */.  struct E
6f90: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  xprList_item *pT
6fa0: 65 72 6d 3b 20 20 20 20 2f 2a 20 41 20 74 65 72  erm;    /* A ter
6fb0: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
6fc0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
6fd0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
6fe0: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
6ff0: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
7000: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
7010: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
7020: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
7030: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
7040: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
7050: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
7060: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
7070: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
7080: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
7090: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
70a0: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
70b0: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
70c0: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
70d0: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
70e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
70f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
7100: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
7110: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
7120: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
7130: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
7140: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 65 72 6d   */.    int term
7150: 53 6f 72 74 4f 72 64 65 72 3b 20 2f 2a 20 53 6f  SortOrder; /* So
7160: 72 74 20 6f 72 64 65 72 20 66 6f 72 20 74 68 69  rt order for thi
7170: 73 20 74 65 72 6d 20 2a 2f 0a 0a 20 20 20 20 70  s term */..    p
7180: 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45  Expr = pTerm->pE
7190: 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45 78  xpr;.    if( pEx
71a0: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d  pr->op!=TK_COLUM
71b0: 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62  N || pExpr->iTab
71c0: 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20 20  le!=base ){.    
71d0: 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65    /* Can not use
71e0: 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20 6f   an index sort o
71f0: 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74 20  n anything that 
7200: 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20  is not a column 
7210: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
7220: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  left-most table 
7230: 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  of the FROM clau
7240: 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
7250: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
7260: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
7270: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7280: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 69  e, pExpr);.    i
7290: 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c  f( !pColl ) pCol
72a0: 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  l = db->pDfltCol
72b0: 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  l;.    if( pExpr
72c0: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d  ->iColumn!=pIdx-
72d0: 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20  >aiColumn[i] || 
72e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
72f0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 6c 2d 3e 7a  StrICmp(pColl->z
7300: 4e 61 6d 65 2c 20 70 49 64 78 2d 3e 61 7a 43 6f  Name, pIdx->azCo
7310: 6c 6c 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  ll[i]) ){.      
7320: 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68 65  /* Term j of the
7330: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
7340: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
7350: 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65 20  column i of the 
7360: 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69  index */.      i
7370: 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a 20  f( i<nEqCol ){. 
7380: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
7390: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68 61  index column tha
73a0: 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64  t is constrained
73b0: 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f 20   by == fails to 
73c0: 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20 20  match an.       
73d0: 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72   ** ORDER BY ter
73e0: 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20 20  m, that is OK.  
73f0: 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61 74  Just ignore that
7400: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
7410: 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ndex.        */.
7420: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7430: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7440: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20         /* If an 
7450: 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61 69  index column fai
7460: 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64 20  ls to match and 
7470: 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69 6e  is not constrain
7480: 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20 20  ed by ==.       
7490: 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e 64   ** then the ind
74a0: 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66  ex cannot satisf
74b0: 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  y the ORDER BY c
74c0: 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20 20  onstraint..     
74d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65     */.        re
74e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
74f0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
7500: 28 20 70 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64  ( pIdx->aSortOrd
7510: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  er!=0 );.    ass
7520: 65 72 74 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74  ert( pTerm->sort
7530: 4f 72 64 65 72 3d 3d 30 20 7c 7c 20 70 54 65 72  Order==0 || pTer
7540: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3d 3d 31 20  m->sortOrder==1 
7550: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
7560: 49 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  Idx->aSortOrder[
7570: 69 5d 3d 3d 30 20 7c 7c 20 70 49 64 78 2d 3e 61  i]==0 || pIdx->a
7580: 53 6f 72 74 4f 72 64 65 72 5b 69 5d 3d 3d 31 20  SortOrder[i]==1 
7590: 29 3b 0a 20 20 20 20 74 65 72 6d 53 6f 72 74 4f  );.    termSortO
75a0: 72 64 65 72 20 3d 20 70 49 64 78 2d 3e 61 53 6f  rder = pIdx->aSo
75b0: 72 74 4f 72 64 65 72 5b 69 5d 20 5e 20 70 54 65  rtOrder[i] ^ pTe
75c0: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
75d0: 20 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20     if( i>nEqCol 
75e0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 65 72  ){.      if( ter
75f0: 6d 53 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74  mSortOrder!=sort
7600: 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20  Order ){.       
7610: 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20   /* Indices can 
7620: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69 66 20  only be used if 
7630: 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72  all ORDER BY ter
7640: 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20 20 20  ms past the.    
7650: 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20      ** equality 
7660: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20  constraints are 
7670: 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53 43 20  all either DESC 
7680: 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20  or ASC. */.     
7690: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
76a0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
76b0: 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20        sortOrder 
76c0: 3d 20 74 65 72 6d 53 6f 72 74 4f 72 64 65 72 3b  = termSortOrder;
76d0: 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a  .    }.    j++;.
76e0: 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d      pTerm++;.  }
76f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
7700: 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
7710: 20 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20   sorting if all 
7720: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44  terms of the ORD
7730: 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a  ER BY clause.  *
7740: 2a 20 61 72 65 20 63 6f 76 65 72 65 64 2e 0a 20  * are covered.. 
7750: 20 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54 65   */.  if( j>=nTe
7760: 72 6d 20 29 7b 0a 20 20 20 20 2a 70 62 52 65 76  rm ){.    *pbRev
7770: 20 3d 20 73 6f 72 74 4f 72 64 65 72 21 3d 30 3b   = sortOrder!=0;
7780: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
7790: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
77a0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61  ../*.** Check ta
77b0: 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74 68  ble to see if th
77c0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
77d0: 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61  e in pOrderBy ca
77e0: 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a  n be satisfied.*
77f0: 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20  * by sorting in 
7800: 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20  order of ROWID. 
7810: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
7820: 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65  so and set *pbRe
7830: 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20  v to be.** true 
7840: 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57 49  for reverse ROWI
7850: 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20  D and false for 
7860: 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72  forward ROWID or
7870: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
7880: 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77  nt sortableByRow
7890: 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20  id(.  int base, 
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
78b0: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
78c0: 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73  or table to be s
78d0: 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c  orted */.  ExprL
78e0: 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20  ist *pOrderBy,  
78f0: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
7900: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69  BY clause */.  i
7910: 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20 20  nt *pbRev       
7920: 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f         /* Set to
7930: 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20 69   1 if ORDER BY i
7940: 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45  s DESC */.){.  E
7950: 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72  xpr *p;..  asser
7960: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
7970: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72 64  ;.  assert( pOrd
7980: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b  erBy->nExpr>0 );
7990: 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d  .  p = pOrderBy-
79a0: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69  >a[0].pExpr;.  i
79b0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
79c0: 70 72 3d 3d 31 20 26 26 20 70 2d 3e 6f 70 3d 3d  pr==1 && p->op==
79d0: 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e  TK_COLUMN && p->
79e0: 69 54 61 62 6c 65 3d 3d 62 61 73 65 0a 20 20 20  iTable==base.   
79f0: 20 20 20 20 20 20 20 26 26 20 70 2d 3e 69 43 6f         && p->iCo
7a00: 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  lumn==-1 ){.    
7a10: 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42  *pbRev = pOrderB
7a20: 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65  y->a[0].sortOrde
7a30: 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  r;.    return 1;
7a40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
7a50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72  .}../*.** Prepar
7a60: 65 20 61 20 63 72 75 64 65 20 65 73 74 69 6d 61  e a crude estima
7a70: 74 65 20 6f 66 20 74 68 65 20 6c 6f 67 61 72 69  te of the logari
7a80: 74 68 6d 20 6f 66 20 74 68 65 20 69 6e 70 75 74  thm of the input
7a90: 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72   value..** The r
7aa0: 65 73 75 6c 74 73 20 6e 65 65 64 20 6e 6f 74 20  esults need not 
7ab0: 62 65 20 65 78 61 63 74 2e 20 20 54 68 69 73 20  be exact.  This 
7ac0: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
7ad0: 20 65 73 74 69 6d 61 74 69 6e 67 0a 2a 2a 20 74   estimating.** t
7ae0: 68 65 20 74 6f 74 61 6c 20 63 6f 73 74 20 6f 66  he total cost of
7af0: 20 70 65 72 66 6f 72 6d 69 6e 67 20 6f 70 65 72   performing oper
7b00: 61 74 69 6e 67 73 20 77 69 74 68 20 4f 28 6c 6f  atings with O(lo
7b10: 67 4e 29 20 6f 72 20 4f 28 4e 6c 6f 67 4e 29 0a  gN) or O(NlogN).
7b20: 2a 2a 20 63 6f 6d 70 6c 65 78 69 74 79 2e 20 20  ** complexity.  
7b30: 42 65 63 61 75 73 65 20 4e 20 69 73 20 6a 75 73  Because N is jus
7b40: 74 20 61 20 67 75 65 73 73 2c 20 69 74 20 69 73  t a guess, it is
7b50: 20 6e 6f 20 67 72 65 61 74 20 74 72 61 67 65 64   no great traged
7b60: 79 20 69 66 0a 2a 2a 20 6c 6f 67 4e 20 69 73 20  y if.** logN is 
7b70: 61 20 6c 69 74 74 6c 65 20 6f 66 66 2e 0a 2a 2f  a little off..*/
7b80: 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 65  .static double e
7b90: 73 74 4c 6f 67 28 64 6f 75 62 6c 65 20 4e 29 7b  stLog(double N){
7ba0: 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 67 4e 20 3d  .  double logN =
7bb0: 20 31 3b 0a 20 20 64 6f 75 62 6c 65 20 78 20 3d   1;.  double x =
7bc0: 20 31 30 3b 0a 20 20 77 68 69 6c 65 28 20 4e 3e   10;.  while( N>
7bd0: 78 20 29 7b 0a 20 20 20 20 6c 6f 67 4e 20 2b 3d  x ){.    logN +=
7be0: 20 31 3b 0a 20 20 20 20 78 20 2a 3d 20 31 30 3b   1;.    x *= 10;
7bf0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c 6f  .  }.  return lo
7c00: 67 4e 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  gN;.}..#ifndef S
7c10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
7c20: 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 43 6f  ALTABLE./*.** Co
7c30: 6d 70 75 74 65 20 74 68 65 20 62 65 73 74 20 69  mpute the best i
7c40: 6e 64 65 78 20 66 6f 72 20 61 20 76 69 72 74 75  ndex for a virtu
7c50: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
7c60: 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69  The best index i
7c70: 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74 68  s computed by th
7c80: 65 20 78 42 65 73 74 49 6e 64 65 78 20 6d 65 74  e xBestIndex met
7c90: 68 6f 64 20 6f 66 20 74 68 65 20 76 69 72 74 75  hod of the virtu
7ca0: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 6d 6f 64 75  al.** table modu
7cb0: 6c 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  le.  This routin
7cc0: 65 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  e is really just
7cd0: 20 61 20 77 72 61 70 70 65 72 20 74 68 61 74 20   a wrapper that 
7ce0: 73 65 74 73 20 75 70 0a 2a 2a 20 74 68 65 20 73  sets up.** the s
7cf0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
7d00: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
7d10: 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 6d   is used to comm
7d20: 75 6e 69 63 61 74 65 20 77 69 74 68 0a 2a 2a 20  unicate with.** 
7d30: 78 42 65 73 74 49 6e 64 65 78 2e 0a 2a 2a 0a 2a  xBestIndex..**.*
7d40: 2a 20 49 6e 20 61 20 6a 6f 69 6e 2c 20 74 68 69  * In a join, thi
7d50: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
7d60: 62 65 20 63 61 6c 6c 65 64 20 6d 75 6c 74 69 70  be called multip
7d70: 6c 65 20 74 69 6d 65 73 20 66 6f 72 20 74 68 65  le times for the
7d80: 0a 2a 2a 20 73 61 6d 65 20 76 69 72 74 75 61 6c  .** same virtual
7d90: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 73 71 6c   table.  The sql
7da0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
7db0: 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65  structure is cre
7dc0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 69 6e 69 74  ated.** and init
7dd0: 69 61 6c 69 7a 65 64 20 6f 6e 20 74 68 65 20 66  ialized on the f
7de0: 69 72 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20  irst invocation 
7df0: 61 6e 64 20 72 65 75 73 65 64 20 6f 6e 20 61 6c  and reused on al
7e00: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
7e10: 69 6e 76 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  invocations.  Th
7e20: 65 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  e sqlite3_index_
7e30: 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 69  info structure i
7e40: 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65 6e  s also used when
7e50: 0a 2a 2a 20 63 6f 64 65 20 69 73 20 67 65 6e 65  .** code is gene
7e60: 72 61 74 65 64 20 74 6f 20 61 63 63 65 73 73 20  rated to access 
7e70: 74 68 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c  the virtual tabl
7e80: 65 2e 20 20 54 68 65 20 77 68 65 72 65 49 6e 66  e.  The whereInf
7e90: 6f 44 65 6c 65 74 65 28 29 20 0a 2a 2a 20 72 6f  oDelete() .** ro
7ea0: 75 74 69 6e 65 20 74 61 6b 65 73 20 63 61 72 65  utine takes care
7eb0: 20 6f 66 20 66 72 65 65 69 6e 67 20 74 68 65 20   of freeing the 
7ec0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
7ed0: 66 6f 20 73 74 72 75 63 74 75 72 65 20 61 66 74  fo structure aft
7ee0: 65 72 0a 2a 2a 20 65 76 65 72 79 62 6f 64 79 20  er.** everybody 
7ef0: 68 61 73 20 66 69 6e 69 73 68 65 64 20 77 69 74  has finished wit
7f00: 68 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  h it..*/.static 
7f10: 64 6f 75 62 6c 65 20 62 65 73 74 56 69 72 74 75  double bestVirtu
7f20: 61 6c 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  alIndex(.  Parse
7f30: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
7f40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
7f50: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
7f60: 20 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73   */.  WhereClaus
7f70: 65 20 2a 70 57 43 2c 20 20 20 20 20 20 20 20 20  e *pWC,         
7f80: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
7f90: 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 74  E clause */.  st
7fa0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
7fb0: 6d 20 2a 70 53 72 63 2c 20 20 20 20 20 2f 2a 20  m *pSrc,     /* 
7fc0: 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  The FROM clause 
7fd0: 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 2a  term to search *
7fe0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f 74 52  /.  Bitmask notR
7ff0: 65 61 64 79 2c 20 20 20 20 20 20 20 20 20 20 20  eady,           
8000: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75     /* Mask of cu
8010: 72 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e  rsors that are n
8020: 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ot available */.
8030: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64    ExprList *pOrd
8040: 65 72 42 79 2c 20 20 20 20 20 20 20 20 20 20 20  erBy,           
8050: 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62 79   /* The order by
8060: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
8070: 20 6f 72 64 65 72 42 79 55 73 61 62 6c 65 2c 20   orderByUsable, 
8080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8090: 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 6f  rue if we can po
80a0: 74 65 6e 74 69 61 6c 20 73 6f 72 74 20 2a 2f 0a  tential sort */.
80b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
80c0: 69 6e 66 6f 20 2a 2a 70 70 49 64 78 49 6e 66 6f  info **ppIdxInfo
80d0: 20 2f 2a 20 49 6e 64 65 78 20 69 6e 66 6f 72 6d   /* Index inform
80e0: 61 74 69 6f 6e 20 70 61 73 73 65 64 20 74 6f 20  ation passed to 
80f0: 78 42 65 73 74 49 6e 64 65 78 20 2a 2f 0a 29 7b  xBestIndex */.){
8100: 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
8110: 20 70 53 72 63 2d 3e 70 54 61 62 3b 0a 20 20 73   pSrc->pTab;.  s
8120: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8130: 6f 20 2a 70 49 64 78 49 6e 66 6f 3b 0a 20 20 73  o *pIdxInfo;.  s
8140: 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e  truct sqlite3_in
8150: 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 20 2a  dex_constraint *
8160: 70 49 64 78 43 6f 6e 73 3b 0a 20 20 73 74 72 75  pIdxCons;.  stru
8170: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
8180: 5f 6f 72 64 65 72 62 79 20 2a 70 49 64 78 4f 72  _orderby *pIdxOr
8190: 64 65 72 42 79 3b 0a 20 20 73 74 72 75 63 74 20  derBy;.  struct 
81a0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f  sqlite3_index_co
81b0: 6e 73 74 72 61 69 6e 74 5f 75 73 61 67 65 20 2a  nstraint_usage *
81c0: 70 55 73 61 67 65 3b 0a 20 20 57 68 65 72 65 54  pUsage;.  WhereT
81d0: 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 69 6e  erm *pTerm;.  in
81e0: 74 20 69 2c 20 6a 3b 0a 20 20 69 6e 74 20 6e 4f  t i, j;.  int nO
81f0: 72 64 65 72 42 79 3b 0a 0a 20 20 2f 2a 20 49 66  rderBy;..  /* If
8200: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e 64   the sqlite3_ind
8210: 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75 72  ex_info structur
8220: 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 70  e has not been p
8230: 72 65 76 69 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  reviously.  ** a
8240: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 6e 69  llocated and ini
8250: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 74 68 69  tialized for thi
8260: 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c  s virtual table,
8270: 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 0a 20   then allocate. 
8280: 20 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69   ** and initiali
8290: 7a 65 20 69 74 20 6e 6f 77 0a 20 20 2a 2f 0a 20  ze it now.  */. 
82a0: 20 70 49 64 78 49 6e 66 6f 20 3d 20 2a 70 70 49   pIdxInfo = *ppI
82b0: 64 78 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 49  dxInfo;.  if( pI
82c0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
82d0: 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72   WhereTerm *pTer
82e0: 6d 3b 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  m;.    int nTerm
82f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e 74 20  ;..    /* Count 
8300: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
8310: 73 73 69 62 6c 65 20 57 48 45 52 45 20 63 6c 61  ssible WHERE cla
8320: 75 73 65 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  use constraints 
8330: 72 65 66 65 72 72 69 6e 67 0a 20 20 20 20 2a 2a  referring.    **
8340: 20 74 6f 20 74 68 69 73 20 76 69 72 74 75 61 6c   to this virtual
8350: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f   table */.    fo
8360: 72 28 69 3d 6e 54 65 72 6d 3d 30 2c 20 70 54 65  r(i=nTerm=0, pTe
8370: 72 6d 3d 70 57 43 2d 3e 61 3b 20 69 3c 70 57 43  rm=pWC->a; i<pWC
8380: 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b 2c 20 70 54  ->nTerm; i++, pT
8390: 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  erm++){.      if
83a0: 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43 75 72  ( pTerm->leftCur
83b0: 73 6f 72 20 21 3d 20 70 53 72 63 2d 3e 69 43 75  sor != pSrc->iCu
83c0: 72 73 6f 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  rsor ) continue;
83d0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d  .      if( pTerm
83e0: 2d 3e 65 4f 70 65 72 61 74 6f 72 3d 3d 57 4f 5f  ->eOperator==WO_
83f0: 49 4e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  IN ) continue;. 
8400: 20 20 20 20 20 6e 54 65 72 6d 2b 2b 3b 0a 20 20       nTerm++;.  
8410: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
8420: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
8430: 73 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79  se contains only
8440: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8450: 63 75 72 72 65 6e 74 20 0a 20 20 20 20 2a 2a 20  current .    ** 
8460: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 68  virtual table th
8470: 65 6e 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  en allocate spac
8480: 65 20 66 6f 72 20 74 68 65 20 61 4f 72 64 65 72  e for the aOrder
8490: 42 79 20 70 61 72 74 20 6f 66 0a 20 20 20 20 2a  By part of.    *
84a0: 2a 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6e  * the sqlite3_in
84b0: 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74 75  dex_info structu
84c0: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  re..    */.    n
84d0: 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20  OrderBy = 0;.   
84e0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 20 29 7b   if( pOrderBy ){
84f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
8500: 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  i<pOrderBy->nExp
8510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
8520: 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70   Expr *pExpr = p
8530: 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45  OrderBy->a[i].pE
8540: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  xpr;.        if(
8550: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43   pExpr->op!=TK_C
8560: 4f 4c 55 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  OLUMN || pExpr->
8570: 69 54 61 62 6c 65 21 3d 70 53 72 63 2d 3e 69 43  iTable!=pSrc->iC
8580: 75 72 73 6f 72 20 29 20 62 72 65 61 6b 3b 0a 20  ursor ) break;. 
8590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
85a0: 20 69 3d 3d 70 4f 72 64 65 72 42 79 2d 3e 6e 45   i==pOrderBy->nE
85b0: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  xpr ){.        n
85c0: 4f 72 64 65 72 42 79 20 3d 20 70 4f 72 64 65 72  OrderBy = pOrder
85d0: 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  By->nExpr;.     
85e0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
85f0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
8600: 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f  lite3_index_info
8610: 20 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 2a   structure.    *
8620: 2f 0a 20 20 20 20 70 49 64 78 49 6e 66 6f 20 3d  /.    pIdxInfo =
8630: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
8640: 69 7a 65 6f 66 28 2a 70 49 64 78 49 6e 66 6f 29  izeof(*pIdxInfo)
8650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
8670: 28 73 69 7a 65 6f 66 28 2a 70 49 64 78 43 6f 6e  (sizeof(*pIdxCon
8680: 73 29 20 2b 20 73 69 7a 65 6f 66 28 2a 70 55 73  s) + sizeof(*pUs
8690: 61 67 65 29 29 2a 6e 54 65 72 6d 0a 20 20 20 20  age))*nTerm.    
86a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86b0: 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
86c0: 66 28 2a 70 49 64 78 4f 72 64 65 72 42 79 29 2a  f(*pIdxOrderBy)*
86d0: 6e 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20 20  nOrderBy );.    
86e0: 69 66 28 20 70 49 64 78 49 6e 66 6f 3d 3d 30 20  if( pIdxInfo==0 
86f0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8700: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8710: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
8720: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8730: 30 2e 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  0.0;.    }.    *
8740: 70 70 49 64 78 49 6e 66 6f 20 3d 20 70 49 64 78  ppIdxInfo = pIdx
8750: 49 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e  Info;..    /* In
8760: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 74 72  itialize the str
8770: 75 63 74 75 72 65 2e 20 20 54 68 65 20 73 71 6c  ucture.  The sql
8780: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
8790: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
87a0: 6e 73 0a 20 20 20 20 2a 2a 20 6d 61 6e 79 20 66  ns.    ** many f
87b0: 69 65 6c 64 73 20 74 68 61 74 20 61 72 65 20 64  ields that are d
87c0: 65 63 6c 61 72 65 64 20 22 63 6f 6e 73 74 22 20  eclared "const" 
87d0: 74 6f 20 70 72 65 76 65 6e 74 20 78 42 65 73 74  to prevent xBest
87e0: 49 6e 64 65 78 20 66 72 6f 6d 0a 20 20 20 20 2a  Index from.    *
87f0: 2a 20 63 68 61 6e 67 69 6e 67 20 74 68 65 6d 2e  * changing them.
8800: 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
8810: 73 6f 6d 65 20 66 75 6e 6b 79 20 63 61 73 74 69  some funky casti
8820: 6e 67 20 69 6e 20 6f 72 64 65 72 20 74 6f 0a 20  ng in order to. 
8830: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
8840: 20 74 68 6f 73 65 20 66 69 65 6c 64 73 2e 0a 20   those fields.. 
8850: 20 20 20 2a 2f 0a 20 20 20 20 70 49 64 78 43 6f     */.    pIdxCo
8860: 6e 73 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ns = (struct sql
8870: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8880: 72 61 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f  raint*)&pIdxInfo
8890: 5b 31 5d 3b 0a 20 20 20 20 70 49 64 78 4f 72 64  [1];.    pIdxOrd
88a0: 65 72 42 79 20 3d 20 28 73 74 72 75 63 74 20 73  erBy = (struct s
88b0: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64  qlite3_index_ord
88c0: 65 72 62 79 2a 29 26 70 49 64 78 43 6f 6e 73 5b  erby*)&pIdxCons[
88d0: 6e 54 65 72 6d 5d 3b 0a 20 20 20 20 70 55 73 61  nTerm];.    pUsa
88e0: 67 65 20 3d 20 28 73 74 72 75 63 74 20 73 71 6c  ge = (struct sql
88f0: 69 74 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74  ite3_index_const
8900: 72 61 69 6e 74 5f 75 73 61 67 65 2a 29 26 70 49  raint_usage*)&pI
8910: 64 78 4f 72 64 65 72 42 79 5b 6e 4f 72 64 65 72  dxOrderBy[nOrder
8920: 42 79 5d 3b 0a 20 20 20 20 2a 28 69 6e 74 2a 29  By];.    *(int*)
8930: 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73  &pIdxInfo->nCons
8940: 74 72 61 69 6e 74 20 3d 20 6e 54 65 72 6d 3b 0a  traint = nTerm;.
8950: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
8960: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
8970: 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 2a   nOrderBy;.    *
8980: 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f  (struct sqlite3_
8990: 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
89a0: 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e 61 43  **)&pIdxInfo->aC
89b0: 6f 6e 73 74 72 61 69 6e 74 20 3d 20 70 49 64 78  onstraint = pIdx
89c0: 43 6f 6e 73 3b 0a 20 20 20 20 2a 28 73 74 72 75  Cons;.    *(stru
89d0: 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78  ct sqlite3_index
89e0: 5f 6f 72 64 65 72 62 79 2a 2a 29 26 70 49 64 78  _orderby**)&pIdx
89f0: 49 6e 66 6f 2d 3e 61 4f 72 64 65 72 42 79 20 3d  Info->aOrderBy =
8a00: 20 70 49 64 78 4f 72 64 65 72 42 79 3b 0a 20 20   pIdxOrderBy;.  
8a10: 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74    *(struct sqlit
8a20: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
8a30: 69 6e 74 5f 75 73 61 67 65 2a 2a 29 26 70 49 64  int_usage**)&pId
8a40: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
8a50: 6e 74 55 73 61 67 65 20 3d 0a 20 20 20 20 20 20  ntUsage =.      
8a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
8aa0: 55 73 61 67 65 3b 0a 0a 20 20 20 20 66 6f 72 28  Usage;..    for(
8ab0: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  i=j=0, pTerm=pWC
8ac0: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
8ad0: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
8ae0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
8af0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
8b00: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
8b10: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
8b20: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
8b30: 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63  rator==WO_IN ) c
8b40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
8b50: 49 64 78 43 6f 6e 73 5b 6a 5d 2e 69 43 6f 6c 75  IdxCons[j].iColu
8b60: 6d 6e 20 3d 20 70 54 65 72 6d 2d 3e 6c 65 66 74  mn = pTerm->left
8b70: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49  Column;.      pI
8b80: 64 78 43 6f 6e 73 5b 6a 5d 2e 69 54 65 72 6d 4f  dxCons[j].iTermO
8b90: 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 20 20 20  ffset = i;.     
8ba0: 20 70 49 64 78 43 6f 6e 73 5b 6a 5d 2e 6f 70 20   pIdxCons[j].op 
8bb0: 3d 20 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74  = pTerm->eOperat
8bc0: 6f 72 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  or;.      /* The
8bd0: 20 64 69 72 65 63 74 20 61 73 73 69 67 6e 6d 65   direct assignme
8be0: 6e 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  nt in the previo
8bf0: 75 73 20 6c 69 6e 65 20 69 73 20 70 6f 73 73 69  us line is possi
8c00: 62 6c 65 20 6f 6e 6c 79 20 62 65 63 61 75 73 65  ble only because
8c10: 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 57 4f  .      ** the WO
8c20: 5f 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4e 44  _ and SQLITE_IND
8c30: 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 20 63  EX_CONSTRAINT_ c
8c40: 6f 64 65 73 20 61 72 65 20 69 64 65 6e 74 69 63  odes are identic
8c50: 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20 20 2a  al.  The.      *
8c60: 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  * following asse
8c70: 72 74 73 20 76 65 72 69 66 79 20 74 68 69 73 20  rts verify this 
8c80: 66 61 63 74 2e 20 2a 2f 0a 20 20 20 20 20 20 61  fact. */.      a
8c90: 73 73 65 72 74 28 20 57 4f 5f 45 51 3d 3d 53 51  ssert( WO_EQ==SQ
8ca0: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8cb0: 52 41 49 4e 54 5f 45 51 20 29 3b 0a 20 20 20 20  RAINT_EQ );.    
8cc0: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 4c 54 3d    assert( WO_LT=
8cd0: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8ce0: 4e 53 54 52 41 49 4e 54 5f 4c 54 20 29 3b 0a 20  NSTRAINT_LT );. 
8cf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8d00: 4c 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  LE==SQLITE_INDEX
8d10: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4c 45 20 29  _CONSTRAINT_LE )
8d20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8d30: 57 4f 5f 47 54 3d 3d 53 51 4c 49 54 45 5f 49 4e  WO_GT==SQLITE_IN
8d40: 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47  DEX_CONSTRAINT_G
8d50: 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  T );.      asser
8d60: 74 28 20 57 4f 5f 47 45 3d 3d 53 51 4c 49 54 45  t( WO_GE==SQLITE
8d70: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8d80: 54 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  T_GE );.      as
8d90: 73 65 72 74 28 20 57 4f 5f 4d 41 54 43 48 3d 3d  sert( WO_MATCH==
8da0: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8db0: 53 54 52 41 49 4e 54 5f 4d 41 54 43 48 20 29 3b  STRAINT_MATCH );
8dc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8dd0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
8de0: 26 20 28 57 4f 5f 45 51 7c 57 4f 5f 4c 54 7c 57  & (WO_EQ|WO_LT|W
8df0: 4f 5f 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45  O_LE|WO_GT|WO_GE
8e00: 7c 57 4f 5f 4d 41 54 43 48 29 20 29 3b 0a 20 20  |WO_MATCH) );.  
8e10: 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
8e20: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f     for(i=0; i<nO
8e30: 72 64 65 72 42 79 3b 20 69 2b 2b 29 7b 0a 20 20  rderBy; i++){.  
8e40: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20      Expr *pExpr 
8e50: 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d  = pOrderBy->a[i]
8e60: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 70 49  .pExpr;.      pI
8e70: 64 78 4f 72 64 65 72 42 79 5b 69 5d 2e 69 43 6f  dxOrderBy[i].iCo
8e80: 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  lumn = pExpr->iC
8e90: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 70 49 64  olumn;.      pId
8ea0: 78 4f 72 64 65 72 42 79 5b 69 5d 2e 64 65 73 63  xOrderBy[i].desc
8eb0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69   = pOrderBy->a[i
8ec0: 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20  ].sortOrder;.   
8ed0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20   }.  }..  /* At 
8ee0: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 20  this point, the 
8ef0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
8f00: 66 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61  fo structure tha
8f10: 74 20 70 49 64 78 49 6e 66 6f 20 70 6f 69 6e 74  t pIdxInfo point
8f20: 73 0a 20 20 2a 2a 20 74 6f 20 77 69 6c 6c 20 68  s.  ** to will h
8f30: 61 76 65 20 62 65 65 6e 20 69 6e 69 74 69 61 6c  ave been initial
8f40: 69 7a 65 64 2c 20 65 69 74 68 65 72 20 64 75 72  ized, either dur
8f50: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
8f60: 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 72 0a 20 20  invocation or.  
8f70: 2a 2a 20 64 75 72 69 6e 67 20 73 6f 6d 65 20 70  ** during some p
8f80: 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  rior invocation.
8f90: 20 20 4e 6f 77 20 77 65 20 6a 75 73 74 20 68 61    Now we just ha
8fa0: 76 65 20 74 6f 20 63 75 73 74 6f 6d 69 7a 65 20  ve to customize 
8fb0: 74 68 65 0a 20 20 2a 2a 20 64 65 74 61 69 6c 73  the.  ** details
8fc0: 20 6f 66 20 70 49 64 78 49 6e 66 6f 20 66 6f 72   of pIdxInfo for
8fd0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 76   the current inv
8fe0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ocation and pass
8ff0: 20 69 74 20 74 6f 0a 20 20 2a 2a 20 78 42 65 73   it to.  ** xBes
9000: 74 49 6e 64 65 78 2e 0a 20 20 2a 2f 0a 0a 20 20  tIndex..  */..  
9010: 2f 2a 20 54 68 65 20 6d 6f 64 75 6c 65 20 6e 61  /* The module na
9020: 6d 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  me must be defin
9030: 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ed */.  assert( 
9040: 70 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72  pTab->azModuleAr
9050: 67 20 26 26 20 70 54 61 62 2d 3e 61 7a 4d 6f 64  g && pTab->azMod
9060: 75 6c 65 41 72 67 5b 30 5d 20 29 3b 0a 20 20 69  uleArg[0] );.  i
9070: 66 28 20 70 54 61 62 2d 3e 70 56 74 61 62 3d 3d  f( pTab->pVtab==
9080: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
9090: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
90a0: 20 22 75 6e 64 65 66 69 6e 65 64 20 6d 6f 64 75   "undefined modu
90b0: 6c 65 20 25 73 20 66 6f 72 20 74 61 62 6c 65 20  le %s for table 
90c0: 25 73 22 2c 0a 20 20 20 20 20 20 20 20 70 54 61  %s",.        pTa
90d0: 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67 5b 30  b->azModuleArg[0
90e0: 5d 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b  ], pTab->zName);
90f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b  .    return 0.0;
9100: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74  .  }..  /* Set t
9110: 68 65 20 61 43 6f 6e 73 74 72 61 69 6e 74 5b 5d  he aConstraint[]
9120: 2e 75 73 61 62 6c 65 20 66 69 65 6c 64 73 20 61  .usable fields a
9130: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 6c  nd initialize al
9140: 6c 20 0a 20 20 2a 2a 20 6f 75 74 70 75 74 20 76  l .  ** output v
9150: 61 72 69 61 62 6c 65 73 20 74 6f 20 7a 65 72 6f  ariables to zero
9160: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 43 6f 6e  ..  **.  ** aCon
9170: 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c 65  straint[].usable
9180: 20 69 73 20 74 72 75 65 20 66 6f 72 20 63 6f 6e   is true for con
9190: 73 74 72 61 69 6e 74 73 20 77 68 65 72 65 20 74  straints where t
91a0: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 20 20  he right-hand.  
91b0: 2a 2a 20 73 69 64 65 20 63 6f 6e 74 61 69 6e 73  ** side contains
91c0: 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 73   only references
91d0: 20 74 6f 20 74 61 62 6c 65 73 20 74 6f 20 74 68   to tables to th
91e0: 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 63 75  e left of the cu
91f0: 72 72 65 6e 74 0a 20 20 2a 2a 20 74 61 62 6c 65  rrent.  ** table
9200: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
9210: 73 2c 20 69 66 20 74 68 65 20 63 6f 6e 73 74 72  s, if the constr
9220: 61 69 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  aint is of the f
9230: 6f 72 6d 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  orm:.  **.  **  
9240: 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
9250: 3d 20 65 78 70 72 0a 20 20 2a 2a 0a 20 20 2a 2a  = expr.  **.  **
9260: 20 61 6e 64 20 77 65 20 61 72 65 20 65 76 61 6c   and we are eval
9270: 75 61 74 69 6e 67 20 61 20 6a 6f 69 6e 2c 20 74  uating a join, t
9280: 68 65 6e 20 74 68 65 20 63 6f 6e 73 74 72 61 69  hen the constrai
9290: 6e 74 20 6f 6e 20 63 6f 6c 75 6d 6e 20 69 73 20  nt on column is 
92a0: 0a 20 20 2a 2a 20 6f 6e 6c 79 20 76 61 6c 69 64  .  ** only valid
92b0: 20 69 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 72   if all tables r
92c0: 65 66 65 72 65 6e 63 65 64 20 69 6e 20 65 78 70  eferenced in exp
92d0: 72 20 6f 63 63 75 72 20 74 6f 20 74 68 65 20 6c  r occur to the l
92e0: 65 66 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  eft.  ** of the 
92f0: 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
9300: 20 63 6f 6c 75 6d 6e 2e 0a 20 20 2a 2a 0a 20 20   column..  **.  
9310: 2a 2a 20 54 68 65 20 61 43 6f 6e 73 74 72 61 69  ** The aConstrai
9320: 6e 74 73 5b 5d 20 61 72 72 61 79 20 63 6f 6e 74  nts[] array cont
9330: 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72  ains entries for
9340: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
9350: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 63 75 72  .  ** on the cur
9360: 72 65 6e 74 20 74 61 62 6c 65 2e 20 20 54 68 61  rent table.  Tha
9370: 74 20 77 61 79 20 77 65 20 6f 6e 6c 79 20 68 61  t way we only ha
9380: 76 65 20 74 6f 20 63 6f 6d 70 75 74 65 20 69 74  ve to compute it
9390: 20 6f 6e 63 65 0a 20 20 2a 2a 20 65 76 65 6e 20   once.  ** even 
93a0: 74 68 6f 75 67 68 20 77 65 20 6d 69 67 68 74 20  though we might 
93b0: 74 72 79 20 74 6f 20 70 69 63 6b 20 74 68 65 20  try to pick the 
93c0: 62 65 73 74 20 69 6e 64 65 78 20 6d 75 6c 74 69  best index multi
93d0: 70 6c 65 20 74 69 6d 65 73 2e 0a 20 20 2a 2a 20  ple times..  ** 
93e0: 46 6f 72 20 65 61 63 68 20 61 74 74 65 6d 70 74  For each attempt
93f0: 20 61 74 20 70 69 63 6b 69 6e 67 20 61 6e 20 69   at picking an i
9400: 6e 64 65 78 2c 20 74 68 65 20 6f 72 64 65 72 20  ndex, the order 
9410: 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  of tables in the
9420: 0a 20 20 2a 2a 20 6a 6f 69 6e 20 6d 69 67 68 74  .  ** join might
9430: 20 62 65 20 64 69 66 66 65 72 65 6e 74 20 73 6f   be different so
9440: 20 77 65 20 68 61 76 65 20 74 6f 20 72 65 63 6f   we have to reco
9450: 6d 70 75 74 65 20 74 68 65 20 75 73 61 62 6c 65  mpute the usable
9460: 20 66 6c 61 67 0a 20 20 2a 2a 20 65 61 63 68 20   flag.  ** each 
9470: 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 70 49 64  time..  */.  pId
9480: 78 43 6f 6e 73 20 3d 20 2a 28 73 74 72 75 63 74  xCons = *(struct
9490: 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
94a0: 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49 64  onstraint**)&pId
94b0: 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69  xInfo->aConstrai
94c0: 6e 74 3b 0a 20 20 70 55 73 61 67 65 20 3d 20 70  nt;.  pUsage = p
94d0: 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72  IdxInfo->aConstr
94e0: 61 69 6e 74 55 73 61 67 65 3b 0a 20 20 66 6f 72  aintUsage;.  for
94f0: 28 69 3d 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f  (i=0; i<pIdxInfo
9500: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69  ->nConstraint; i
9510: 2b 2b 2c 20 70 49 64 78 43 6f 6e 73 2b 2b 29 7b  ++, pIdxCons++){
9520: 0a 20 20 20 20 6a 20 3d 20 70 49 64 78 43 6f 6e  .    j = pIdxCon
9530: 73 2d 3e 69 54 65 72 6d 4f 66 66 73 65 74 3b 0a  s->iTermOffset;.
9540: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 70 57 43      pTerm = &pWC
9550: 2d 3e 61 5b 6a 5d 3b 0a 20 20 20 20 70 49 64 78  ->a[j];.    pIdx
9560: 43 6f 6e 73 2d 3e 75 73 61 62 6c 65 20 3d 20 20  Cons->usable =  
9570: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
9580: 67 68 74 20 26 20 6e 6f 74 52 65 61 64 79 29 3d  ght & notReady)=
9590: 3d 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  =0;.  }.  memset
95a0: 28 70 55 73 61 67 65 2c 20 30 2c 20 73 69 7a 65  (pUsage, 0, size
95b0: 6f 66 28 70 55 73 61 67 65 5b 30 5d 29 2a 70 49  of(pUsage[0])*pI
95c0: 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61  dxInfo->nConstra
95d0: 69 6e 74 29 3b 0a 20 20 69 66 28 20 70 49 64 78  int);.  if( pIdx
95e0: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
95f0: 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 73 71  IdxStr ){.    sq
9600: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 78 49  lite3_free(pIdxI
9610: 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b 0a 20 20  nfo->idxStr);.  
9620: 7d 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64  }.  pIdxInfo->id
9630: 78 53 74 72 20 3d 20 30 3b 0a 20 20 70 49 64 78  xStr = 0;.  pIdx
9640: 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 20 3d 20 30  Info->idxNum = 0
9650: 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65  ;.  pIdxInfo->ne
9660: 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
9670: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
9680: 6f 72 64 65 72 42 79 43 6f 6e 73 75 6d 65 64 20  orderByConsumed 
9690: 3d 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d  = 0;.  pIdxInfo-
96a0: 3e 65 73 74 69 6d 61 74 65 64 43 6f 73 74 20 3d  >estimatedCost =
96b0: 20 53 51 4c 49 54 45 5f 42 49 47 5f 44 42 4c 3b   SQLITE_BIG_DBL;
96c0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
96d0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
96e0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
96f0: 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f  ->nOrderBy && !o
9700: 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a  rderByUsable ){.
9710: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
9720: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
9730: 20 30 3b 0a 20 20 7d 0a 20 20 70 54 61 62 2d 3e   0;.  }.  pTab->
9740: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 2d 3e  pVtab->pModule->
9750: 78 42 65 73 74 49 6e 64 65 78 28 70 54 61 62 2d  xBestIndex(pTab-
9760: 3e 70 56 74 61 62 2c 20 70 49 64 78 49 6e 66 6f  >pVtab, pIdxInfo
9770: 29 3b 0a 20 20 2a 28 69 6e 74 2a 29 26 70 49 64  );.  *(int*)&pId
9780: 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20  xInfo->nOrderBy 
9790: 3d 20 6e 4f 72 64 65 72 42 79 3b 0a 20 20 72 65  = nOrderBy;.  re
97a0: 74 75 72 6e 20 70 49 64 78 49 6e 66 6f 2d 3e 65  turn pIdxInfo->e
97b0: 73 74 69 6d 61 74 65 64 43 6f 73 74 3b 0a 7d 0a  stimatedCost;.}.
97c0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
97d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
97e0: 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  LE */../*.** Fin
97f0: 64 20 74 68 65 20 62 65 73 74 20 69 6e 64 65 78  d the best index
9800: 20 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 61   for accessing a
9810: 20 70 61 72 74 69 63 75 6c 61 72 20 74 61 62 6c   particular tabl
9820: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
9830: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 69  nter.** to the i
9840: 6e 64 65 78 2c 20 66 6c 61 67 73 20 74 68 61 74  ndex, flags that
9850: 20 64 65 73 63 72 69 62 65 20 68 6f 77 20 74 68   describe how th
9860: 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
9870: 65 20 75 73 65 64 2c 20 74 68 65 0a 2a 2a 20 6e  e used, the.** n
9880: 75 6d 62 65 72 20 6f 66 20 65 71 75 61 6c 69 74  umber of equalit
9890: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 2c 20 61  y constraints, a
98a0: 6e 64 20 74 68 65 20 22 63 6f 73 74 22 20 66 6f  nd the "cost" fo
98b0: 72 20 74 68 69 73 20 69 6e 64 65 78 2e 0a 2a 2a  r this index..**
98c0: 0a 2a 2a 20 54 68 65 20 6c 6f 77 65 73 74 20 63  .** The lowest c
98d0: 6f 73 74 20 69 6e 64 65 78 20 77 69 6e 73 2e 20  ost index wins. 
98e0: 20 54 68 65 20 63 6f 73 74 20 69 73 20 61 6e 20   The cost is an 
98f0: 65 73 74 69 6d 61 74 65 20 6f 66 20 74 68 65 20  estimate of the 
9900: 61 6d 6f 75 6e 74 20 6f 66 0a 2a 2a 20 43 50 55  amount of.** CPU
9910: 20 61 6e 64 20 64 69 73 6b 20 49 2f 4f 20 6e 65   and disk I/O ne
9920: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
9930: 65 20 72 65 71 75 65 73 74 20 75 73 69 6e 67 20  e request using 
9940: 74 68 65 20 73 65 6c 65 63 74 65 64 20 69 6e 64  the selected ind
9950: 65 78 2e 0a 2a 2a 20 46 61 63 74 6f 72 73 20 74  ex..** Factors t
9960: 68 61 74 20 69 6e 66 6c 75 65 6e 63 65 20 63 6f  hat influence co
9970: 73 74 20 69 6e 63 6c 75 64 65 3a 0a 2a 2a 0a 2a  st include:.**.*
9980: 2a 20 20 20 20 2a 20 20 54 68 65 20 65 73 74 69  *    *  The esti
9990: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
99a0: 72 6f 77 73 20 74 68 61 74 20 77 69 6c 6c 20 62  rows that will b
99b0: 65 20 72 65 74 72 69 65 76 65 64 2e 20 20 28 54  e retrieved.  (T
99c0: 68 65 0a 2a 2a 20 20 20 20 20 20 20 66 65 77 65  he.**       fewe
99d0: 72 20 74 68 65 20 62 65 74 74 65 72 2e 29 0a 2a  r the better.).*
99e0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68  *.**    *  Wheth
99f0: 65 72 20 6f 72 20 6e 6f 74 20 73 6f 72 74 69 6e  er or not sortin
9a00: 67 20 6d 75 73 74 20 6f 63 63 75 72 2e 0a 2a 2a  g must occur..**
9a10: 0a 2a 2a 20 20 20 20 2a 20 20 57 68 65 74 68 65  .**    *  Whethe
9a20: 72 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 6d  r or not there m
9a30: 75 73 74 20 62 65 20 73 65 70 61 72 61 74 65 20  ust be separate 
9a40: 6c 6f 6f 6b 75 70 73 20 69 6e 20 74 68 65 0a 2a  lookups in the.*
9a50: 2a 20 20 20 20 20 20 20 69 6e 64 65 78 20 61 6e  *       index an
9a60: 64 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 74 61  d in the main ta
9a70: 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ble..**.*/.stati
9a80: 63 20 64 6f 75 62 6c 65 20 62 65 73 74 49 6e 64  c double bestInd
9a90: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
9aa0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  rse,            
9ab0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
9ac0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
9ad0: 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20  ereClause *pWC, 
9ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9af0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
9b00: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
9b10: 74 5f 69 74 65 6d 20 2a 70 53 72 63 2c 20 20 2f  t_item *pSrc,  /
9b20: 2a 20 54 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * The FROM claus
9b30: 65 20 74 65 72 6d 20 74 6f 20 73 65 61 72 63 68  e term to search
9b40: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6e 6f   */.  Bitmask no
9b50: 74 52 65 61 64 79 2c 20 20 20 20 20 20 20 20 20  tReady,         
9b60: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 75 72    /* Mask of cur
9b70: 73 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f  sors that are no
9b80: 74 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20  t available */. 
9b90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65   ExprList *pOrde
9ba0: 72 42 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rBy,         /* 
9bb0: 54 68 65 20 6f 72 64 65 72 20 62 79 20 63 6c 61  The order by cla
9bc0: 75 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  use */.  Index *
9bd0: 2a 70 70 49 6e 64 65 78 2c 20 20 20 20 20 20 20  *ppIndex,       
9be0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 2a 70 70       /* Make *pp
9bf0: 49 6e 64 65 78 20 70 6f 69 6e 74 20 74 6f 20 74  Index point to t
9c00: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 2a 2f  he best index */
9c10: 0a 20 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20  .  int *pFlags, 
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c30: 2a 20 50 75 74 20 66 6c 61 67 73 20 64 65 73 63  * Put flags desc
9c40: 72 69 62 69 6e 67 20 74 68 69 73 20 63 68 6f 69  ribing this choi
9c50: 63 65 20 69 6e 20 2a 70 46 6c 61 67 73 20 2a 2f  ce in *pFlags */
9c60: 0a 20 20 69 6e 74 20 2a 70 6e 45 71 20 20 20 20  .  int *pnEq    
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9c80: 2a 20 50 75 74 20 74 68 65 20 6e 75 6d 62 65 72  * Put the number
9c90: 20 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e   of == or IN con
9ca0: 73 74 72 61 69 6e 74 73 20 68 65 72 65 20 2a 2f  straints here */
9cb0: 0a 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20  .){.  WhereTerm 
9cc0: 2a 70 54 65 72 6d 3b 0a 20 20 49 6e 64 65 78 20  *pTerm;.  Index 
9cd0: 2a 62 65 73 74 49 64 78 20 3d 20 30 3b 20 20 20  *bestIdx = 0;   
9ce0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
9cf0: 68 61 74 20 67 69 76 65 73 20 74 68 65 20 6c 6f  hat gives the lo
9d00: 77 65 73 74 20 63 6f 73 74 20 2a 2f 0a 20 20 64  west cost */.  d
9d10: 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43 6f 73 74  ouble lowestCost
9d20: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
9d30: 65 20 63 6f 73 74 20 6f 66 20 75 73 69 6e 67 20  e cost of using 
9d40: 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69 6e 74  bestIdx */.  int
9d50: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 30 3b 20   bestFlags = 0; 
9d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
9d70: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
9d80: 68 20 62 65 73 74 49 64 78 20 2a 2f 0a 20 20 69  h bestIdx */.  i
9d90: 6e 74 20 62 65 73 74 4e 45 71 20 3d 20 30 3b 20  nt bestNEq = 0; 
9da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65             /* Be
9db0: 73 74 20 76 61 6c 75 65 20 66 6f 72 20 6e 45 71  st value for nEq
9dc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d   */.  int iCur =
9dd0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 3b 20   pSrc->iCursor; 
9de0: 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20    /* The cursor 
9df0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20  of the table to 
9e00: 62 65 20 61 63 63 65 73 73 65 64 20 2a 2f 0a 20  be accessed */. 
9e10: 20 49 6e 64 65 78 20 2a 70 50 72 6f 62 65 3b 20   Index *pProbe; 
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9e30: 41 6e 20 69 6e 64 65 78 20 77 65 20 61 72 65 20  An index we are 
9e40: 65 76 61 6c 75 61 74 69 6e 67 20 2a 2f 0a 20 20  evaluating */.  
9e50: 69 6e 74 20 72 65 76 3b 20 20 20 20 20 20 20 20  int rev;        
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9e70: 72 75 65 20 74 6f 20 73 63 61 6e 20 69 6e 20 72  rue to scan in r
9e80: 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
9e90: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9eb0: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
9ec0: 64 20 77 69 74 68 20 70 50 72 6f 62 65 20 2a 2f  d with pProbe */
9ed0: 0a 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20 20  .  int nEq;     
9ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9ef0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f  * Number of == o
9f00: 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  r IN constraints
9f10: 20 2a 2f 0a 20 20 64 6f 75 62 6c 65 20 63 6f 73   */.  double cos
9f20: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
9f30: 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 75 73 69    /* Cost of usi
9f40: 6e 67 20 70 50 72 6f 62 65 20 2a 2f 0a 0a 20 20  ng pProbe */..  
9f50: 54 52 41 43 45 28 28 22 62 65 73 74 49 6e 64 65  TRACE(("bestInde
9f60: 78 3a 20 74 62 6c 3d 25 73 20 6e 6f 74 52 65 61  x: tbl=%s notRea
9f70: 64 79 3d 25 78 5c 6e 22 2c 20 70 53 72 63 2d 3e  dy=%x\n", pSrc->
9f80: 70 54 61 62 2d 3e 7a 4e 61 6d 65 2c 20 6e 6f 74  pTab->zName, not
9f90: 52 65 61 64 79 29 29 3b 0a 20 20 6c 6f 77 65 73  Ready));.  lowes
9fa0: 74 43 6f 73 74 20 3d 20 53 51 4c 49 54 45 5f 42  tCost = SQLITE_B
9fb0: 49 47 5f 44 42 4c 3b 0a 20 20 70 50 72 6f 62 65  IG_DBL;.  pProbe
9fc0: 20 3d 20 70 53 72 63 2d 3e 70 54 61 62 2d 3e 70   = pSrc->pTab->p
9fd0: 49 6e 64 65 78 3b 0a 0a 20 20 2f 2a 20 49 66 20  Index;..  /* If 
9fe0: 74 68 65 20 74 61 62 6c 65 20 68 61 73 20 6e 6f  the table has no
9ff0: 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65   indices and the
a000: 72 65 20 61 72 65 20 6e 6f 20 74 65 72 6d 73 20  re are no terms 
a010: 69 6e 20 74 68 65 20 77 68 65 72 65 0a 20 20 2a  in the where.  *
a020: 2a 20 63 6c 61 75 73 65 20 74 68 61 74 20 72 65  * clause that re
a030: 66 65 72 20 74 6f 20 74 68 65 20 52 4f 57 49 44  fer to the ROWID
a040: 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  , then we will n
a050: 65 76 65 72 20 62 65 20 61 62 6c 65 20 74 6f 20  ever be able to 
a060: 64 6f 0a 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67  do.  ** anything
a070: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 20 66 75   other than a fu
a080: 6c 6c 20 74 61 62 6c 65 20 73 63 61 6e 20 6f 6e  ll table scan on
a090: 20 74 68 69 73 20 74 61 62 6c 65 2e 20 20 57 65   this table.  We
a0a0: 20 6d 69 67 68 74 20 61 73 0a 20 20 2a 2a 20 77   might as.  ** w
a0b0: 65 6c 6c 20 70 75 74 20 69 74 20 66 69 72 73 74  ell put it first
a0c0: 20 69 6e 20 74 68 65 20 6a 6f 69 6e 20 6f 72 64   in the join ord
a0d0: 65 72 2e 20 20 54 68 61 74 20 77 61 79 2c 20 70  er.  That way, p
a0e0: 65 72 68 61 70 73 20 69 74 20 63 61 6e 20 62 65  erhaps it can be
a0f0: 0a 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  .  ** referenced
a100: 20 62 79 20 6f 74 68 65 72 20 74 61 62 6c 65 73   by other tables
a110: 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2e 0a 20 20   in the join..  
a120: 2a 2f 0a 20 20 69 66 28 20 70 50 72 6f 62 65 3d  */.  if( pProbe=
a130: 3d 30 20 26 26 0a 20 20 20 20 20 66 69 6e 64 54  =0 &&.     findT
a140: 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 2d  erm(pWC, iCur, -
a150: 31 2c 20 30 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49  1, 0, WO_EQ|WO_I
a160: 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  N|WO_LT|WO_LE|WO
a170: 5f 47 54 7c 57 4f 5f 47 45 2c 30 29 3d 3d 30 20  _GT|WO_GE,0)==0 
a180: 26 26 0a 20 20 20 20 20 28 70 4f 72 64 65 72 42  &&.     (pOrderB
a190: 79 3d 3d 30 20 7c 7c 20 21 73 6f 72 74 61 62 6c  y==0 || !sortabl
a1a0: 65 42 79 52 6f 77 69 64 28 69 43 75 72 2c 20 70  eByRowid(iCur, p
a1b0: 4f 72 64 65 72 42 79 2c 20 26 72 65 76 29 29 20  OrderBy, &rev)) 
a1c0: 29 7b 0a 20 20 20 20 2a 70 46 6c 61 67 73 20 3d  ){.    *pFlags =
a1d0: 20 30 3b 0a 20 20 20 20 2a 70 70 49 6e 64 65 78   0;.    *ppIndex
a1e0: 20 3d 20 30 3b 0a 20 20 20 20 2a 70 6e 45 71 20   = 0;.    *pnEq 
a1f0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
a200: 30 2e 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  0.0;.  }..  /* C
a210: 68 65 63 6b 20 66 6f 72 20 61 20 72 6f 77 69 64  heck for a rowid
a220: 3d 45 58 50 52 20 6f 72 20 72 6f 77 69 64 20 49  =EXPR or rowid I
a230: 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69  N (...) constrai
a240: 6e 74 73 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d  nts.  */.  pTerm
a250: 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c   = findTerm(pWC,
a260: 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
a270: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
a280: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 54 65 72  , 0);.  if( pTer
a290: 6d 20 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  m ){.    Expr *p
a2a0: 45 78 70 72 3b 0a 20 20 20 20 2a 70 70 49 6e 64  Expr;.    *ppInd
a2b0: 65 78 20 3d 20 30 3b 0a 20 20 20 20 62 65 73 74  ex = 0;.    best
a2c0: 46 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  Flags = WHERE_RO
a2d0: 57 49 44 5f 45 51 3b 0a 20 20 20 20 69 66 28 20  WID_EQ;.    if( 
a2e0: 70 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72  pTerm->eOperator
a2f0: 20 26 20 57 4f 5f 45 51 20 29 7b 0a 20 20 20 20   & WO_EQ ){.    
a300: 20 20 2f 2a 20 52 6f 77 69 64 3d 3d 20 69 73 20    /* Rowid== is 
a310: 61 6c 77 61 79 73 20 74 68 65 20 62 65 73 74 20  always the best 
a320: 70 69 63 6b 2e 20 20 4c 6f 6f 6b 20 6e 6f 20 66  pick.  Look no f
a330: 75 72 74 68 65 72 2e 20 20 42 65 63 61 75 73 65  urther.  Because
a340: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 61   only.      ** a
a350: 20 73 69 6e 67 6c 65 20 72 6f 77 20 69 73 20 67   single row is g
a360: 65 6e 65 72 61 74 65 64 2c 20 6f 75 74 70 75 74  enerated, output
a370: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 73 6f   is always in so
a380: 72 74 65 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  rted order */.  
a390: 20 20 20 20 2a 70 46 6c 61 67 73 20 3d 20 57 48      *pFlags = WH
a3a0: 45 52 45 5f 52 4f 57 49 44 5f 45 51 20 7c 20 57  ERE_ROWID_EQ | W
a3b0: 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a 20 20 20  HERE_UNIQUE;.   
a3c0: 20 20 20 2a 70 6e 45 71 20 3d 20 31 3b 0a 20 20     *pnEq = 1;.  
a3d0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
a3e0: 62 65 73 74 20 69 73 20 72 6f 77 69 64 5c 6e 22  best is rowid\n"
a3f0: 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
a400: 20 30 2e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   0.0;.    }else 
a410: 69 66 28 20 28 70 45 78 70 72 20 3d 20 70 54 65  if( (pExpr = pTe
a420: 72 6d 2d 3e 70 45 78 70 72 29 2d 3e 70 4c 69 73  rm->pExpr)->pLis
a430: 74 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t!=0 ){.      /*
a440: 20 52 6f 77 69 64 20 49 4e 20 28 4c 49 53 54 29   Rowid IN (LIST)
a450: 3a 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20  : cost is NlogN 
a460: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
a470: 75 6d 62 65 72 20 6f 66 20 6c 69 73 74 0a 20 20  umber of list.  
a480: 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73 2e      ** elements.
a490: 20 20 2a 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73    */.      lowes
a4a0: 74 43 6f 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  tCost = pExpr->p
a4b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
a4c0: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 2a 3d     lowestCost *=
a4d0: 20 65 73 74 4c 6f 67 28 6c 6f 77 65 73 74 43 6f   estLog(lowestCo
a4e0: 73 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  st);.    }else{.
a4f0: 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 49        /* Rowid I
a500: 4e 20 28 53 45 4c 45 43 54 29 3a 20 63 6f 73 74  N (SELECT): cost
a510: 20 69 73 20 4e 6c 6f 67 4e 20 77 68 65 72 65 20   is NlogN where 
a520: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
a530: 6f 66 20 72 6f 77 73 0a 20 20 20 20 20 20 2a 2a  of rows.      **
a540: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f   in the result o
a550: 66 20 74 68 65 20 69 6e 6e 65 72 20 73 65 6c 65  f the inner sele
a560: 63 74 2e 20 20 57 65 20 68 61 76 65 20 6e 6f 20  ct.  We have no 
a570: 77 61 79 20 74 6f 20 65 73 74 69 6d 61 74 65 0a  way to estimate.
a580: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 76 61        ** that va
a590: 6c 75 65 20 73 6f 20 6d 61 6b 65 20 61 20 77 69  lue so make a wi
a5a0: 6c 64 20 67 75 65 73 73 2e 20 2a 2f 0a 20 20 20  ld guess. */.   
a5b0: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
a5c0: 32 30 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  200;.    }.    T
a5d0: 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64  RACE(("... rowid
a5e0: 20 49 4e 20 63 6f 73 74 3a 20 25 2e 39 67 5c 6e   IN cost: %.9g\n
a5f0: 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 29 29 3b  ", lowestCost));
a600: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 73 74 69 6d  .  }..  /* Estim
a610: 61 74 65 20 74 68 65 20 63 6f 73 74 20 6f 66 20  ate the cost of 
a620: 61 20 74 61 62 6c 65 20 73 63 61 6e 2e 20 20 49  a table scan.  I
a630: 66 20 77 65 20 64 6f 20 6e 6f 74 20 6b 6e 6f 77  f we do not know
a640: 20 68 6f 77 20 6d 61 6e 79 0a 20 20 2a 2a 20 65   how many.  ** e
a650: 6e 74 72 69 65 73 20 61 72 65 20 69 6e 20 74 68  ntries are in th
a660: 65 20 74 61 62 6c 65 2c 20 75 73 65 20 31 20 6d  e table, use 1 m
a670: 69 6c 6c 69 6f 6e 20 61 73 20 61 20 67 75 65 73  illion as a gues
a680: 73 2e 0a 20 20 2a 2f 0a 20 20 63 6f 73 74 20 3d  s..  */.  cost =
a690: 20 70 50 72 6f 62 65 20 3f 20 70 50 72 6f 62 65   pProbe ? pProbe
a6a0: 2d 3e 61 69 52 6f 77 45 73 74 5b 30 5d 20 3a 20  ->aiRowEst[0] : 
a6b0: 31 30 30 30 30 30 30 3b 0a 20 20 54 52 41 43 45  1000000;.  TRACE
a6c0: 28 28 22 2e 2e 2e 20 74 61 62 6c 65 20 73 63 61  (("... table sca
a6d0: 6e 20 62 61 73 65 20 63 6f 73 74 3a 20 25 2e 39  n base cost: %.9
a6e0: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
a6f0: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 52 4f  flags = WHERE_RO
a700: 57 49 44 5f 52 41 4e 47 45 3b 0a 0a 20 20 2f 2a  WID_RANGE;..  /*
a710: 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6e 73 74   Check for const
a720: 72 61 69 6e 74 73 20 6f 6e 20 61 20 72 61 6e 67  raints on a rang
a730: 65 20 6f 66 20 72 6f 77 69 64 73 20 69 6e 20 61  e of rowids in a
a740: 20 74 61 62 6c 65 20 73 63 61 6e 2e 0a 20 20 2a   table scan..  *
a750: 2f 0a 20 20 70 54 65 72 6d 20 3d 20 66 69 6e 64  /.  pTerm = find
a760: 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c 20  Term(pWC, iCur, 
a770: 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f  -1, notReady, WO
a780: 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f 5f 47 54 7c  _LT|WO_LE|WO_GT|
a790: 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 69 66 28  WO_GE, 0);.  if(
a7a0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 69 66   pTerm ){.    if
a7b0: 28 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  ( findTerm(pWC, 
a7c0: 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61  iCur, -1, notRea
a7d0: 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 2c  dy, WO_LT|WO_LE,
a7e0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61   0) ){.      fla
a7f0: 67 73 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f  gs |= WHERE_TOP_
a800: 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73  LIMIT;.      cos
a810: 74 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73  t /= 3;  /* Gues
a820: 73 20 74 68 61 74 20 72 6f 77 69 64 3c 45 58 50  s that rowid<EXP
a830: 52 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f  R eliminates two
a840: 2d 74 68 69 72 64 73 20 6f 72 20 72 6f 77 73 20  -thirds or rows 
a850: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  */.    }.    if(
a860: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
a870: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
a880: 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  y, WO_GT|WO_GE, 
a890: 30 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  0) ){.      flag
a8a0: 73 20 7c 3d 20 57 48 45 52 45 5f 42 54 4d 5f 4c  s |= WHERE_BTM_L
a8b0: 49 4d 49 54 3b 0a 20 20 20 20 20 20 63 6f 73 74  IMIT;.      cost
a8c0: 20 2f 3d 20 33 3b 20 20 2f 2a 20 47 75 65 73 73   /= 3;  /* Guess
a8d0: 20 74 68 61 74 20 72 6f 77 69 64 3e 45 58 50 52   that rowid>EXPR
a8e0: 20 65 6c 69 6d 69 6e 61 74 65 73 20 74 77 6f 2d   eliminates two-
a8f0: 74 68 69 72 64 73 20 6f 66 20 72 6f 77 73 20 2a  thirds of rows *
a900: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  /.    }.    TRAC
a910: 45 28 28 22 2e 2e 2e 20 72 6f 77 69 64 20 72 61  E(("... rowid ra
a920: 6e 67 65 20 72 65 64 75 63 65 73 20 63 6f 73 74  nge reduces cost
a930: 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73   to %.9g\n", cos
a940: 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t));.  }else{.  
a950: 20 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 7d    flags = 0;.  }
a960: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61  ..  /* If the ta
a970: 62 6c 65 20 73 63 61 6e 20 64 6f 65 73 20 6e 6f  ble scan does no
a980: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
a990: 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 69  DER BY clause, i
a9a0: 6e 63 72 65 61 73 65 0a 20 20 2a 2a 20 74 68 65  ncrease.  ** the
a9b0: 20 63 6f 73 74 20 62 79 20 4e 6c 6f 67 4e 20 74   cost by NlogN t
a9c0: 6f 20 63 6f 76 65 72 20 74 68 65 20 65 78 70 65  o cover the expe
a9d0: 6e 73 65 20 6f 66 20 73 6f 72 74 69 6e 67 2e 20  nse of sorting. 
a9e0: 2a 2f 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  */.  if( pOrderB
a9f0: 79 20 29 7b 0a 20 20 20 20 69 66 28 20 73 6f 72  y ){.    if( sor
aa00: 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43 75  tableByRowid(iCu
aa10: 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72 65  r, pOrderBy, &re
aa20: 76 29 20 29 7b 0a 20 20 20 20 20 20 66 6c 61 67  v) ){.      flag
aa30: 73 20 7c 3d 20 57 48 45 52 45 5f 4f 52 44 45 52  s |= WHERE_ORDER
aa40: 42 59 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52  BY|WHERE_ROWID_R
aa50: 41 4e 47 45 3b 0a 20 20 20 20 20 20 69 66 28 20  ANGE;.      if( 
aa60: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 66  rev ){.        f
aa70: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 52 45  lags |= WHERE_RE
aa80: 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
aa90: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aaa0: 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73 74  cost += cost*est
aab0: 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20 20  Log(cost);.     
aac0: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 73 6f 72   TRACE(("... sor
aad0: 74 69 6e 67 20 69 6e 63 72 65 61 73 65 73 20 63  ting increases c
aae0: 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20  ost to %.9g\n", 
aaf0: 63 6f 73 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20  cost));.    }.  
ab00: 7d 0a 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77  }.  if( cost<low
ab10: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 6c  estCost ){.    l
ab20: 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74  owestCost = cost
ab30: 3b 0a 20 20 20 20 62 65 73 74 46 6c 61 67 73 20  ;.    bestFlags 
ab40: 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
ab50: 2f 2a 20 4c 6f 6f 6b 20 61 74 20 65 61 63 68 20  /* Look at each 
ab60: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f  index..  */.  fo
ab70: 72 28 3b 20 70 50 72 6f 62 65 3b 20 70 50 72 6f  r(; pProbe; pPro
ab80: 62 65 3d 70 50 72 6f 62 65 2d 3e 70 4e 65 78 74  be=pProbe->pNext
ab90: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20  ){.    int i;   
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
abc0: 74 65 72 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c  ter */.    doubl
abd0: 65 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 3d  e inMultiplier =
abe0: 20 31 3b 0a 0a 20 20 20 20 54 52 41 43 45 28 28   1;..    TRACE((
abf0: 22 2e 2e 2e 20 69 6e 64 65 78 20 25 73 3a 5c 6e  "... index %s:\n
ac00: 22 2c 20 70 50 72 6f 62 65 2d 3e 7a 4e 61 6d 65  ", pProbe->zName
ac10: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 75 6e  ));..    /* Coun
ac20: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
ac30: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 69  columns in the i
ac40: 6e 64 65 78 20 74 68 61 74 20 61 72 65 20 73 61  ndex that are sa
ac50: 74 69 73 66 69 65 64 0a 20 20 20 20 2a 2a 20 62  tisfied.    ** b
ac60: 79 20 78 3d 45 58 50 52 20 63 6f 6e 73 74 72 61  y x=EXPR constra
ac70: 69 6e 74 73 20 6f 72 20 78 20 49 4e 20 28 2e 2e  ints or x IN (..
ac80: 2e 29 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a  .) constraints..
ac90: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73      */.    flags
aca0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
acb0: 30 3b 20 69 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f  0; i<pProbe->nCo
acc0: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
acd0: 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f 62 65    int j = pProbe
ace0: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 3b 0a 20  ->aiColumn[i];. 
acf0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
ad00: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
ad10: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
ad20: 5f 45 51 7c 57 4f 5f 49 4e 2c 20 70 50 72 6f 62  _EQ|WO_IN, pProb
ad30: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
ad40: 65 72 6d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  erm==0 ) break;.
ad50: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57        flags |= W
ad60: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 45 51 3b 0a  HERE_COLUMN_EQ;.
ad70: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
ad80: 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 57 4f 5f  >eOperator & WO_
ad90: 49 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 45 78  IN ){.        Ex
ada0: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 54 65 72  pr *pExpr = pTer
adb0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
adc0: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
add0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b 0a 20 20 20 20  _COLUMN_IN;.    
ade0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
adf0: 53 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20  Select!=0 ){.   
ae00: 20 20 20 20 20 20 20 69 6e 4d 75 6c 74 69 70 6c         inMultipl
ae10: 69 65 72 20 2a 3d 20 32 35 3b 0a 20 20 20 20 20  ier *= 25;.     
ae20: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
ae30: 70 72 2d 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a  pr->pList!=0 ){.
ae40: 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75 6c 74            inMult
ae50: 69 70 6c 69 65 72 20 2a 3d 20 70 45 78 70 72 2d  iplier *= pExpr-
ae60: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 2b 20  >pList->nExpr + 
ae70: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
ae80: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
ae90: 6f 73 74 20 3d 20 70 50 72 6f 62 65 2d 3e 61 69  ost = pProbe->ai
aea0: 52 6f 77 45 73 74 5b 69 5d 20 2a 20 69 6e 4d 75  RowEst[i] * inMu
aeb0: 6c 74 69 70 6c 69 65 72 20 2a 20 65 73 74 4c 6f  ltiplier * estLo
aec0: 67 28 69 6e 4d 75 6c 74 69 70 6c 69 65 72 29 3b  g(inMultiplier);
aed0: 0a 20 20 20 20 6e 45 71 20 3d 20 69 3b 0a 20 20  .    nEq = i;.  
aee0: 20 20 69 66 28 20 70 50 72 6f 62 65 2d 3e 6f 6e    if( pProbe->on
aef0: 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f 6e 65 20 26  Error!=OE_None &
af00: 26 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  & (flags & WHERE
af10: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 0a 20  _COLUMN_IN)==0. 
af20: 20 20 20 20 20 20 20 20 26 26 20 6e 45 71 3d 3d          && nEq==
af30: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
af40: 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
af50: 3d 20 57 48 45 52 45 5f 55 4e 49 51 55 45 3b 0a  = WHERE_UNIQUE;.
af60: 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28      }.    TRACE(
af70: 28 22 2e 2e 2e 2e 2e 2e 20 6e 45 71 3d 25 64 20  ("...... nEq=%d 
af80: 69 6e 4d 75 6c 74 3d 25 2e 39 67 20 63 6f 73 74  inMult=%.9g cost
af90: 3d 25 2e 39 67 5c 6e 22 2c 20 6e 45 71 2c 20 69  =%.9g\n", nEq, i
afa0: 6e 4d 75 6c 74 69 70 6c 69 65 72 2c 20 63 6f 73  nMultiplier, cos
afb0: 74 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f  t));..    /* Loo
afc0: 6b 20 66 6f 72 20 72 61 6e 67 65 20 63 6f 6e 73  k for range cons
afd0: 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2f 0a 20  traints.    */. 
afe0: 20 20 20 69 66 28 20 6e 45 71 3c 70 50 72 6f 62     if( nEq<pProb
aff0: 65 2d 3e 6e 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20  e->nColumn ){.  
b000: 20 20 20 20 69 6e 74 20 6a 20 3d 20 70 50 72 6f      int j = pPro
b010: 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6e 45 71  be->aiColumn[nEq
b020: 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20 3d  ];.      pTerm =
b030: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
b040: 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79  Cur, j, notReady
b050: 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57 4f  , WO_LT|WO_LE|WO
b060: 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50 72 6f 62  _GT|WO_GE, pProb
b070: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  e);.      if( pT
b080: 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 66  erm ){.        f
b090: 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 43 4f  lags |= WHERE_CO
b0a0: 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20 20 20  LUMN_RANGE;.    
b0b0: 20 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d      if( findTerm
b0c0: 28 70 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e  (pWC, iCur, j, n
b0d0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
b0e0: 4f 5f 4c 45 2c 20 70 50 72 6f 62 65 29 20 29 7b  O_LE, pProbe) ){
b0f0: 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73  .          flags
b100: 20 7c 3d 20 57 48 45 52 45 5f 54 4f 50 5f 4c 49   |= WHERE_TOP_LI
b110: 4d 49 54 3b 0a 20 20 20 20 20 20 20 20 20 20 63  MIT;.          c
b120: 6f 73 74 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20  ost /= 3;.      
b130: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
b140: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
b150: 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c  ur, j, notReady,
b160: 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 70 50   WO_GT|WO_GE, pP
b170: 72 6f 62 65 29 20 29 7b 0a 20 20 20 20 20 20 20  robe) ){.       
b180: 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52     flags |= WHER
b190: 45 5f 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20  E_BTM_LIMIT;.   
b1a0: 20 20 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 33         cost /= 3
b1b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b1c0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e      TRACE(("....
b1d0: 2e 2e 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  .. range reduces
b1e0: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
b1f0: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20  , cost));.      
b200: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b210: 41 64 64 20 74 68 65 20 61 64 64 69 74 69 6f 6e  Add the addition
b220: 61 6c 20 63 6f 73 74 20 6f 66 20 73 6f 72 74 69  al cost of sorti
b230: 6e 67 20 69 66 20 74 68 61 74 20 69 73 20 61 20  ng if that is a 
b240: 66 61 63 74 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20  factor..    */. 
b250: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 20     if( pOrderBy 
b260: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 6c  ){.      if( (fl
b270: 61 67 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55  ags & WHERE_COLU
b280: 4d 4e 5f 49 4e 29 3d 3d 30 20 26 26 0a 20 20 20  MN_IN)==0 &&.   
b290: 20 20 20 20 20 20 20 20 69 73 53 6f 72 74 69 6e          isSortin
b2a0: 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 70 50  gIndex(pParse,pP
b2b0: 72 6f 62 65 2c 69 43 75 72 2c 70 4f 72 64 65 72  robe,iCur,pOrder
b2c0: 42 79 2c 6e 45 71 2c 26 72 65 76 29 20 29 7b 0a  By,nEq,&rev) ){.
b2d0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67          if( flag
b2e0: 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
b2f0: 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f    flags = WHERE_
b300: 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b 0a 20 20  COLUMN_RANGE;.  
b310: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b320: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 4f  flags |= WHERE_O
b330: 52 44 45 52 42 59 3b 0a 20 20 20 20 20 20 20 20  RDERBY;.        
b340: 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20 20  if( rev ){.     
b350: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
b360: 45 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  ERE_REVERSE;.   
b370: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
b380: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 73 74  se{.        cost
b390: 20 2b 3d 20 63 6f 73 74 2a 65 73 74 4c 6f 67 28   += cost*estLog(
b3a0: 63 6f 73 74 29 3b 0a 20 20 20 20 20 20 20 20 54  cost);.        T
b3b0: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6f 72  RACE(("...... or
b3c0: 64 65 72 62 79 20 69 6e 63 72 65 61 73 65 73 20  derby increases 
b3d0: 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c  cost to %.9g\n",
b3e0: 20 63 6f 73 74 29 29 3b 0a 20 20 20 20 20 20 7d   cost));.      }
b3f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
b400: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
b410: 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77  e can get away w
b420: 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ith using just t
b430: 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74  he index without
b440: 0a 20 20 20 20 2a 2a 20 65 76 65 72 20 72 65 61  .    ** ever rea
b450: 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65 2e 20  ding the table. 
b460: 20 49 66 20 74 68 61 74 20 69 73 20 74 68 65 20   If that is the 
b470: 63 61 73 65 2c 20 74 68 65 6e 20 68 61 6c 76 65  case, then halve
b480: 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 73 74   the.    ** cost
b490: 20 6f 66 20 74 68 69 73 20 69 6e 64 65 78 2e 0a   of this index..
b4a0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
b4b0: 6c 61 67 73 20 26 26 20 70 53 72 63 2d 3e 63 6f  lags && pSrc->co
b4c0: 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
b4d0: 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
b4e0: 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61 73 6b  ){.      Bitmask
b4f0: 20 6d 20 3d 20 70 53 72 63 2d 3e 63 6f 6c 55 73   m = pSrc->colUs
b500: 65 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  ed;.      int j;
b510: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
b520: 6a 3c 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d  j<pProbe->nColum
b530: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
b540: 20 69 6e 74 20 78 20 3d 20 70 50 72 6f 62 65 2d   int x = pProbe-
b550: 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20  >aiColumn[j];.  
b560: 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53 2d        if( x<BMS-
b570: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  1 ){.          m
b580: 20 26 3d 20 7e 28 28 28 42 69 74 6d 61 73 6b 29   &= ~(((Bitmask)
b590: 31 29 3c 3c 78 29 3b 0a 20 20 20 20 20 20 20 20  1)<<x);.        
b5a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b5b0: 69 66 28 20 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  if( m==0 ){.    
b5c0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
b5d0: 52 45 5f 49 44 58 5f 4f 4e 4c 59 3b 0a 20 20 20  RE_IDX_ONLY;.   
b5e0: 20 20 20 20 20 63 6f 73 74 20 2f 3d 20 32 3b 0a       cost /= 2;.
b5f0: 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
b600: 2e 2e 2e 2e 2e 2e 20 69 64 78 2d 6f 6e 6c 79 20  ...... idx-only 
b610: 72 65 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20  reduces cost to 
b620: 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b  %.9g\n", cost));
b630: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
b640: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
b650: 6e 64 65 78 20 68 61 73 20 61 63 68 69 65 76 65  ndex has achieve
b660: 64 20 74 68 65 20 6c 6f 77 65 73 74 20 63 6f 73  d the lowest cos
b670: 74 20 73 6f 20 66 61 72 2c 20 74 68 65 6e 20 75  t so far, then u
b680: 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  se it..    */.  
b690: 20 20 69 66 28 20 63 6f 73 74 20 3c 20 6c 6f 77    if( cost < low
b6a0: 65 73 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20  estCost ){.     
b6b0: 20 62 65 73 74 49 64 78 20 3d 20 70 50 72 6f 62   bestIdx = pProb
b6c0: 65 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43  e;.      lowestC
b6d0: 6f 73 74 20 3d 20 63 6f 73 74 3b 0a 20 20 20 20  ost = cost;.    
b6e0: 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 21    assert( flags!
b6f0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 65 73 74  =0 );.      best
b700: 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
b710: 20 20 20 20 20 62 65 73 74 4e 45 71 20 3d 20 6e       bestNEq = n
b720: 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  Eq;.    }.  }.. 
b730: 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 62   /* Report the b
b740: 65 73 74 20 72 65 73 75 6c 74 0a 20 20 2a 2f 0a  est result.  */.
b750: 20 20 2a 70 70 49 6e 64 65 78 20 3d 20 62 65 73    *ppIndex = bes
b760: 74 49 64 78 3b 0a 20 20 54 52 41 43 45 28 28 22  tIdx;.  TRACE(("
b770: 62 65 73 74 20 69 6e 64 65 78 20 69 73 20 25 73  best index is %s
b780: 2c 20 63 6f 73 74 3d 25 2e 39 67 2c 20 66 6c 61  , cost=%.9g, fla
b790: 67 73 3d 25 78 2c 20 6e 45 71 3d 25 64 5c 6e 22  gs=%x, nEq=%d\n"
b7a0: 2c 0a 20 20 20 20 20 20 20 20 62 65 73 74 49 64  ,.        bestId
b7b0: 78 20 3f 20 62 65 73 74 49 64 78 2d 3e 7a 4e 61  x ? bestIdx->zNa
b7c0: 6d 65 20 3a 20 22 28 6e 6f 6e 65 29 22 2c 20 6c  me : "(none)", l
b7d0: 6f 77 65 73 74 43 6f 73 74 2c 20 62 65 73 74 46  owestCost, bestF
b7e0: 6c 61 67 73 2c 20 62 65 73 74 4e 45 71 29 29 3b  lags, bestNEq));
b7f0: 0a 20 20 2a 70 46 6c 61 67 73 20 3d 20 62 65 73  .  *pFlags = bes
b800: 74 46 6c 61 67 73 3b 0a 20 20 2a 70 6e 45 71 20  tFlags;.  *pnEq 
b810: 3d 20 62 65 73 74 4e 45 71 3b 0a 20 20 72 65 74  = bestNEq;.  ret
b820: 75 72 6e 20 6c 6f 77 65 73 74 43 6f 73 74 3b 0a  urn lowestCost;.
b830: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  }.../*.** Disabl
b840: 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20  e a term in the 
b850: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45  WHERE clause.  E
b860: 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69  xcept, do not di
b870: 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a  sable the term.*
b880: 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73  * if it controls
b890: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
b8a0: 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f  IN and it did no
b8b0: 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74  t originate in t
b8c0: 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e  he ON.** or USIN
b8d0: 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  G clause of that
b8e0: 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e   join..**.** Con
b8f0: 73 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74  sider the term t
b900: 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20  2.z='ok' in the 
b910: 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65  following querie
b920: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20  s:.**.**   (1)  
b930: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
b940: 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e   LEFT JOIN t2 ON
b950: 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45   t1.a=t2.x WHERE
b960: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20   t2.z='ok'.**   
b970: 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (2)  SELECT * FR
b980: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
b990: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
b9a0: 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a  AND t2.z='ok'.**
b9b0: 20 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a     (3)  SELECT *
b9c0: 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45   FROM t1, t2 WHE
b9d0: 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44  RE t1.a=t2.x AND
b9e0: 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a   t2.z='ok'.**.**
b9f0: 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69   The t2.z='ok' i
ba00: 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68  s disabled in th
ba10: 65 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65  e in (2) because
ba20: 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a   it originates.*
ba30: 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75  * in the ON clau
ba40: 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73  se.  The term is
ba50: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29   disabled in (3)
ba60: 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e   because it is n
ba70: 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20  ot part.** of a 
ba80: 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e  LEFT OUTER JOIN.
ba90: 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65    In (1), the te
baa0: 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c  rm is not disabl
bab0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c  ed..**.** Disabl
bac0: 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65  ing a term cause
bad0: 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e  s that term to n
bae0: 6f 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20  ot be tested in 
baf0: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a  the inner loop.*
bb00: 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20  * of the join.  
bb10: 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20  Disabling is an 
bb20: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57  optimization.  W
bb30: 68 65 6e 20 74 65 72 6d 73 20 61 72 65 20 73 61  hen terms are sa
bb40: 74 69 73 66 69 65 64 0a 2a 2a 20 62 79 20 69 6e  tisfied.** by in
bb50: 64 69 63 65 73 2c 20 77 65 20 64 69 73 61 62 6c  dices, we disabl
bb60: 65 20 74 68 65 6d 20 74 6f 20 70 72 65 76 65 6e  e them to preven
bb70: 74 20 72 65 64 75 6e 64 61 6e 74 20 74 65 73 74  t redundant test
bb80: 73 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 0a 2a  s in the inner.*
bb90: 2a 20 6c 6f 6f 70 2e 20 20 57 65 20 77 6f 75 6c  * loop.  We woul
bba0: 64 20 67 65 74 20 74 68 65 20 63 6f 72 72 65 63  d get the correc
bbb0: 74 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74  t results if not
bbc0: 68 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64  hing were ever d
bbd0: 69 73 61 62 6c 65 64 2c 0a 2a 2a 20 62 75 74 20  isabled,.** but 
bbe0: 6a 6f 69 6e 73 20 6d 69 67 68 74 20 72 75 6e 20  joins might run 
bbf0: 61 20 6c 69 74 74 6c 65 20 73 6c 6f 77 65 72 2e  a little slower.
bc00: 20 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74    The trick is t
bc10: 6f 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63  o disable as muc
bc20: 68 0a 2a 2a 20 61 73 20 77 65 20 63 61 6e 20 77  h.** as we can w
bc30: 69 74 68 6f 75 74 20 64 69 73 61 62 6c 69 6e 67  ithout disabling
bc40: 20 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77   too much.  If w
bc50: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31  e disabled in (1
bc60: 29 2c 20 77 65 27 64 20 67 65 74 0a 2a 2a 20 74  ), we'd get.** t
bc70: 68 65 20 77 72 6f 6e 67 20 61 6e 73 77 65 72 2e  he wrong answer.
bc80: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 38 31    See ticket #81
bc90: 33 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  3..*/.static voi
bca0: 64 20 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68  d disableTerm(Wh
bcb0: 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c  ereLevel *pLevel
bcc0: 2c 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65  , WhereTerm *pTe
bcd0: 72 6d 29 7b 0a 20 20 69 66 28 20 70 54 65 72 6d  rm){.  if( pTerm
bce0: 0a 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d  .      && (pTerm
bcf0: 2d 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43  ->flags & TERM_C
bd00: 4f 44 45 44 29 3d 3d 30 0a 20 20 20 20 20 20 26  ODED)==0.      &
bd10: 26 20 28 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  & (pLevel->iLeft
bd20: 4a 6f 69 6e 3d 3d 30 20 7c 7c 20 45 78 70 72 48  Join==0 || ExprH
bd30: 61 73 50 72 6f 70 65 72 74 79 28 70 54 65 72 6d  asProperty(pTerm
bd40: 2d 3e 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d  ->pExpr, EP_From
bd50: 4a 6f 69 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20  Join)).  ){.    
bd60: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20  pTerm->flags |= 
bd70: 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20 20  TERM_CODED;.    
bd80: 69 66 28 20 70 54 65 72 6d 2d 3e 69 50 61 72 65  if( pTerm->iPare
bd90: 6e 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 57  nt>=0 ){.      W
bda0: 68 65 72 65 54 65 72 6d 20 2a 70 4f 74 68 65 72  hereTerm *pOther
bdb0: 20 3d 20 26 70 54 65 72 6d 2d 3e 70 57 43 2d 3e   = &pTerm->pWC->
bdc0: 61 5b 70 54 65 72 6d 2d 3e 69 50 61 72 65 6e 74  a[pTerm->iParent
bdd0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 28 2d 2d  ];.      if( (--
bde0: 70 4f 74 68 65 72 2d 3e 6e 43 68 69 6c 64 29 3d  pOther->nChild)=
bdf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69  =0 ){.        di
be00: 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
be10: 2c 20 70 4f 74 68 65 72 29 3b 0a 20 20 20 20 20  , pOther);.     
be20: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
be30: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
be40: 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20  ode that builds 
be50: 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69  a probe for an i
be60: 6e 64 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a  ndex.  Details:.
be70: 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63  **.**    *  Chec
be80: 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d  k the top nColum
be90: 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65  n entries on the
bea0: 20 73 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a   stack.  If any.
beb0: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73  **       of thos
bec0: 65 20 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55  e entries are NU
bed0: 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61  LL, jump immedia
bee0: 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20  tely to brk,.** 
bef0: 20 20 20 20 20 20 77 68 69 63 68 20 69 73 20 74        which is t
bf00: 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69  he loop exit, si
bf10: 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74  nce no index ent
bf20: 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a  ry will match.**
bf30: 20 20 20 20 20 20 20 69 66 20 61 6e 79 20 70 61         if any pa
bf40: 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73  rt of the key is
bf50: 20 4e 55 4c 4c 2e 20 50 6f 70 20 28 6e 43 6f 6c   NULL. Pop (nCol
bf60: 75 6d 6e 2b 6e 45 78 74 72 61 29 20 0a 2a 2a 20  umn+nExtra) .** 
bf70: 20 20 20 20 20 20 65 6c 65 6d 65 6e 74 73 20 66        elements f
bf80: 72 6f 6d 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  rom the stack..*
bf90: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74  *.**    *  Const
bfa0: 72 75 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74  ruct a probe ent
bfb0: 72 79 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20  ry from the top 
bfc0: 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20  nColumn entries 
bfd0: 69 6e 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20  in.**       the 
bfe0: 73 74 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e  stack with affin
bff0: 69 74 69 65 73 20 61 70 70 72 6f 70 72 69 61 74  ities appropriat
c000: 65 20 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78  e for index pIdx
c010: 2e 20 0a 2a 2a 20 20 20 20 20 20 20 4f 6e 6c 79  . .**       Only
c020: 20 6e 43 6f 6c 75 6d 6e 20 65 6c 65 6d 65 6e 74   nColumn element
c030: 73 20 61 72 65 20 70 6f 70 70 65 64 20 66 72 6f  s are popped fro
c040: 6d 20 74 68 65 20 73 74 61 63 6b 20 69 6e 20 74  m the stack in t
c050: 68 69 73 20 63 61 73 65 0a 2a 2a 20 20 20 20 20  his case.**     
c060: 20 20 28 62 79 20 4f 50 5f 4d 61 6b 65 52 65 63    (by OP_MakeRec
c070: 6f 72 64 29 2e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ord)..**.*/.stat
c080: 69 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64  ic void buildInd
c090: 65 78 50 72 6f 62 65 28 0a 20 20 56 64 62 65 20  exProbe(.  Vdbe 
c0a0: 2a 76 2c 20 0a 20 20 69 6e 74 20 6e 43 6f 6c 75  *v, .  int nColu
c0b0: 6d 6e 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72  mn, .  int nExtr
c0c0: 61 2c 20 0a 20 20 69 6e 74 20 62 72 6b 2c 20 0a  a, .  int brk, .
c0d0: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 0a 29 7b    Index *pIdx.){
c0e0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
c0f0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
c100: 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c 20 73 71 6c  l, -nColumn, sql
c110: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
c120: 64 64 72 28 76 29 2b 33 29 3b 0a 20 20 73 71 6c  ddr(v)+3);.  sql
c130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c140: 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f 6c 75 6d 6e   OP_Pop, nColumn
c150: 2b 6e 45 78 74 72 61 2c 20 30 29 3b 0a 20 20 73  +nExtra, 0);.  s
c160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c170: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62  v, OP_Goto, 0, b
c180: 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rk);.  sqlite3Vd
c190: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
c1a0: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
c1b0: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
c1c0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
c1d0: 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 0a 2f  (v, pIdx);.}.../
c1e0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c1f0: 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
c200: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 6f 66  equality term of
c210: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c220: 65 2e 20 20 41 6e 20 65 71 75 61 6c 69 74 79 0a  e.  An equality.
c230: 2a 2a 20 74 65 72 6d 20 63 61 6e 20 62 65 20 65  ** term can be e
c240: 69 74 68 65 72 20 58 3d 65 78 70 72 20 6f 72 20  ither X=expr or 
c250: 58 20 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54  X IN (...).   pT
c260: 65 72 6d 20 69 73 20 74 68 65 20 74 65 72 6d 20  erm is the term 
c270: 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 64 65 64 2e  to be .** coded.
c280: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 75 72 72 65  .**.** The curre
c290: 6e 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  nt value for the
c2a0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6c   constraint is l
c2b0: 65 66 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f  eft on the top o
c2c0: 66 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a  f the stack..**.
c2d0: 2a 2a 20 46 6f 72 20 61 20 63 6f 6e 73 74 72 61  ** For a constra
c2e0: 69 6e 74 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  int of the form 
c2f0: 58 3d 65 78 70 72 2c 20 74 68 65 20 65 78 70 72  X=expr, the expr
c300: 65 73 73 69 6f 6e 20 69 73 20 65 76 61 6c 75 61  ession is evalua
c310: 74 65 64 20 61 6e 64 20 69 74 73 0a 2a 2a 20 72  ted and its.** r
c320: 65 73 75 6c 74 20 69 73 20 6c 65 66 74 20 6f 6e  esult is left on
c330: 20 74 68 65 20 73 74 61 63 6b 2e 20 20 46 6f 72   the stack.  For
c340: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 66 20   constraints of 
c350: 74 68 65 20 66 6f 72 6d 20 58 20 49 4e 20 28 2e  the form X IN (.
c360: 2e 2e 29 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  ..).** this rout
c370: 69 6e 65 20 73 65 74 73 20 75 70 20 61 20 6c 6f  ine sets up a lo
c380: 6f 70 20 74 68 61 74 20 77 69 6c 6c 20 69 74 65  op that will ite
c390: 72 61 74 65 20 6f 76 65 72 20 61 6c 6c 20 76 61  rate over all va
c3a0: 6c 75 65 73 20 6f 66 20 58 2e 0a 2a 2f 0a 73 74  lues of X..*/.st
c3b0: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71  atic void codeEq
c3c0: 75 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61  ualityTerm(.  Pa
c3d0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
c3e0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67    /* The parsing
c3f0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 57 68   context */.  Wh
c400: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 2c 20  ereTerm *pTerm, 
c410: 20 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66    /* The term of
c420: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c430: 65 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  e to be coded */
c440: 0a 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20  .  int brk,     
c450: 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
c460: 65 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74  ere to abandon t
c470: 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65  he loop */.  Whe
c480: 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20  reLevel *pLevel 
c490: 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f   /* When level o
c4a0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
c4b0: 65 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67  e we are working
c4c0: 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72   on */.){.  Expr
c4d0: 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pX = pTerm->pE
c4e0: 78 70 72 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f  xpr;.  if( pX->o
c4f0: 70 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20  p!=TK_IN ){.    
c500: 61 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d  assert( pX->op==
c510: 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c  TK_EQ );.    sql
c520: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c530: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
c540: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
c550: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
c560: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
c570: 69 54 61 62 3b 0a 20 20 20 20 69 6e 74 20 2a 61  iTab;.    int *a
c580: 49 6e 3b 0a 20 20 20 20 56 64 62 65 20 2a 76 20  In;.    Vdbe *v 
c590: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
c5a0: 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  ..    sqlite3Cod
c5b0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
c5c0: 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61 62  e, pX);.    iTab
c5d0: 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20   = pX->iTable;. 
c5e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c5f0: 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64  dOp(v, OP_Rewind
c600: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
c610: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c620: 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70  "# %.*s", pX->sp
c630: 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a  an.n, pX->span.z
c640: 29 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ));.    pLevel->
c650: 6e 49 6e 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74  nIn++;.    sqlit
c660: 65 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 28  eReallocOrFree((
c670: 76 6f 69 64 2a 2a 29 26 70 4c 65 76 65 6c 2d 3e  void**)&pLevel->
c680: 61 49 6e 4c 6f 6f 70 2c 0a 20 20 20 20 20 20 20  aInLoop,.       
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
c6b0: 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70  (pLevel->aInLoop
c6c0: 5b 30 5d 29 2a 32 2a 70 4c 65 76 65 6c 2d 3e 6e  [0])*2*pLevel->n
c6d0: 49 6e 29 3b 0a 20 20 20 20 61 49 6e 20 3d 20 70  In);.    aIn = p
c6e0: 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 3b 0a  Level->aInLoop;.
c6f0: 20 20 20 20 69 66 28 20 61 49 6e 20 29 7b 0a 20      if( aIn ){. 
c700: 20 20 20 20 20 61 49 6e 20 2b 3d 20 70 4c 65 76       aIn += pLev
c710: 65 6c 2d 3e 6e 49 6e 2a 32 20 2d 20 32 3b 0a 20  el->nIn*2 - 2;. 
c720: 20 20 20 20 20 61 49 6e 5b 30 5d 20 3d 20 69 54       aIn[0] = iT
c730: 61 62 3b 0a 20 20 20 20 20 20 61 49 6e 5b 31 5d  ab;.      aIn[1]
c740: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
c750: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d 6e  dOp(v, OP_Column
c760: 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20 20  , iTab, 0);.    
c770: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 65  }else{.      pLe
c780: 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20 20  vel->nIn = 0;.  
c790: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
c7a0: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
c7b0: 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 7d 0a 0a  vel, pTerm);.}..
c7c0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
c7d0: 6f 64 65 20 74 68 61 74 20 77 69 6c 6c 20 65 76  ode that will ev
c7e0: 61 6c 75 61 74 65 20 61 6c 6c 20 3d 3d 20 61 6e  aluate all == an
c7f0: 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73  d IN constraints
c800: 20 66 6f 72 20 61 6e 0a 2a 2a 20 69 6e 64 65 78   for an.** index
c810: 2e 20 20 54 68 65 20 76 61 6c 75 65 73 20 66 6f  .  The values fo
c820: 72 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74  r all constraint
c830: 73 20 61 72 65 20 6c 65 66 74 20 6f 6e 20 74 68  s are left on th
c840: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 46  e stack..**.** F
c850: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 63 6f 6e 73  or example, cons
c860: 69 64 65 72 20 74 61 62 6c 65 20 74 31 28 61 2c  ider table t1(a,
c870: 62 2c 63 2c 64 2c 65 2c 66 29 20 77 69 74 68 20  b,c,d,e,f) with 
c880: 69 6e 64 65 78 20 69 31 28 61 2c 62 2c 63 29 2e  index i1(a,b,c).
c890: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 20  .** Suppose the 
c8a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
c8b0: 74 68 69 73 3a 20 20 61 3d 3d 35 20 41 4e 44 20  this:  a==5 AND 
c8c0: 62 20 49 4e 20 28 31 2c 32 2c 33 29 20 41 4e 44  b IN (1,2,3) AND
c8d0: 20 63 3e 35 20 41 4e 44 20 63 3c 31 30 0a 2a 2a   c>5 AND c<10.**
c8e0: 20 54 68 65 20 69 6e 64 65 78 20 68 61 73 20 61   The index has a
c8f0: 73 20 6d 61 6e 79 20 61 73 20 74 68 72 65 65 20  s many as three 
c900: 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61  equality constra
c910: 69 6e 74 73 2c 20 62 75 74 20 69 6e 20 74 68 69  ints, but in thi
c920: 73 0a 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 74 68  s.** example, th
c930: 65 20 74 68 69 72 64 20 22 63 22 20 76 61 6c 75  e third "c" valu
c940: 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69  e is an inequali
c950: 74 79 2e 20 20 53 6f 20 6f 6e 6c 79 20 74 77 6f  ty.  So only two
c960: 20 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74 73   .** constraints
c970: 20 61 72 65 20 63 6f 64 65 64 2e 20 20 54 68 69   are coded.  Thi
c980: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 67  s routine will g
c990: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
c9a0: 65 76 61 6c 75 61 74 65 0a 2a 2a 20 61 3d 3d 35  evaluate.** a==5
c9b0: 20 61 6e 64 20 62 20 49 4e 20 28 31 2c 32 2c 33   and b IN (1,2,3
c9c0: 29 2e 20 20 54 68 65 20 63 75 72 72 65 6e 74 20  ).  The current 
c9d0: 76 61 6c 75 65 73 20 66 6f 72 20 61 20 61 6e 64  values for a and
c9e0: 20 62 20 77 69 6c 6c 20 62 65 20 6c 65 66 74 0a   b will be left.
c9f0: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20  ** on the stack 
ca00: 2d 20 61 20 69 73 20 74 68 65 20 64 65 65 70 65  - a is the deepe
ca10: 73 74 20 61 6e 64 20 62 20 74 68 65 20 73 68 61  st and b the sha
ca20: 6c 6c 6f 77 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  llowest..**.** I
ca30: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 20 61 62  n the example ab
ca40: 6f 76 65 20 6e 45 71 3d 3d 32 2e 20 20 42 75 74  ove nEq==2.  But
ca50: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
ca60: 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 76   works for any v
ca70: 61 6c 75 65 0a 2a 2a 20 6f 66 20 6e 45 71 20 69  alue.** of nEq i
ca80: 6e 63 6c 75 64 69 6e 67 20 30 2e 20 20 49 66 20  ncluding 0.  If 
ca90: 6e 45 71 3d 3d 30 2c 20 74 68 69 73 20 72 6f 75  nEq==0, this rou
caa0: 74 69 6e 65 20 69 73 20 6e 65 61 72 6c 79 20 61  tine is nearly a
cab0: 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 54 68 65 20 6f   no-op..** The o
cac0: 6e 6c 79 20 74 68 69 6e 67 20 69 74 20 64 6f 65  nly thing it doe
cad0: 73 20 69 73 20 61 6c 6c 6f 63 61 74 65 20 74 68  s is allocate th
cae0: 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 6d  e pLevel->iMem m
caf0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
cb00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
cb10: 6c 77 61 79 73 20 61 6c 6c 6f 63 61 74 65 73 20  lways allocates 
cb20: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6d 65 6d  at least one mem
cb30: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 70 75 74  ory cell and put
cb40: 73 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73  s.** the address
cb50: 20 6f 66 20 74 68 61 74 20 6d 65 6d 6f 72 79 20   of that memory 
cb60: 63 65 6c 6c 20 69 6e 20 70 4c 65 76 65 6c 2d 3e  cell in pLevel->
cb70: 69 4d 65 6d 2e 20 20 54 68 65 20 63 6f 64 65 20  iMem.  The code 
cb80: 74 68 61 74 0a 2a 2a 20 63 61 6c 6c 73 20 74 68  that.** calls th
cb90: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
cba0: 75 73 65 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  use pLevel->iMem
cbb0: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 74 65   to store the te
cbc0: 72 6d 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6b 65 79  rmination.** key
cbd0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f   value of the lo
cbe0: 6f 70 2e 20 20 49 66 20 6f 6e 65 20 6f 72 20 6d  op.  If one or m
cbf0: 6f 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73  ore IN operators
cc00: 20 61 70 70 65 61 72 2c 20 74 68 65 6e 0a 2a 2a   appear, then.**
cc10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
cc20: 6c 6f 63 61 74 65 73 20 61 6e 20 61 64 64 69 74  locates an addit
cc30: 69 6f 6e 61 6c 20 6e 45 71 20 6d 65 6d 6f 72 79  ional nEq memory
cc40: 20 63 65 6c 6c 73 20 66 6f 72 20 69 6e 74 65 72   cells for inter
cc50: 6e 61 6c 0a 2a 2a 20 75 73 65 2e 0a 2a 2f 0a 73  nal.** use..*/.s
cc60: 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 41  tatic void codeA
cc70: 6c 6c 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28  llEqualityTerms(
cc80: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
cc90: 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73  ,        /* Pars
cca0: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
ccb0: 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65   WhereLevel *pLe
ccc0: 76 65 6c 2c 20 20 20 2f 2a 20 57 68 69 63 68 20  vel,   /* Which 
ccd0: 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
cce0: 68 65 20 46 52 4f 4d 20 77 65 20 61 72 65 20 63  he FROM we are c
ccf0: 6f 64 69 6e 67 20 2a 2f 0a 20 20 57 68 65 72 65  oding */.  Where
cd00: 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 20 20 20  Clause *pWC,    
cd10: 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c   /* The WHERE cl
cd20: 61 75 73 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  ause */.  Bitmas
cd30: 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20 20  k notReady,     
cd40: 2f 2a 20 57 68 69 63 68 20 70 61 72 74 73 20 6f  /* Which parts o
cd50: 66 20 46 52 4f 4d 20 68 61 76 65 20 6e 6f 74 20  f FROM have not 
cd60: 79 65 74 20 62 65 65 6e 20 63 6f 64 65 64 20 2a  yet been coded *
cd70: 2f 0a 20 20 69 6e 74 20 62 72 6b 20 20 20 20 20  /.  int brk     
cd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
cd90: 70 20 68 65 72 65 20 74 6f 20 65 6e 64 20 74 68  p here to end th
cda0: 65 20 6c 6f 6f 70 20 2a 2f 0a 29 7b 0a 20 20 69  e loop */.){.  i
cdb0: 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d  nt nEq = pLevel-
cdc0: 3e 6e 45 71 3b 20 20 20 20 20 20 20 20 2f 2a 20  >nEq;        /* 
cdd0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d  The number of ==
cde0: 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e   or IN constrain
cdf0: 74 73 20 74 6f 20 63 6f 64 65 20 2a 2f 0a 20 20  ts to code */.  
ce00: 69 6e 74 20 74 65 72 6d 73 49 6e 4d 65 6d 20 3d  int termsInMem =
ce10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
ce20: 20 49 66 20 74 72 75 65 2c 20 73 74 6f 72 65 20   If true, store 
ce30: 76 61 6c 75 65 20 69 6e 20 6d 65 6d 5b 5d 20 63  value in mem[] c
ce40: 65 6c 6c 73 20 2a 2f 0a 20 20 56 64 62 65 20 2a  ells */.  Vdbe *
ce50: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ce60: 65 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76  e;      /* The v
ce70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 75  irtual machine u
ce80: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
ce90: 6e 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49  n */.  Index *pI
cea0: 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64  dx = pLevel->pId
ceb0: 78 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  x;   /* The inde
cec0: 78 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f 72  x being used for
ced0: 20 74 68 69 73 20 6c 6f 6f 70 20 2a 2f 0a 20 20   this loop */.  
cee0: 69 6e 74 20 69 43 75 72 20 3d 20 70 4c 65 76 65  int iCur = pLeve
cef0: 6c 2d 3e 69 54 61 62 43 75 72 3b 20 20 20 2f 2a  l->iTabCur;   /*
cf00: 20 54 68 65 20 63 75 72 73 6f 72 20 6f 66 20 74   The cursor of t
cf10: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 57 68  he table */.  Wh
cf20: 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d 3b 20  ereTerm *pTerm; 
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
cf40: 20 73 69 6e 67 6c 65 20 63 6f 6e 73 74 72 61 69   single constrai
cf50: 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 69 6e 74  nt term */.  int
cf60: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
cf70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
cf80: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
cf90: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
cfa0: 6f 77 20 6d 61 6e 79 20 6d 65 6d 6f 72 79 20 63  ow many memory c
cfb0: 65 6c 6c 73 20 77 65 20 77 69 6c 6c 20 6e 65 65  ells we will nee
cfc0: 64 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  d then allocate 
cfd0: 74 68 65 6d 2e 0a 20 20 2a 2a 20 57 65 20 61 6c  them..  ** We al
cfe0: 77 61 79 73 20 6e 65 65 64 20 61 74 20 6c 65 61  ways need at lea
cff0: 73 74 20 6f 6e 65 20 75 73 65 64 20 74 6f 20 73  st one used to s
d000: 74 6f 72 65 20 74 68 65 20 6c 6f 6f 70 20 74 65  tore the loop te
d010: 72 6d 69 6e 61 74 6f 72 0a 20 20 2a 2a 20 76 61  rminator.  ** va
d020: 6c 75 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  lue.  If there a
d030: 72 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 73 20  re IN operators 
d040: 77 65 27 6c 6c 20 6e 65 65 64 20 6f 6e 65 20 66  we'll need one f
d050: 6f 72 20 65 61 63 68 20 3d 3d 20 6f 72 0a 20 20  or each == or.  
d060: 2a 2a 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  ** IN constraint
d070: 2e 0a 20 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 2d  ..  */.  pLevel-
d080: 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e  >iMem = pParse->
d090: 6e 4d 65 6d 2b 2b 3b 0a 20 20 69 66 28 20 70 4c  nMem++;.  if( pL
d0a0: 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
d0b0: 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 20 29 7b  ERE_COLUMN_IN ){
d0c0: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 4d 65  .    pParse->nMe
d0d0: 6d 20 2b 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71  m += pLevel->nEq
d0e0: 3b 0a 20 20 20 20 74 65 72 6d 73 49 6e 4d 65 6d  ;.    termsInMem
d0f0: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
d100: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 71 75  Evaluate the equ
d110: 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74  ality constraint
d120: 73 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30  s.  */.  for(j=0
d130: 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d  ; j<pIdx->nColum
d140: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  n; j++){.    int
d150: 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
d160: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 70 54 65 72  umn[j];.    pTer
d170: 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43  m = findTerm(pWC
d180: 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65  , iCur, k, notRe
d190: 61 64 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e  ady, WO_EQ|WO_IN
d1a0: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 69 66 28  , pIdx);.    if(
d1b0: 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72 65 61   pTerm==0 ) brea
d1c0: 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  k;.    assert( (
d1d0: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
d1e0: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b  ERM_CODED)==0 );
d1f0: 0a 20 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74  .    codeEqualit
d200: 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54  yTerm(pParse, pT
d210: 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c  erm, brk, pLevel
d220: 29 3b 0a 20 20 20 20 69 66 28 20 74 65 72 6d 73  );.    if( terms
d230: 49 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 20 20 73  InMem ){.      s
d240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d250: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
d260: 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b 6a 2b 31  pLevel->iMem+j+1
d270: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
d280: 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e 45 71    assert( j==nEq
d290: 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73   );..  /* Make s
d2a0: 75 72 65 20 61 6c 6c 20 74 68 65 20 63 6f 6e 73  ure all the cons
d2b0: 74 72 61 69 6e 74 20 76 61 6c 75 65 73 20 61 72  traint values ar
d2c0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  e on the top of 
d2d0: 74 68 65 20 73 74 61 63 6b 0a 20 20 2a 2f 0a 20  the stack.  */. 
d2e0: 20 69 66 28 20 74 65 72 6d 73 49 6e 4d 65 6d 20   if( termsInMem 
d2f0: 29 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  ){.    for(j=0; 
d300: 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
d310: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
d320: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
d330: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2b  d, pLevel->iMem+
d340: 6a 2b 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  j+1, 0);.    }. 
d350: 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
d360: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
d370: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
d380: 6e 67 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64  ng variable hold
d390: 73 20 61 20 74 65 78 74 20 64 65 73 63 72 69 70  s a text descrip
d3a0: 74 69 6f 6e 20 6f 66 20 71 75 65 72 79 20 70 6c  tion of query pl
d3b0: 61 6e 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  an generated.** 
d3c0: 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
d3d0: 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  nt call to sqlit
d3e0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 2e 20  e3WhereBegin(). 
d3f0: 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 57 68   Each call to Wh
d400: 65 72 65 42 65 67 69 6e 0a 2a 2a 20 6f 76 65 72  ereBegin.** over
d410: 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
d420: 6f 75 73 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ous.  This infor
d430: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
d440: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 0a 2a  or testing and.*
d450: 2a 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  * analysis only.
d460: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
d470: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 42 4d 53 2a  _query_plan[BMS*
d480: 32 2a 34 30 5d 3b 20 20 2f 2a 20 54 65 78 74 20  2*40];  /* Text 
d490: 6f 66 20 74 68 65 20 6a 6f 69 6e 20 2a 2f 0a 73  of the join */.s
d4a0: 74 61 74 69 63 20 69 6e 74 20 6e 51 50 6c 61 6e  tatic int nQPlan
d4b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d4c0: 20 20 20 2f 2a 20 4e 65 78 74 20 66 72 65 65 20     /* Next free 
d4d0: 73 6c 6f 77 20 69 6e 20 5f 71 75 65 72 79 5f 70  slow in _query_p
d4e0: 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23 65 6e 64 69 66  lan[] */..#endif
d4f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
d500: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20  */.../*.** Free 
d510: 61 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  a WhereInfo stru
d520: 63 74 75 72 65 0a 2a 2f 0a 73 74 61 74 69 63 20  cture.*/.static 
d530: 76 6f 69 64 20 77 68 65 72 65 49 6e 66 6f 46 72  void whereInfoFr
d540: 65 65 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  ee(WhereInfo *pW
d550: 49 6e 66 6f 29 7b 0a 20 20 69 66 28 20 70 57 49  Info){.  if( pWI
d560: 6e 66 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nfo ){.    int i
d570: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d580: 3c 70 57 49 6e 66 6f 2d 3e 6e 4c 65 76 65 6c 3b  <pWInfo->nLevel;
d590: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
d5a0: 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
d5b0: 2a 70 49 6e 66 6f 20 3d 20 70 57 49 6e 66 6f 2d  *pInfo = pWInfo-
d5c0: 3e 61 5b 69 5d 2e 70 49 64 78 49 6e 66 6f 3b 0a  >a[i].pIdxInfo;.
d5d0: 20 20 20 20 20 20 69 66 28 20 70 49 6e 66 6f 20        if( pInfo 
d5e0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
d5f0: 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65  Info->needToFree
d600: 49 64 78 53 74 72 20 29 7b 0a 20 20 20 20 20 20  IdxStr ){.      
d610: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
d620: 28 70 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  (pInfo->idxStr);
d630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d640: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49     sqliteFree(pI
d650: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nfo);.      }.  
d660: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
d670: 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 7d 0a  ee(pWInfo);.  }.
d680: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
d690: 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  te the beginning
d6a0: 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65   of the loop use
d6b0: 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75  d for WHERE clau
d6c0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
d6d0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
d6e0: 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ue is a pointer 
d6f0: 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72  to an opaque str
d700: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
d710: 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74  ains.** informat
d720: 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65  ion needed to te
d730: 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70  rminate the loop
d740: 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61  .  Later, the ca
d750: 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a  lling routine.**
d760: 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73   should invoke s
d770: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
d780: 20 77 69 74 68 20 74 68 65 20 72 65 74 75 72 6e   with the return
d790: 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66   value of this f
d7a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72  unction.** in or
d7b0: 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20  der to complete 
d7c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
d7d0: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a   processing..**.
d7e0: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
d7f0: 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74  ccurs, this rout
d800: 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  ine returns NULL
d810: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69  ..**.** The basi
d820: 63 20 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20  c idea is to do 
d830: 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f  a nested loop, o
d840: 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68  ne loop for each
d850: 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65   table in.** the
d860: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20   FROM clause of 
d870: 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45  a select.  (INSE
d880: 52 54 20 61 6e 64 20 55 50 44 41 54 45 20 73 74  RT and UPDATE st
d890: 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65  atements are the
d8a0: 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45  .** same as a SE
d8b0: 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61  LECT with only a
d8c0: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e   single table in
d8d0: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
d8e0: 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70  .)  For.** examp
d8f0: 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69  le, if the SQL i
d900: 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  s this:.**.**   
d910: 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f      SELECT * FRO
d920: 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45  M t1, t2, t3 WHE
d930: 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68  RE ...;.**.** Th
d940: 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  en the code gene
d950: 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74  rated is concept
d960: 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66  ually like the f
d970: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
d980: 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77       foreach row
d990: 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20  1 in t1 do      
d9a0: 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
d9b0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66  ated.**        f
d9c0: 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74  oreach row2 in t
d9d0: 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79  2 do      |-- by
d9e0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
d9f0: 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  in().**         
da00: 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e   foreach row3 in
da10: 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20   t3 do   /.**   
da20: 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20           ....** 
da30: 20 20 20 20 20 20 20 20 20 65 6e 64 20 20 20 20           end    
da40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da50: 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72   \    Code gener
da60: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65  ated.**        e
da70: 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nd              
da80: 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79            |-- by
da90: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
daa0: 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20  ().**      end  
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 4e         /.**.** N
dad0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6c 6f 6f  ote that the loo
dae0: 70 73 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  ps might not be 
daf0: 6e 65 73 74 65 64 20 69 6e 20 74 68 65 20 6f 72  nested in the or
db00: 64 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 65  der in which the
db10: 79 0a 2a 2a 20 61 70 70 65 61 72 20 69 6e 20 74  y.** appear in t
db20: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69  he FROM clause i
db30: 66 20 61 20 64 69 66 66 65 72 65 6e 74 20 6f 72  f a different or
db40: 64 65 72 20 69 73 20 62 65 74 74 65 72 20 61 62  der is better ab
db50: 6c 65 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 75 73  le to make.** us
db60: 65 20 6f 66 20 69 6e 64 69 63 65 73 2e 20 20 4e  e of indices.  N
db70: 6f 74 65 20 61 6c 73 6f 20 74 68 61 74 20 77 68  ote also that wh
db80: 65 6e 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  en the IN operat
db90: 6f 72 20 61 70 70 65 61 72 73 20 69 6e 0a 2a 2a  or appears in.**
dba0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
dbb0: 65 2c 20 69 74 20 6d 69 67 68 74 20 72 65 73 75  e, it might resu
dbc0: 6c 74 20 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  lt in additional
dbd0: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 73 20 66 6f   nested loops fo
dbe0: 72 0a 2a 2a 20 73 63 61 6e 6e 69 6e 67 20 74 68  r.** scanning th
dbf0: 72 6f 75 67 68 20 61 6c 6c 20 76 61 6c 75 65 73  rough all values
dc00: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
dc10: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 49  nd side of the I
dc20: 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  N..**.** There a
dc30: 72 65 20 42 74 72 65 65 20 63 75 72 73 6f 72 73  re Btree cursors
dc40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
dc50: 20 65 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31   each table.  t1
dc60: 20 75 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20   uses cursor.** 
dc70: 6e 75 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d  number pTabList-
dc80: 3e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20  >a[0].iCursor.  
dc90: 74 32 20 75 73 65 73 20 74 68 65 20 63 75 72 73  t2 uses the curs
dca0: 6f 72 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31  or pTabList->a[1
dcb0: 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e  ].iCursor..** An
dcc0: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69  d so forth.  Thi
dcd0: 73 20 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61  s routine genera
dce0: 74 65 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e  tes code to open
dcf0: 20 74 68 6f 73 65 20 56 44 42 45 20 63 75 72 73   those VDBE curs
dd00: 6f 72 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ors.** and sqlit
dd10: 65 33 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e  e3WhereEnd() gen
dd20: 65 72 61 74 65 73 20 74 68 65 20 63 6f 64 65 20  erates the code 
dd30: 74 6f 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a  to close them..*
dd40: 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68  *.** The code th
dd50: 61 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  at sqlite3WhereB
dd60: 65 67 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73  egin() generates
dd70: 20 6c 65 61 76 65 73 20 74 68 65 20 63 75 72 73   leaves the curs
dd80: 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20  ors named.** in 
dd90: 70 54 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e  pTabList pointin
dda0: 67 20 61 74 20 74 68 65 69 72 20 61 70 70 72 6f  g at their appro
ddb0: 70 72 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20  priate entries. 
ddc0: 20 54 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a   The [...] code.
ddd0: 2a 2a 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f  ** can use OP_Co
dde0: 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69  lumn and OP_Rowi
ddf0: 64 20 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65  d opcodes on the
de00: 73 65 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78  se cursors to ex
de10: 74 72 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72  tract.** data fr
de20: 6f 6d 20 74 68 65 20 76 61 72 69 6f 75 73 20 74  om the various t
de30: 61 62 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f  ables of the loo
de40: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  p..**.** If the 
de50: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
de60: 65 6d 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61  empty, the forea
de70: 63 68 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61  ch loops must ea
de80: 63 68 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a  ch scan their.**
de90: 20 65 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20   entire tables. 
dea0: 20 54 68 75 73 20 61 20 74 68 72 65 65 2d 77 61   Thus a three-wa
deb0: 79 20 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e  y join is an O(N
dec0: 5e 33 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  ^3) operation.  
ded0: 42 75 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61  But if.** the ta
dee0: 62 6c 65 73 20 68 61 76 65 20 69 6e 64 69 63 65  bles have indice
def0: 73 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  s and there are 
df00: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45  terms in the WHE
df10: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a  RE clause that.*
df20: 2a 20 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65  * refer to those
df30: 20 69 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70   indices, a comp
df40: 6c 65 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20  lete table scan 
df50: 63 61 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61  can be avoided a
df60: 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77  nd the.** code w
df70: 69 6c 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73  ill run much fas
df80: 74 65 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68  ter.  Most of th
df90: 65 20 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72  e work of this r
dfa0: 6f 75 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69  outine is checki
dfb0: 6e 67 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ng.** to see if 
dfc0: 74 68 65 72 65 20 61 72 65 20 69 6e 64 69 63 65  there are indice
dfd0: 73 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  s that can be us
dfe0: 65 64 20 74 6f 20 73 70 65 65 64 20 75 70 20 74  ed to speed up t
dff0: 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54  he loop..**.** T
e000: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
e010: 45 20 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73  E clause are als
e020: 6f 20 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20  o used to limit 
e030: 77 68 69 63 68 20 72 6f 77 73 20 61 63 74 75 61  which rows actua
e040: 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74  lly.** make it t
e050: 6f 20 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74  o the "..." in t
e060: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65  he middle of the
e070: 20 6c 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61   loop.  After ea
e080: 63 68 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a  ch "foreach",.**
e090: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48   terms of the WH
e0a0: 45 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20  ERE clause that 
e0b0: 75 73 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69  use only terms i
e0c0: 6e 20 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20  n that loop and 
e0d0: 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61  outer.** loops a
e0e0: 72 65 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64  re evaluated and
e0f0: 20 69 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70   if false a jump
e100: 20 69 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20   is made around 
e110: 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a  all subsequent.*
e120: 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f  * inner loops (o
e130: 72 20 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e  r around the "..
e140: 2e 22 20 69 66 20 74 68 65 20 74 65 73 74 20 6f  ." if the test o
e150: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
e160: 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20   inner-.** most 
e170: 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45  loop).**.** OUTE
e180: 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e  R JOINS.**.** An
e190: 20 6f 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74   outer join of t
e1a0: 61 62 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20  ables t1 and t2 
e1b0: 69 73 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63  is conceptally c
e1c0: 6f 64 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  oded as follows:
e1d0: 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63  .**.**    foreac
e1e0: 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a  h row1 in t1 do.
e1f0: 2a 2a 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30  **      flag = 0
e200: 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68  .**      foreach
e210: 20 72 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a   row2 in t2 do.*
e220: 2a 20 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a  *        start:.
e230: 2a 2a 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a  **          ....
e240: 2a 2a 20 20 20 20 20 20 20 20 20 20 66 6c 61 67  **          flag
e250: 20 3d 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64   = 1.**      end
e260: 0a 2a 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67  .**      if flag
e270: 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  ==0 then.**     
e280: 20 20 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32     move the row2
e290: 20 63 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c   cursor to a nul
e2a0: 6c 20 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20  l row.**        
e2b0: 67 6f 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20  goto start.**   
e2c0: 20 20 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a     fi.**    end.
e2d0: 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43  **.** ORDER BY C
e2e0: 4c 41 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47  LAUSE PROCESSING
e2f0: 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42  .**.** *ppOrderB
e300: 79 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  y is a pointer t
e310: 6f 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  o the ORDER BY c
e320: 6c 61 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43  lause of a SELEC
e330: 54 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20  T statement,.** 
e340: 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e  if there is one.
e350: 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
e360: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e370: 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75 74   or if this rout
e380: 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
e390: 20 66 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20   from an UPDATE 
e3a0: 6f 72 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  or DELETE statem
e3b0: 65 6e 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65  ent, then ppOrde
e3c0: 72 42 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  rBy is NULL..**.
e3d0: 2a 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63  ** If an index c
e3e0: 61 6e 20 62 65 20 75 73 65 64 20 73 6f 20 74 68  an be used so th
e3f0: 61 74 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f  at the natural o
e400: 75 74 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74  utput order of t
e410: 68 65 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e  he table.** scan
e420: 20 69 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20   is correct for 
e430: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
e440: 75 73 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69  use, then that i
e450: 6e 64 65 78 20 69 73 20 75 73 65 64 20 61 6e 64  ndex is used and
e460: 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69  .** *ppOrderBy i
e470: 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20  s set to NULL.  
e480: 54 68 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d  This is an optim
e490: 69 7a 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65  ization that pre
e4a0: 76 65 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65  vents an.** unne
e4b0: 63 65 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20  cessary sort of 
e4c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 69  the result set i
e4d0: 66 20 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f  f an index appro
e4e0: 70 72 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a  priate for the.*
e4f0: 2a 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  * ORDER BY claus
e500: 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
e510: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77  ..**.** If the w
e520: 68 65 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70  here clause loop
e530: 73 20 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61  s cannot be arra
e540: 6e 67 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20  nged to provide 
e550: 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f  the correct.** o
e560: 75 74 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65  utput order, the
e570: 6e 20 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79  n the *ppOrderBy
e580: 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
e590: 2f 0a 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c  /.WhereInfo *sql
e5a0: 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a  ite3WhereBegin(.
e5b0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e5c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
e5d0: 61 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f  arser context */
e5e0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62  .  SrcList *pTab
e5f0: 4c 69 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69  List,    /* A li
e600: 73 74 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73  st of all tables
e610: 20 74 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a   to be scanned *
e620: 2f 0a 20 20 45 78 70 72 20 2a 70 57 68 65 72 65  /.  Expr *pWhere
e630: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
e640: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f   WHERE clause */
e650: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70  .  ExprList **pp
e660: 4f 72 64 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f  OrderBy  /* An O
e670: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
e680: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20  or NULL */.){.  
e690: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
e6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e6b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e6c0: 57 68 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66  WhereInfo *pWInf
e6d0: 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69  o;         /* Wi
e6e0: 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65  ll become the re
e6f0: 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68  turn value of th
e700: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  is function */. 
e710: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
e720: 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54  e->pVdbe;   /* T
e730: 68 65 20 76 69 72 74 75 61 6c 20 64 61 74 61 62  he virtual datab
e740: 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20  ase engine */.  
e750: 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20  int brk, cont = 
e760: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64  0;         /* Ad
e770: 64 72 65 73 73 65 73 20 75 73 65 64 20 64 75 72  dresses used dur
e780: 69 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ing code generat
e790: 69 6f 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b  ion */.  Bitmask
e7a0: 20 6e 6f 74 52 65 61 64 79 3b 20 20 20 20 20 20   notReady;      
e7b0: 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 73 20 74      /* Cursors t
e7c0: 68 61 74 20 61 72 65 20 6e 6f 74 20 79 65 74 20  hat are not yet 
e7d0: 70 6f 73 69 74 69 6f 6e 65 64 20 2a 2f 0a 20 20  positioned */.  
e7e0: 57 68 65 72 65 54 65 72 6d 20 2a 70 54 65 72 6d  WhereTerm *pTerm
e7f0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  ;          /* A 
e800: 73 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74  single term in t
e810: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e820: 2a 2f 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74  */.  ExprMaskSet
e830: 20 6d 61 73 6b 53 65 74 3b 20 20 20 20 20 20 20   maskSet;       
e840: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
e850: 6e 20 6d 61 73 6b 20 73 65 74 20 2a 2f 0a 20 20  n mask set */.  
e860: 57 68 65 72 65 43 6c 61 75 73 65 20 77 63 3b 20  WhereClause wc; 
e870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e880: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
e890: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
e8a0: 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  hese terms */.  
e8b0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
e8c0: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
e8d0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72  /* A single entr
e8e0: 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20  y from pTabList 
e8f0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
e900: 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
e910: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
e920: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57   level in the pW
e930: 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 20 20 69  Info list */.  i
e940: 6e 74 20 69 46 72 6f 6d 3b 20 20 20 20 20 20 20  nt iFrom;       
e950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e960: 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 46  * First unused F
e970: 52 4f 4d 20 63 6c 61 75 73 65 20 65 6c 65 6d 65  ROM clause eleme
e980: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 61 6e 64 46  nt */.  int andF
e990: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
e9a0: 20 20 20 2f 2a 20 41 4e 44 2d 65 64 20 63 6f 6d     /* AND-ed com
e9b0: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  bination of all 
e9c0: 77 63 2e 61 5b 5d 2e 66 6c 61 67 73 20 2a 2f 0a  wc.a[].flags */.
e9d0: 0a 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72  .  /* The number
e9e0: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
e9f0: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73  e FROM clause is
ea00: 20 6c 69 6d 69 74 65 64 20 62 79 20 74 68 65 20   limited by the 
ea10: 6e 75 6d 62 65 72 20 6f 66 0a 20 20 2a 2a 20 62  number of.  ** b
ea20: 69 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b  its in a Bitmask
ea30: 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 54 61   .  */.  if( pTa
ea40: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 42 4d 53 20  bList->nSrc>BMS 
ea50: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
ea60: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
ea70: 61 74 20 6d 6f 73 74 20 25 64 20 74 61 62 6c 65  at most %d table
ea80: 73 20 69 6e 20 61 20 6a 6f 69 6e 22 2c 20 42 4d  s in a join", BM
ea90: 53 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  S);.    return 0
eaa0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69  ;.  }..  /* Spli
eab0: 74 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  t the WHERE clau
eac0: 73 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65  se into separate
ead0: 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20   subexpressions 
eae0: 77 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20  where each.  ** 
eaf0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73  subexpression is
eb00: 20 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e   separated by an
eb10: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 0a 20   AND operator.. 
eb20: 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b 53 65   */.  initMaskSe
eb30: 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 77  t(&maskSet);.  w
eb40: 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74 28 26  hereClauseInit(&
eb50: 77 63 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 77  wc, pParse);.  w
eb60: 68 65 72 65 53 70 6c 69 74 28 26 77 63 2c 20 70  hereSplit(&wc, p
eb70: 57 68 65 72 65 2c 20 54 4b 5f 41 4e 44 29 3b 0a  Where, TK_AND);.
eb80: 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61      .  /* Alloca
eb90: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
eba0: 65 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20  e the WhereInfo 
ebb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 77  structure that w
ebc0: 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20  ill become the. 
ebd0: 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
ebe0: 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20  ..  */.  pWInfo 
ebf0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ec00: 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f  sizeof(WhereInfo
ec10: 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53  ) + pTabList->nS
ec20: 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c  rc*sizeof(WhereL
ec30: 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20 73 71  evel));.  if( sq
ec40: 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c 65  lite3MallocFaile
ec50: 64 28 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  d() ){.    goto 
ec60: 77 68 65 72 65 42 65 67 69 6e 4e 6f 4d 65 6d 3b  whereBeginNoMem;
ec70: 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 6e  .  }.  pWInfo->n
ec80: 4c 65 76 65 6c 20 3d 20 70 54 61 62 4c 69 73 74  Level = pTabList
ec90: 2d 3e 6e 53 72 63 3b 0a 20 20 70 57 49 6e 66 6f  ->nSrc;.  pWInfo
eca0: 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  ->pParse = pPars
ecb0: 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61  e;.  pWInfo->pTa
ecc0: 62 4c 69 73 74 20 3d 20 70 54 61 62 4c 69 73 74  bList = pTabList
ecd0: 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  ;.  pWInfo->iBre
ece0: 61 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ak = sqlite3Vdbe
ecf0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
ed00: 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65   /* Special case
ed10: 3a 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  : a WHERE clause
ed20: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 61 6e   that is constan
ed30: 74 2e 20 20 45 76 61 6c 75 61 74 65 20 74 68 65  t.  Evaluate the
ed40: 0a 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  .  ** expression
ed50: 20 61 6e 64 20 65 69 74 68 65 72 20 6a 75 6d 70   and either jump
ed60: 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20 74 68 65   over all of the
ed70: 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c 20 74 68   code or fall th
ed80: 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ru..  */.  if( p
ed90: 57 68 65 72 65 20 26 26 20 28 70 54 61 62 4c 69  Where && (pTabLi
eda0: 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73  st->nSrc==0 || s
edb0: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
edc0: 74 61 6e 74 28 70 57 68 65 72 65 29 29 20 29 7b  tant(pWhere)) ){
edd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
ede0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
edf0: 70 57 68 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e  pWhere, pWInfo->
ee00: 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20  iBreak, 1);.    
ee10: 70 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a  pWhere = 0;.  }.
ee20: 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c  .  /* Analyze al
ee30: 6c 20 6f 66 20 74 68 65 20 73 75 62 65 78 70 72  l of the subexpr
ee40: 65 73 73 69 6f 6e 73 2e 20 20 4e 6f 74 65 20 74  essions.  Note t
ee50: 68 61 74 20 65 78 70 72 41 6e 61 6c 79 7a 65 28  hat exprAnalyze(
ee60: 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 61 64 64  ) might.  ** add
ee70: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 74 65 72   new virtual ter
ee80: 6d 73 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20  ms onto the end 
ee90: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
eea0: 75 73 65 2e 20 20 57 65 20 64 6f 20 6e 6f 74 0a  use.  We do not.
eeb0: 20 20 2a 2a 20 77 61 6e 74 20 74 6f 20 61 6e 61    ** want to ana
eec0: 6c 79 7a 65 20 74 68 65 73 65 20 76 69 72 74 75  lyze these virtu
eed0: 61 6c 20 74 65 72 6d 73 2c 20 73 6f 20 73 74 61  al terms, so sta
eee0: 72 74 20 61 6e 61 6c 79 7a 69 6e 67 20 61 74 20  rt analyzing at 
eef0: 74 68 65 20 65 6e 64 0a 20 20 2a 2a 20 61 6e 64  the end.  ** and
ef00: 20 77 6f 72 6b 20 66 6f 72 77 61 72 64 20 73 6f   work forward so
ef10: 20 74 68 61 74 20 74 68 65 20 61 64 64 65 64 20   that the added 
ef20: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 20 61 72  virtual terms ar
ef30: 65 20 6e 65 76 65 72 20 70 72 6f 63 65 73 73 65  e never processe
ef40: 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
ef50: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
ef60: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  Src; i++){.    c
ef70: 72 65 61 74 65 4d 61 73 6b 28 26 6d 61 73 6b 53  reateMask(&maskS
ef80: 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
ef90: 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a 20 20 7d  i].iCursor);.  }
efa0: 0a 20 20 65 78 70 72 41 6e 61 6c 79 7a 65 41 6c  .  exprAnalyzeAl
efb0: 6c 28 70 54 61 62 4c 69 73 74 2c 20 26 6d 61 73  l(pTabList, &mas
efc0: 6b 53 65 74 2c 20 26 77 63 29 3b 0a 20 20 69 66  kSet, &wc);.  if
efd0: 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46  ( sqlite3MallocF
efe0: 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20 67  ailed() ){.    g
eff0: 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e 6f  oto whereBeginNo
f000: 4d 65 6d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  Mem;.  }..  /* C
f010: 68 6f 73 65 20 74 68 65 20 62 65 73 74 20 69 6e  hose the best in
f020: 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20 65  dex to use for e
f030: 61 63 68 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ach table in the
f040: 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 0a 20 20   FROM clause..  
f050: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f  **.  ** This loo
f060: 70 20 66 69 6c 6c 73 20 69 6e 20 74 68 65 20 66  p fills in the f
f070: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a  ollowing fields:
f080: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 70 57 49  .  **.  **   pWI
f090: 6e 66 6f 2d 3e 61 5b 5d 2e 70 49 64 78 20 20 20  nfo->a[].pIdx   
f0a0: 20 20 20 54 68 65 20 69 6e 64 65 78 20 74 6f 20     The index to 
f0b0: 75 73 65 20 66 6f 72 20 74 68 69 73 20 6c 65 76  use for this lev
f0c0: 65 6c 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 0a  el of the loop..
f0d0: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
f0e0: 5b 5d 2e 66 6c 61 67 73 20 20 20 20 20 57 48 45  [].flags     WHE
f0f0: 52 45 5f 78 78 78 20 66 6c 61 67 73 20 61 73 73  RE_xxx flags ass
f100: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 49 64  ociated with pId
f110: 78 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d  x.  **   pWInfo-
f120: 3e 61 5b 5d 2e 6e 45 71 20 20 20 20 20 20 20 54  >a[].nEq       T
f130: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  he number of == 
f140: 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  and IN constrain
f150: 74 73 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f  ts.  **   pWInfo
f160: 2d 3e 61 5b 5d 2e 69 46 72 6f 6d 20 20 20 20 20  ->a[].iFrom     
f170: 57 68 65 6e 20 74 65 72 6d 20 6f 66 20 74 68 65  When term of the
f180: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 73 20   FROM clause is 
f190: 62 65 69 6e 67 20 63 6f 64 65 64 0a 20 20 2a 2a  being coded.  **
f1a0: 20 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69     pWInfo->a[].i
f1b0: 54 61 62 43 75 72 20 20 20 54 68 65 20 56 44 42  TabCur   The VDB
f1c0: 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68 65  E cursor for the
f1d0: 20 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 0a   database table.
f1e0: 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e 61    **   pWInfo->a
f1f0: 5b 5d 2e 69 49 64 78 43 75 72 20 20 20 54 68 65  [].iIdxCur   The
f200: 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72   VDBE cursor for
f210: 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 0a   the index.  **.
f220: 20 20 2a 2a 20 54 68 69 73 20 6c 6f 6f 70 20 61    ** This loop a
f230: 6c 73 6f 20 66 69 67 75 72 65 73 20 6f 75 74 20  lso figures out 
f240: 74 68 65 20 6e 65 73 74 69 6e 67 20 6f 72 64 65  the nesting orde
f250: 72 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74  r of tables in t
f260: 68 65 20 46 52 4f 4d 0a 20 20 2a 2a 20 63 6c 61  he FROM.  ** cla
f270: 75 73 65 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52  use..  */.  notR
f280: 65 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b  eady = ~(Bitmask
f290: 29 30 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  )0;.  pTabItem =
f2a0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20   pTabList->a;.  
f2b0: 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
f2c0: 3e 61 3b 0a 20 20 61 6e 64 46 6c 61 67 73 20 3d  >a;.  andFlags =
f2d0: 20 7e 30 3b 0a 20 20 54 52 41 43 45 28 28 22 2a   ~0;.  TRACE(("*
f2e0: 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 53 74 61  ** Optimizer Sta
f2f0: 72 74 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 20 20 66  rt ***\n"));.  f
f300: 6f 72 28 69 3d 69 46 72 6f 6d 3d 30 2c 20 70 4c  or(i=iFrom=0, pL
f310: 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
f320: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
f330: 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
f340: 7b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  {.    Index *pId
f350: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
f360: 20 20 2f 2a 20 49 6e 64 65 78 20 66 6f 72 20 46    /* Index for F
f370: 52 4f 4d 20 74 61 62 6c 65 20 61 74 20 70 54 61  ROM table at pTa
f380: 62 49 74 65 6d 20 2a 2f 0a 20 20 20 20 69 6e 74  bItem */.    int
f390: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
f3a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
f3b0: 73 20 61 73 73 73 6f 63 69 61 74 65 64 20 77 69  s asssociated wi
f3c0: 74 68 20 70 49 64 78 20 2a 2f 0a 20 20 20 20 69  th pIdx */.    i
f3d0: 6e 74 20 6e 45 71 3b 20 20 20 20 20 20 20 20 20  nt nEq;         
f3e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
f3f0: 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49 4e  mber of == or IN
f400: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a   constraints */.
f410: 20 20 20 20 64 6f 75 62 6c 65 20 63 6f 73 74 3b      double cost;
f420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f430: 2f 2a 20 54 68 65 20 63 6f 73 74 20 66 6f 72 20  /* The cost for 
f440: 70 49 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  pIdx */.    int 
f450: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
f460: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
f470: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 46 52 4f 4d  ooping over FROM
f480: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 49   tables */.    I
f490: 6e 64 65 78 20 2a 70 42 65 73 74 20 3d 20 30 3b  ndex *pBest = 0;
f4a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f4b0: 65 20 62 65 73 74 20 69 6e 64 65 78 20 73 65 65  e best index see
f4c0: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 20 20  n so far */.    
f4d0: 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20 3d 20  int bestFlags = 
f4e0: 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  0;          /* F
f4f0: 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  lags associated 
f500: 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
f510: 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20 3d 20    int bestNEq = 
f520: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
f530: 20 6e 45 71 20 61 73 73 6f 63 69 61 74 65 64 20   nEq associated 
f540: 77 69 74 68 20 70 42 65 73 74 20 2a 2f 0a 20 20  with pBest */.  
f550: 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73 74 43    double lowestC
f560: 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ost;          /*
f570: 20 43 6f 73 74 20 6f 66 20 74 68 65 20 70 42 65   Cost of the pBe
f580: 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65  st */.    int be
f590: 73 74 4a 20 3d 20 30 3b 20 20 20 20 20 20 20 20  stJ = 0;        
f5a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c        /* The val
f5b0: 75 65 20 6f 66 20 6a 20 2a 2f 0a 20 20 20 20 42  ue of j */.    B
f5c0: 69 74 6d 61 73 6b 20 6d 3b 20 20 20 20 20 20 20  itmask m;       
f5d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69             /* Bi
f5e0: 74 6d 61 73 6b 20 76 61 6c 75 65 20 66 6f 72 20  tmask value for 
f5f0: 6a 20 6f 72 20 62 65 73 74 4a 20 2a 2f 0a 20 20  j or bestJ */.  
f600: 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 30 3b 20    int once = 0; 
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f620: 20 54 72 75 65 20 77 68 65 6e 20 66 69 72 73 74   True when first
f630: 20 74 61 62 6c 65 20 69 73 20 73 65 65 6e 20 2a   table is seen *
f640: 2f 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f 73  /..    lowestCos
f650: 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f 44  t = SQLITE_BIG_D
f660: 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 46  BL;.    for(j=iF
f670: 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26 70  rom, pTabItem=&p
f680: 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20 6a  TabList->a[j]; j
f690: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
f6a0: 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   j++, pTabItem++
f6b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f 4e  ){.      int doN
f6c0: 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20 54  otReorder;  /* T
f6d0: 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62 6c  rue if this tabl
f6e0: 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  e should not be 
f6f0: 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20 20  reordered */..  
f700: 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72      doNotReorder
f710: 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e 6a   =  (pTabItem->j
f720: 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45  ointype & (JT_LE
f730: 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30  FT|JT_CROSS))!=0
f740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f750: 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20 28      || (j>0 && (
f760: 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f 69  pTabItem[-1].joi
f770: 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46 54  ntype & (JT_LEFT
f780: 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29 3b  |JT_CROSS))!=0);
f790: 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20  .      if( once 
f7a0: 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20  && doNotReorder 
f7b0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6d  ) break;.      m
f7c0: 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b   = getMask(&mask
f7d0: 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  Set, pTabItem->i
f7e0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 69  Cursor);.      i
f7f0: 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64 79  f( (m & notReady
f800: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
f810: 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20 69  if( j==iFrom ) i
f820: 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20  From++;.        
f830: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
f840: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
f850: 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20 29  pTabItem->pTab )
f860: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
f870: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
f880: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73 56  LE.      if( IsV
f890: 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d 2d  irtual(pTabItem-
f8a0: 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20 20  >pTab) ){.      
f8b0: 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69 72    cost = bestVir
f8c0: 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73 65  tualIndex(pParse
f8d0: 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d 2c  , &wc, pTabItem,
f8e0: 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20 20   notReady,.     
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f900: 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72 64             ppOrd
f910: 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72 42  erBy ? *ppOrderB
f920: 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20 20  y : 0, i==0,.   
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
f950: 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 29 3b  evel->pIdxInfo);
f960: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
f970: 20 57 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41   WHERE_VIRTUALTA
f980: 42 4c 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28  BLE;.        if(
f990: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66   pLevel->pIdxInf
f9a0: 6f 20 26 26 20 70 4c 65 76 65 6c 2d 3e 70 49 64  o && pLevel->pId
f9b0: 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42 79 43 6f  xInfo->orderByCo
f9c0: 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20 20 20 20  nsumed ){.      
f9d0: 20 20 20 20 66 6c 61 67 73 20 3d 20 57 48 45 52      flags = WHER
f9e0: 45 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 7c  E_VIRTUALTABLE |
f9f0: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a   WHERE_ORDERBY;.
fa00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fa10: 20 20 70 49 64 78 20 3d 20 30 3b 0a 20 20 20 20    pIdx = 0;.    
fa20: 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a 20 20 20      nEq = 0;.   
fa30: 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e 64 69 66     }else .#endif
fa40: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
fa50: 20 63 6f 73 74 20 3d 20 62 65 73 74 49 6e 64 65   cost = bestInde
fa60: 78 28 70 50 61 72 73 65 2c 20 26 77 63 2c 20 70  x(pParse, &wc, p
fa70: 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52 65 61 64  TabItem, notRead
fa80: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  y,.             
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 3d 3d              (i==
faa0: 30 20 26 26 20 70 70 4f 72 64 65 72 42 79 29 20  0 && ppOrderBy) 
fab0: 3f 20 2a 70 70 4f 72 64 65 72 42 79 20 3a 20 30  ? *ppOrderBy : 0
fac0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fad0: 20 20 20 20 20 20 20 20 20 20 20 26 70 49 64 78             &pIdx
fae0: 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45 71 29 3b  , &flags, &nEq);
faf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fb00: 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73 74 43 6f  f( cost<lowestCo
fb10: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 6e  st ){.        on
fb20: 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ce = 1;.        
fb30: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73  lowestCost = cos
fb40: 74 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  t;.        pBest
fb50: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
fb60: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
fb70: 67 73 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  gs;.        best
fb80: 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 20  NEq = nEq;.     
fb90: 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b 0a 20 20     bestJ = j;.  
fba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
fbb0: 64 6f 4e 6f 74 52 65 6f 72 64 65 72 20 29 20 62  doNotReorder ) b
fbc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
fbd0: 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70 74 69  TRACE(("*** Opti
fbe0: 6d 69 7a 65 72 20 63 68 6f 6f 73 65 20 74 61 62  mizer choose tab
fbf0: 6c 65 20 25 64 20 66 6f 72 20 6c 6f 6f 70 20 25  le %d for loop %
fc00: 64 5c 6e 22 2c 20 62 65 73 74 4a 2c 0a 20 20 20  d\n", bestJ,.   
fc10: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 70          pLevel-p
fc20: 57 49 6e 66 6f 2d 3e 61 29 29 3b 0a 20 20 20 20  WInfo->a));.    
fc30: 69 66 28 20 28 62 65 73 74 46 6c 61 67 73 20 26  if( (bestFlags &
fc40: 20 57 48 45 52 45 5f 4f 52 44 45 52 42 59 29 21   WHERE_ORDERBY)!
fc50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 4f  =0 ){.      *ppO
fc60: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
fc70: 7d 0a 20 20 20 20 61 6e 64 46 6c 61 67 73 20 26  }.    andFlags &
fc80: 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20  = bestFlags;.   
fc90: 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 3d   pLevel->flags =
fca0: 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 20 20   bestFlags;.    
fcb0: 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 70  pLevel->pIdx = p
fcc0: 42 65 73 74 3b 0a 20 20 20 20 70 4c 65 76 65 6c  Best;.    pLevel
fcd0: 2d 3e 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b  ->nEq = bestNEq;
fce0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 61 49 6e  .    pLevel->aIn
fcf0: 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 70 4c  Loop = 0;.    pL
fd00: 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20 30 3b 0a 20  evel->nIn = 0;. 
fd10: 20 20 20 69 66 28 20 70 42 65 73 74 20 29 7b 0a     if( pBest ){.
fd20: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49        pLevel->iI
fd30: 64 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e  dxCur = pParse->
fd40: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  nTab++;.    }els
fd50: 65 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  e{.      pLevel-
fd60: 3e 69 49 64 78 43 75 72 20 3d 20 2d 31 3b 0a 20  >iIdxCur = -1;. 
fd70: 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61 64     }.    notRead
fd80: 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26 6d  y &= ~getMask(&m
fd90: 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74  askSet, pTabList
fda0: 2d 3e 61 5b 62 65 73 74 4a 5d 2e 69 43 75 72 73  ->a[bestJ].iCurs
fdb0: 6f 72 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  or);.    pLevel-
fdc0: 3e 69 46 72 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a  >iFrom = bestJ;.
fdd0: 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 2a 2a    }.  TRACE(("**
fde0: 2a 20 4f 70 74 69 6d 69 7a 65 72 20 46 69 6e 69  * Optimizer Fini
fdf0: 73 68 65 64 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a  shed ***\n"));..
fe00: 20 20 2f 2a 20 49 66 20 74 68 65 20 74 6f 74 61    /* If the tota
fe10: 6c 20 71 75 65 72 79 20 6f 6e 6c 79 20 73 65 6c  l query only sel
fe20: 65 63 74 73 20 61 20 73 69 6e 67 6c 65 20 72 6f  ects a single ro
fe30: 77 2c 20 74 68 65 6e 20 74 68 65 20 4f 52 44 45  w, then the ORDE
fe40: 52 20 42 59 0a 20 20 2a 2a 20 63 6c 61 75 73 65  R BY.  ** clause
fe50: 20 69 73 20 69 72 72 65 6c 65 76 61 6e 74 2e 0a   is irrelevant..
fe60: 20 20 2a 2f 0a 20 20 69 66 28 20 28 61 6e 64 46    */.  if( (andF
fe70: 6c 61 67 73 20 26 20 57 48 45 52 45 5f 55 4e 49  lags & WHERE_UNI
fe80: 51 55 45 29 21 3d 30 20 26 26 20 70 70 4f 72 64  QUE)!=0 && ppOrd
fe90: 65 72 42 79 20 29 7b 0a 20 20 20 20 2a 70 70 4f  erBy ){.    *ppO
fea0: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 7d 0a  rderBy = 0;.  }.
feb0: 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74  .  /* Open all t
fec0: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70 54 61  ables in the pTa
fed0: 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20 69 6e  bList and any in
fee0: 64 69 63 65 73 20 73 65 6c 65 63 74 65 64 20 66  dices selected f
fef0: 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68 69 6e  or.  ** searchin
ff00: 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a  g those tables..
ff10: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f    */.  sqlite3Co
ff20: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
ff30: 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49  Parse, -1); /* I
ff40: 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b 69 65  nsert the cookie
ff50: 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f 20 2a   verifier Goto *
ff60: 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  /.  pLevel = pWI
ff70: 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  nfo->a;.  for(i=
ff80: 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
ff90: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
ffa0: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
ffb0: 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65  el++){.    Table
ffc0: 20 2a 70 54 61 62 3b 20 20 20 20 20 2f 2a 20 54   *pTab;     /* T
ffd0: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
ffe0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78 3b 20      Index *pIx; 
fff0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 75 73       /* Index us
10000 65 64 20 74 6f 20 61 63 63 65 73 73 20 70 54 61  ed to access pTa
10010 62 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  b (if any) */.  
10020 20 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20    int iDb;      
10030 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 64     /* Index of d
10040 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
10050 6e 67 20 74 61 62 6c 65 2f 69 6e 64 65 78 20 2a  ng table/index *
10060 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  /.    int iIdxCu
10070 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
10080 43 75 72 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  Cur;..#ifndef SQ
10090 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
100a0 4e 0a 20 20 20 20 69 66 28 20 70 50 61 72 73 65  N.    if( pParse
100b0 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a  ->explain==2 ){.
100c0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 73 67        char *zMsg
100d0 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
100e0 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
100f0 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
10100 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
10110 3b 0a 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73  ;.      zMsg = s
10120 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 54  qlite3MPrintf("T
10130 41 42 4c 45 20 25 73 22 2c 20 70 49 74 65 6d 2d  ABLE %s", pItem-
10140 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  >zName);.      i
10150 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
10160 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4d 73 67   ){.        zMsg
10170 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
10180 66 28 22 25 7a 20 41 53 20 25 73 22 2c 20 7a 4d  f("%z AS %s", zM
10190 73 67 2c 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  sg, pItem->zAlia
101a0 73 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  s);.      }.    
101b0 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65    if( (pIx = pLe
101c0 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b  vel->pIdx)!=0 ){
101d0 0a 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20  .        zMsg = 
101e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22  sqlite3MPrintf("
101f0 25 7a 20 57 49 54 48 20 49 4e 44 45 58 20 25 73  %z WITH INDEX %s
10200 22 2c 20 7a 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e  ", zMsg, pIx->zN
10210 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
10220 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c  e if( pLevel->fl
10230 61 67 73 20 26 20 28 57 48 45 52 45 5f 52 4f 57  ags & (WHERE_ROW
10240 49 44 5f 45 51 7c 57 48 45 52 45 5f 52 4f 57 49  ID_EQ|WHERE_ROWI
10250 44 5f 52 41 4e 47 45 29 20 29 7b 0a 20 20 20 20  D_RANGE) ){.    
10260 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
10270 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 55 53  e3MPrintf("%z US
10280 49 4e 47 20 50 52 49 4d 41 52 59 20 4b 45 59 22  ING PRIMARY KEY"
10290 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d  , zMsg);.      }
102a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
102b0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
102c0 45 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  E.      else if(
102d0 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 49 6e 66   pLevel->pIdxInf
102e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
102f0 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20  ite3_index_info 
10300 2a 70 49 64 78 49 6e 66 6f 20 3d 20 70 4c 65 76  *pIdxInfo = pLev
10310 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 3b 0a 20 20  el->pIdxInfo;.  
10320 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c        zMsg = sql
10330 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20  ite3MPrintf("%z 
10340 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 49 4e  VIRTUAL TABLE IN
10350 44 45 58 20 25 64 3a 25 73 22 2c 0a 20 20 20 20  DEX %d:%s",.    
10360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10370 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d  pIdxInfo->idxNum
10380 2c 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53  , pIdxInfo->idxS
10390 74 72 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  tr);.      }.#en
103a0 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 70 4c  dif.      if( pL
103b0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
103c0 45 52 45 5f 4f 52 44 45 52 42 59 20 29 7b 0a 20  ERE_ORDERBY ){. 
103d0 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71         zMsg = sq
103e0 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a  lite3MPrintf("%z
103f0 20 4f 52 44 45 52 20 42 59 22 2c 20 7a 4d 73 67   ORDER BY", zMsg
10400 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
10410 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
10420 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 20 69  v, OP_Explain, i
10430 2c 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c  , pLevel->iFrom,
10440 20 7a 4d 73 67 2c 20 50 33 5f 44 59 4e 41 4d 49   zMsg, P3_DYNAMI
10450 43 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  C);.    }.#endif
10460 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
10470 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 20 20 70  EXPLAIN */.    p
10480 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c  TabItem = &pTabL
10490 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69  ist->a[pLevel->i
104a0 46 72 6f 6d 5d 3b 0a 20 20 20 20 70 54 61 62 20  From];.    pTab 
104b0 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62  = pTabItem->pTab
104c0 3b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  ;.    iDb = sqli
104d0 74 65 33 53 63 68 65 6d 61 54 6f 49 6e 64 65 78  te3SchemaToIndex
104e0 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 70 54 61  (pParse->db, pTa
104f0 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20 20  b->pSchema);.   
10500 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45 70 68   if( pTab->isEph
10510 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  em || pTab->pSel
10520 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
10530 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10540 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10550 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
10560 3e 70 49 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20  >pIdxInfo ){.   
10570 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
10580 33 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 30  3(v, OP_VOpen, 0
10590 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  , 0, (const char
105a0 2a 29 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 50  *)pTab->pVtab, P
105b0 33 5f 56 54 41 42 29 3b 0a 20 20 20 20 7d 65 6c  3_VTAB);.    }el
105c0 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66  se.#endif.    if
105d0 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
105e0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
105f0 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)==0 ){.      s
10600 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65 28  qlite3OpenTable(
10610 70 50 61 72 73 65 2c 20 70 54 61 62 49 74 65 6d  pParse, pTabItem
10620 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44 62 2c 20  ->iCursor, iDb, 
10630 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  pTab, OP_OpenRea
10640 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  d);.      if( pT
10650 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a 65 6f 66  ab->nCol<(sizeof
10660 28 42 69 74 6d 61 73 6b 29 2a 38 29 20 29 7b 0a  (Bitmask)*8) ){.
10670 20 20 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20          Bitmask 
10680 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f  b = pTabItem->co
10690 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 20 20 69  lUsed;.        i
106a0 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
106b0 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d 62 3e 3e    for(; b; b=b>>
106c0 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  1, n++){}.      
106d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
106e0 6e 67 65 50 32 28 76 2c 20 73 71 6c 69 74 65 33  ngeP2(v, sqlite3
106f0 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
10700 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20 20 20 20  v)-1, n);.      
10710 20 20 61 73 73 65 72 74 28 20 6e 3c 3d 70 54 61    assert( n<=pTa
10720 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20 20 20  b->nCol );.     
10730 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
10740 20 20 20 20 73 71 6c 69 74 65 33 54 61 62 6c 65      sqlite3Table
10750 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20 69 44 62  Lock(pParse, iDb
10760 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c 20 30 2c  , pTab->tnum, 0,
10770 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pTab->zName);. 
10780 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d     }.    pLevel-
10790 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62 49  >iTabCur = pTabI
107a0 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
107b0 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c 65    if( (pIx = pLe
107c0 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29 7b  vel->pIdx)!=0 ){
107d0 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
107e0 70 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 49 6e  pKey = sqlite3In
107f0 64 65 78 4b 65 79 69 6e 66 6f 28 70 50 61 72 73  dexKeyinfo(pPars
10800 65 2c 20 70 49 78 29 3b 0a 20 20 20 20 20 20 61  e, pIx);.      a
10810 73 73 65 72 74 28 20 70 49 78 2d 3e 70 53 63 68  ssert( pIx->pSch
10820 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53 63 68 65  ema==pTab->pSche
10830 6d 61 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ma );.      sqli
10840 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10850 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 44 62 2c  OP_Integer, iDb,
10860 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   0);.      VdbeC
10870 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 73  omment((v, "# %s
10880 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29 29 3b  ", pIx->zName));
10890 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
108a0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
108b0 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
108c0 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  Ix->tnum,.      
108d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
108e0 63 68 61 72 2a 29 70 4b 65 79 2c 20 50 33 5f 4b  char*)pKey, P3_K
108f0 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 29 3b  EYINFO_HANDOFF);
10900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
10910 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
10920 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 21  WHERE_IDX_ONLY)!
10930 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
10940 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
10950 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
10960 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e  , iIdxCur, pIx->
10970 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20  nColumn+1);.    
10980 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64  }.    sqlite3Cod
10990 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70 50  eVerifySchema(pP
109a0 61 72 73 65 2c 20 69 44 62 29 3b 0a 20 20 7d 0a  arse, iDb);.  }.
109b0 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d    pWInfo->iTop =
109c0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
109d0 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a 20 20 2f  entAddr(v);..  /
109e0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 63  * Generate the c
109f0 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 73 65  ode to do the se
10a00 61 72 63 68 2e 20 20 45 61 63 68 20 69 74 65 72  arch.  Each iter
10a10 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 6f 72  ation of the for
10a20 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65 6c 6f 77  .  ** loop below
10a30 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
10a40 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 6e 65 73  for a single nes
10a50 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74 68 65 20  ted loop of the 
10a60 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72 61 6d 2e  VM.  ** program.
10a70 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65 61 64 79  .  */.  notReady
10a80 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29 30 3b 0a   = ~(Bitmask)0;.
10a90 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c 65 76 65    for(i=0, pLeve
10aa0 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20 69 3c 70  l=pWInfo->a; i<p
10ab0 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
10ac0 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20  ++, pLevel++){. 
10ad0 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69 6e     int j;.    in
10ae0 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74 65  t iCur = pTabIte
10af0 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20  m->iCursor;  /* 
10b00 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  The VDBE cursor 
10b10 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  for the table */
10b20 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
10b30 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  ;       /* The i
10b40 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20  ndex we will be 
10b50 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  using */.    int
10b60 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20 20   iIdxCur;       
10b70 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
10b80 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  or for the index
10b90 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74   */.    int omit
10ba0 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72  Table;     /* Tr
10bb0 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68 65  ue if we use the
10bc0 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 20   index only */. 
10bd0 20 20 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20     int bRev;    
10be0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
10bf0 20 77 65 20 6e 65 65 64 20 74 6f 20 73 63 61 6e   we need to scan
10c00 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
10c10 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61 62 49 74  r */..    pTabIt
10c20 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d 3e  em = &pTabList->
10c30 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d  a[pLevel->iFrom]
10c40 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 70 54 61  ;.    iCur = pTa
10c50 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  bItem->iCursor;.
10c60 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65      pIdx = pLeve
10c70 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64  l->pIdx;.    iId
10c80 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
10c90 49 64 78 43 75 72 3b 0a 20 20 20 20 62 52 65 76  IdxCur;.    bRev
10ca0 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67   = (pLevel->flag
10cb0 73 20 26 20 57 48 45 52 45 5f 52 45 56 45 52 53  s & WHERE_REVERS
10cc0 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d 69 74 54  E)!=0;.    omitT
10cd0 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
10ce0 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49 44  flags & WHERE_ID
10cf0 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a 20 20 20  X_ONLY)!=0;..   
10d00 20 2f 2a 20 43 72 65 61 74 65 20 6c 61 62 65 6c   /* Create label
10d10 73 20 66 6f 72 20 74 68 65 20 22 62 72 65 61 6b  s for the "break
10d20 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e 75 65 22  " and "continue"
10d30 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 0a 20 20   instructions.  
10d40 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 63 75 72    ** for the cur
10d50 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a 75 6d 70  rent loop.  Jump
10d60 20 74 6f 20 62 72 6b 20 74 6f 20 62 72 65 61 6b   to brk to break
10d70 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f 70 2e 0a   out of a loop..
10d80 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74 6f 20 63      ** Jump to c
10d90 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d 65 64 69  ont to go immedi
10da0 61 74 65 6c 79 20 74 6f 20 74 68 65 20 6e 65 78  ately to the nex
10db0 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74  t iteration of t
10dc0 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a  he.    ** loop..
10dd0 20 20 20 20 2a 2f 0a 20 20 20 20 62 72 6b 20 3d      */.    brk =
10de0 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73   pLevel->brk = s
10df0 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
10e00 62 65 6c 28 76 29 3b 0a 20 20 20 20 63 6f 6e 74  bel(v);.    cont
10e10 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20   = pLevel->cont 
10e20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
10e30 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 20 20  eLabel(v);..    
10e40 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
10e50 65 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66  e right table of
10e60 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
10e70 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64  IN, allocate and
10e80 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  .    ** initiali
10e90 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  ze a memory cell
10ea0 20 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66   that records if
10eb0 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63   this table matc
10ec0 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72  hes any.    ** r
10ed0 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74  ow of the left t
10ee0 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e  able of the join
10ef0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10f00 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d 3e 30   pLevel->iFrom>0
10f10 20 26 26 20 28 70 54 61 62 49 74 65 6d 5b 2d 31   && (pTabItem[-1
10f20 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f  ].jointype & JT_
10f30 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20 20 20 20  LEFT)!=0 ){.    
10f40 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 6e    if( !pParse->n
10f50 4d 65 6d 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem ) pParse->nM
10f60 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76  em++;.      pLev
10f70 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20  el->iLeftJoin = 
10f80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
10f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
10fa0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
10fb0 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e  Int, 0, pLevel->
10fc0 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20 20 20 20  iLeftJoin);.    
10fd0 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
10fe0 2c 20 22 23 20 69 6e 69 74 20 4c 45 46 54 20 4a  , "# init LEFT J
10ff0 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20 66 6c 61  OIN no-match fla
11000 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  g"));.    }..#if
11010 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11020 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
11030 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49    if( pLevel->pI
11040 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20  dxInfo ){.      
11050 2f 2a 20 43 61 73 65 20 30 3a 20 20 54 68 65 20  /* Case 0:  The 
11060 74 61 62 6c 65 20 69 73 20 61 20 76 69 72 74 75  table is a virtu
11070 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73 65 20 74  al-table.  Use t
11080 68 65 20 56 46 69 6c 74 65 72 20 61 6e 64 20 56  he VFilter and V
11090 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  Next.      **   
110a0 20 20 20 20 20 20 20 74 6f 20 61 63 63 65 73 73         to access
110b0 20 74 68 65 20 64 61 74 61 2e 0a 20 20 20 20 20   the data..     
110c0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
110d0 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49  3_index_info *pI
110e0 64 78 49 6e 66 6f 20 3d 20 70 4c 65 76 65 6c 2d  dxInfo = pLevel-
110f0 3e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20  >pIdxInfo;.     
11100 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e 74   int nConstraint
11110 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f   = pIdxInfo->nCo
11120 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20 20  nstraint;.      
11130 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
11140 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
11150 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d 0a  usage *aUsage =.
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11190 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e    pIdxInfo->aCon
111a0 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20 20  straintUsage;.  
111b0 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74      const struct
111c0 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 63   sqlite3_index_c
111d0 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e 73  onstraint *aCons
111e0 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20 20  traint =.       
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11210 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78 49             pIdxI
11220 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74  nfo->aConstraint
11230 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ;..      for(i=1
11240 3b 20 69 3c 3d 6e 43 6f 6e 73 74 72 61 69 6e 74  ; i<=nConstraint
11250 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
11260 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66  int j;.        f
11270 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6e 73 74  or(j=0; j<nConst
11280 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  raint; j++){.   
11290 20 20 20 20 20 20 20 69 66 28 20 61 55 73 61 67         if( aUsag
112a0 65 5b 6a 5d 2e 61 72 67 76 49 6e 64 65 78 3d 3d  e[j].argvIndex==
112b0 69 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  i ){.           
112c0 20 69 6e 74 20 6b 20 3d 20 61 43 6f 6e 73 74 72   int k = aConstr
112d0 61 69 6e 74 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66  aint[j].iTermOff
112e0 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  set;.           
112f0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
11300 28 70 50 61 72 73 65 2c 20 77 63 2e 61 5b 6b 5d  (pParse, wc.a[k]
11310 2e 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  .pExpr->pRight);
11320 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
11330 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
11340 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11350 20 20 69 66 28 20 6a 3d 3d 6e 43 6f 6e 73 74 72    if( j==nConstr
11360 61 69 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  aint ) break;.  
11370 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
11380 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
11390 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2d 31 2c  OP_Integer, i-1,
113a0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
113b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
113c0 50 5f 49 6e 74 65 67 65 72 2c 20 70 49 64 78 49  P_Integer, pIdxI
113d0 6e 66 6f 2d 3e 69 64 78 4e 75 6d 2c 20 30 29 3b  nfo->idxNum, 0);
113e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
113f0 62 65 4f 70 33 28 76 2c 20 4f 50 5f 56 46 69 6c  beOp3(v, OP_VFil
11400 74 65 72 2c 20 69 43 75 72 2c 20 62 72 6b 2c 20  ter, iCur, brk, 
11410 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72  pIdxInfo->idxStr
11420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11430 20 20 20 20 20 20 20 20 70 49 64 78 49 6e 66 6f          pIdxInfo
11440 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53  ->needToFreeIdxS
11450 74 72 20 3f 20 50 33 5f 4d 50 52 49 4e 54 46 20  tr ? P3_MPRINTF 
11460 3a 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  : P3_STATIC);.  
11470 20 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 65      pIdxInfo->ne
11480 65 64 54 6f 46 72 65 65 49 64 78 53 74 72 20 3d  edToFreeIdxStr =
11490 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
114a0 30 3b 20 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e  0; i<pIdxInfo->n
114b0 43 6f 6e 73 74 72 61 69 6e 74 3b 20 69 2b 2b 29  Constraint; i++)
114c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
114d0 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
114e0 69 6e 74 55 73 61 67 65 5b 69 5d 2e 6f 6d 69 74  intUsage[i].omit
114f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 64 69   ){.          di
11500 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c  sableTerm(pLevel
11510 2c 20 26 77 63 2e 61 5b 69 5d 29 3b 0a 20 20 20  , &wc.a[i]);.   
11520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
11530 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
11540 3d 20 4f 50 5f 56 4e 65 78 74 3b 0a 20 20 20 20  = OP_VNext;.    
11550 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69    pLevel->p1 = i
11560 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
11570 6c 2d 3e 70 32 20 3d 20 73 71 6c 69 74 65 33 56  l->p2 = sqlite3V
11580 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
11590 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  );.    }else.#en
115a0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
115b0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
115c0 2a 2f 0a 0a 20 20 20 20 69 66 28 20 70 4c 65 76  */..    if( pLev
115d0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
115e0 45 5f 52 4f 57 49 44 5f 45 51 20 29 7b 0a 20 20  E_ROWID_EQ ){.  
115f0 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
11600 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
11610 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
11620 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
11630 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
11640 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
11650 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
11660 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
11670 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  Or.      **     
11680 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
11690 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
116a0 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
116b0 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a  N (...)".      *
116c0 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
116d0 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ruct..      */. 
116e0 20 20 20 20 20 70 54 65 72 6d 20 3d 20 66 69 6e       pTerm = fin
116f0 64 54 65 72 6d 28 26 77 63 2c 20 69 43 75 72 2c  dTerm(&wc, iCur,
11700 20 2d 31 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57   -1, notReady, W
11710 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20 30 29 3b 0a  O_EQ|WO_IN, 0);.
11720 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
11730 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  erm!=0 );.      
11740 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 70  assert( pTerm->p
11750 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  Expr!=0 );.     
11760 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
11770 6c 65 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72  leftCursor==iCur
11780 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
11790 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
117a0 3b 0a 20 20 20 20 20 20 63 6f 64 65 45 71 75 61  ;.      codeEqua
117b0 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c  lityTerm(pParse,
117c0 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65   pTerm, brk, pLe
117d0 76 65 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  vel);.      sqli
117e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
117f0 4f 50 5f 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c  OP_MustBeInt, 1,
11800 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c   brk);.      sql
11810 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11820 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69   OP_NotExists, i
11830 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20  Cur, brk);.     
11840 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
11850 20 22 70 6b 22 29 29 3b 0a 20 20 20 20 20 20 70   "pk"));.      p
11860 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
11870 6f 6f 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  oop;.    }else i
11880 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
11890 20 26 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 52   & WHERE_ROWID_R
118a0 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ANGE ){.      /*
118b0 20 43 61 73 65 20 32 3a 20 20 57 65 20 68 61 76   Case 2:  We hav
118c0 65 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20  e an inequality 
118d0 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e  comparison again
118e0 73 74 20 74 68 65 20 52 4f 57 49 44 20 66 69 65  st the ROWID fie
118f0 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ld..      */.   
11900 20 20 20 69 6e 74 20 74 65 73 74 4f 70 20 3d 20     int testOp = 
11910 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69  OP_Noop;.      i
11920 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20  nt start;.      
11930 57 68 65 72 65 54 65 72 6d 20 2a 70 53 74 61 72  WhereTerm *pStar
11940 74 2c 20 2a 70 45 6e 64 3b 0a 0a 20 20 20 20 20  t, *pEnd;..     
11950 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62   assert( omitTab
11960 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  le==0 );.      p
11970 53 74 61 72 74 20 3d 20 66 69 6e 64 54 65 72 6d  Start = findTerm
11980 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
11990 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c  notReady, WO_GT|
119a0 57 4f 5f 47 45 2c 20 30 29 3b 0a 20 20 20 20 20  WO_GE, 0);.     
119b0 20 70 45 6e 64 20 3d 20 66 69 6e 64 54 65 72 6d   pEnd = findTerm
119c0 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
119d0 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c  notReady, WO_LT|
119e0 57 4f 5f 4c 45 2c 20 30 29 3b 0a 20 20 20 20 20  WO_LE, 0);.     
119f0 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20   if( bRev ){.   
11a00 20 20 20 20 20 70 54 65 72 6d 20 3d 20 70 53 74       pTerm = pSt
11a10 61 72 74 3b 0a 20 20 20 20 20 20 20 20 70 53 74  art;.        pSt
11a20 61 72 74 20 3d 20 70 45 6e 64 3b 0a 20 20 20 20  art = pEnd;.    
11a30 20 20 20 20 70 45 6e 64 20 3d 20 70 54 65 72 6d      pEnd = pTerm
11a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11a50 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
11a60 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
11a70 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 53 74          pX = pSt
11a80 61 72 74 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  art->pExpr;.    
11a90 20 20 20 20 61 73 73 65 72 74 28 20 70 58 21 3d      assert( pX!=
11aa0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
11ab0 65 72 74 28 20 70 53 74 61 72 74 2d 3e 6c 65 66  ert( pStart->lef
11ac0 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b  tCursor==iCur );
11ad0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11ae0 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
11af0 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20   pX->pRight);.  
11b00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
11b10 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 72  eAddOp(v, OP_For
11b20 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d 3d 54  ceInt, pX->op==T
11b30 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70 3d 3d  K_LE || pX->op==
11b40 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20 20 20  TK_GT, brk);.   
11b50 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11b60 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20 3f 20  AddOp(v, bRev ? 
11b70 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50 5f 4d  OP_MoveLt : OP_M
11b80 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62 72 6b  oveGe, iCur, brk
11b90 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65 43  );.        VdbeC
11ba0 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29  omment((v, "pk")
11bb0 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  );.        disab
11bc0 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 70  leTerm(pLevel, p
11bd0 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 65  Start);.      }e
11be0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
11bf0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11c00 20 62 52 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20   bRev ? OP_Last 
11c10 3a 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 43 75  : OP_Rewind, iCu
11c20 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d  r, brk);.      }
11c30 0a 20 20 20 20 20 20 69 66 28 20 70 45 6e 64 20  .      if( pEnd 
11c40 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
11c50 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 70 58 20  *pX;.        pX 
11c60 3d 20 70 45 6e 64 2d 3e 70 45 78 70 72 3b 0a 20  = pEnd->pExpr;. 
11c70 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11c80 58 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  X!=0 );.        
11c90 61 73 73 65 72 74 28 20 70 45 6e 64 2d 3e 6c 65  assert( pEnd->le
11ca0 66 74 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  ftCursor==iCur )
11cb0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
11cc0 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
11cd0 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
11ce0 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69         pLevel->i
11cf0 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
11d00 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 73 71  em++;.        sq
11d10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
11d20 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
11d30 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
11d40 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 58 2d  .        if( pX-
11d50 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58  >op==TK_LT || pX
11d60 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20  ->op==TK_GT ){. 
11d70 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
11d80 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a  = bRev ? OP_Le :
11d90 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20 20 20 20   OP_Ge;.        
11da0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11db0 20 74 65 73 74 4f 70 20 3d 20 62 52 65 76 20 3f   testOp = bRev ?
11dc0 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a   OP_Lt : OP_Gt;.
11dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11de0 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
11df0 65 76 65 6c 2c 20 70 45 6e 64 29 3b 0a 20 20 20  evel, pEnd);.   
11e00 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74     }.      start
11e10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
11e20 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11e30 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
11e40 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65 76 20   bRev ? OP_Prev 
11e50 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20  : OP_Next;.     
11e60 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43   pLevel->p1 = iC
11e70 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ur;.      pLevel
11e80 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20 20  ->p2 = start;.  
11e90 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
11ea0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
11eb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ec0 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c  dOp(v, OP_Rowid,
11ed0 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20   iCur, 0);.     
11ee0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ef0 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
11f00 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
11f10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
11f20 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
11f30 20 74 65 73 74 4f 70 2c 20 53 51 4c 49 54 45 5f   testOp, SQLITE_
11f40 41 46 46 5f 4e 55 4d 45 52 49 43 2c 20 62 72 6b  AFF_NUMERIC, brk
11f50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11f60 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
11f70 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  >flags & WHERE_C
11f80 4f 4c 55 4d 4e 5f 52 41 4e 47 45 20 29 7b 0a 20  OLUMN_RANGE ){. 
11f90 20 20 20 20 20 2f 2a 20 43 61 73 65 20 33 3a 20       /* Case 3: 
11fa0 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  The WHERE clause
11fb0 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65 72   term that refer
11fc0 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  s to the right-m
11fd0 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ost.      **    
11fe0 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20 74       column of t
11ff0 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20 69  he index is an i
12000 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72 20  nequality.  For 
12010 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20 20  example, if.    
12020 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65    **         the
12030 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78 2c   index is on (x,
12040 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48 45  y,z) and the WHE
12050 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66 20  RE clause is of 
12060 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  the.      **    
12070 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20 41       form "x=5 A
12080 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74 68  ND y<10" then th
12090 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64 2e  is case is used.
120a0 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20 20    Only the.     
120b0 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67 68   **         righ
120c0 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63 61  t-most column ca
120d0 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  n be an inequali
120e0 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d 75  ty - the rest mu
120f0 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  st.      **     
12100 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d 22      use the "=="
12110 20 61 6e 64 20 22 49 4e 22 20 6f 70 65 72 61 74   and "IN" operat
12120 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ors..      **.  
12130 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 54      **         T
12140 68 69 73 20 63 61 73 65 20 69 73 20 61 6c 73 6f  his case is also
12150 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 72 65   used when there
12160 20 61 72 65 20 6e 6f 20 57 48 45 52 45 20 63 6c   are no WHERE cl
12170 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 20 20  ause.      **   
12180 20 20 20 20 20 20 63 6f 6e 73 74 72 61 69 6e 74        constraint
12190 73 20 62 75 74 20 61 6e 20 69 6e 64 65 78 20 69  s but an index i
121a0 73 20 73 65 6c 65 63 74 65 64 20 61 6e 79 77 61  s selected anywa
121b0 79 2c 20 69 6e 20 6f 72 64 65 72 0a 20 20 20 20  y, in order.    
121c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 6f 20    **         to 
121d0 66 6f 72 63 65 20 74 68 65 20 6f 75 74 70 75 74  force the output
121e0 20 6f 72 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72   order to confor
121f0 6d 20 74 6f 20 61 6e 20 4f 52 44 45 52 20 42 59  m to an ORDER BY
12200 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
12210 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20   int start;.    
12220 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c 65 76    int nEq = pLev
12230 65 6c 2d 3e 6e 45 71 3b 0a 20 20 20 20 20 20 69  el->nEq;.      i
12240 6e 74 20 74 6f 70 45 71 3d 30 3b 20 20 20 20 20  nt topEq=0;     
12250 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 6f     /* True if to
12260 70 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e  p limit uses ==.
12270 20 46 61 6c 73 65 20 69 73 20 73 74 72 69 63 74   False is strict
12280 6c 79 20 3c 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ly < */.      in
12290 74 20 62 74 6d 45 71 3d 30 3b 20 20 20 20 20 20  t btmEq=0;      
122a0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 62 74 6d    /* True if btm
122b0 20 6c 69 6d 69 74 20 75 73 65 73 20 3d 3d 2e 20   limit uses ==. 
122c0 46 61 6c 73 65 20 69 66 20 73 74 72 69 63 74 6c  False if strictl
122d0 79 20 3e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  y > */.      int
122e0 20 74 6f 70 4f 70 2c 20 62 74 6d 4f 70 3b 20 20   topOp, btmOp;  
122f0 20 2f 2a 20 4f 70 65 72 61 74 6f 72 73 20 66 6f   /* Operators fo
12300 72 20 74 68 65 20 74 6f 70 20 61 6e 64 20 62 6f  r the top and bo
12310 74 74 6f 6d 20 73 65 61 72 63 68 20 62 6f 75 6e  ttom search boun
12320 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ds */.      int 
12330 74 65 73 74 4f 70 3b 0a 20 20 20 20 20 20 69 6e  testOp;.      in
12340 74 20 6e 4e 6f 74 4e 75 6c 6c 3b 20 20 20 20 20  t nNotNull;     
12350 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
12360 6f 77 73 20 6f 66 20 69 6e 64 65 78 20 74 68 61  ows of index tha
12370 74 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 4e 55  t must be non-NU
12380 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  LL */.      int 
12390 74 6f 70 4c 69 6d 69 74 20 3d 20 28 70 4c 65 76  topLimit = (pLev
123a0 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52  el->flags & WHER
123b0 45 5f 54 4f 50 5f 4c 49 4d 49 54 29 21 3d 30 3b  E_TOP_LIMIT)!=0;
123c0 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d 4c 69  .      int btmLi
123d0 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
123e0 6c 61 67 73 20 26 20 57 48 45 52 45 5f 42 54 4d  lags & WHERE_BTM
123f0 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 0a 20 20 20  _LIMIT)!=0;..   
12400 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63     /* Generate c
12410 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  ode to evaluate 
12420 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 20 74  all constraint t
12430 65 72 6d 73 20 75 73 69 6e 67 20 3d 3d 20 6f 72  erms using == or
12440 20 49 4e 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64   IN.      ** and
12450 20 6c 65 76 65 6c 20 74 68 65 20 76 61 6c 75 65   level the value
12460 73 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  s of those terms
12470 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20   on the stack.. 
12480 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f       */.      co
12490 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54 65 72  deAllEqualityTer
124a0 6d 73 28 70 50 61 72 73 65 2c 20 70 4c 65 76 65  ms(pParse, pLeve
124b0 6c 2c 20 26 77 63 2c 20 6e 6f 74 52 65 61 64 79  l, &wc, notReady
124c0 2c 20 62 72 6b 29 3b 0a 0a 20 20 20 20 20 20 2f  , brk);..      /
124d0 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
124e0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61  equality term va
124f0 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65  lues because the
12500 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20  y will all be.  
12510 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63      ** used twic
12520 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  e: once to make 
12530 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
12540 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20  key and once to 
12550 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a  make the.      *
12560 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  * start key..   
12570 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
12580 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
12590 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
125a0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
125b0 5f 44 75 70 2c 20 6e 45 71 2d 31 2c 20 30 29 3b  _Dup, nEq-1, 0);
125c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
125d0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
125e0 61 74 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  at comparison op
125f0 65 72 61 74 6f 72 73 20 74 6f 20 75 73 65 20 66  erators to use f
12600 6f 72 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f  or top and botto
12610 6d 20 0a 20 20 20 20 20 20 2a 2a 20 73 65 61 72  m .      ** sear
12620 63 68 20 62 6f 75 6e 64 73 2e 20 46 6f 72 20 61  ch bounds. For a
12630 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e 64 65  n ascending inde
12640 78 2c 20 74 68 65 20 62 6f 74 74 6f 6d 20 62 6f  x, the bottom bo
12650 75 6e 64 20 69 73 20 61 20 3e 20 6f 72 20 3e 3d  und is a > or >=
12660 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
12670 6f 72 20 61 6e 64 20 74 68 65 20 74 6f 70 20 62  or and the top b
12680 6f 75 6e 64 20 69 73 20 61 20 3c 20 6f 72 20 3c  ound is a < or <
12690 3d 20 6f 70 65 72 61 74 6f 72 2e 20 20 46 6f 72  = operator.  For
126a0 20 61 20 64 65 73 63 65 6e 64 69 6e 67 0a 20 20   a descending.  
126b0 20 20 20 20 2a 2a 20 69 6e 64 65 78 20 74 68 65      ** index the
126c0 20 6f 70 65 72 61 74 6f 72 73 20 61 72 65 20 72   operators are r
126d0 65 76 65 72 73 65 64 2e 0a 20 20 20 20 20 20 2a  eversed..      *
126e0 2f 0a 20 20 20 20 20 20 6e 4e 6f 74 4e 75 6c 6c  /.      nNotNull
126f0 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69   = nEq + topLimi
12700 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 64  t;.      if( pId
12710 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6e 45  x->aSortOrder[nE
12720 71 5d 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 41 53  q]==SQLITE_SO_AS
12730 43 20 29 7b 0a 20 20 20 20 20 20 20 20 74 6f 70  C ){.        top
12740 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  Op = WO_LT|WO_LE
12750 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f 70 20  ;.        btmOp 
12760 3d 20 57 4f 5f 47 54 7c 57 4f 5f 47 45 3b 0a 20  = WO_GT|WO_GE;. 
12770 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12780 20 20 20 20 74 6f 70 4f 70 20 3d 20 57 4f 5f 47      topOp = WO_G
12790 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20 20  T|WO_GE;.       
127a0 20 62 74 6d 4f 70 20 3d 20 57 4f 5f 4c 54 7c 57   btmOp = WO_LT|W
127b0 4f 5f 4c 45 3b 0a 20 20 20 20 20 20 20 20 53 57  O_LE;.        SW
127c0 41 50 28 69 6e 74 2c 20 74 6f 70 4c 69 6d 69 74  AP(int, topLimit
127d0 2c 20 62 74 6d 4c 69 6d 69 74 29 3b 0a 20 20 20  , btmLimit);.   
127e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 47     }..      /* G
127f0 65 6e 65 72 61 74 65 20 74 68 65 20 74 65 72 6d  enerate the term
12800 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 54 68  ination key.  Th
12810 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 76 61  is is the key va
12820 6c 75 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a  lue that.      *
12830 2a 20 77 69 6c 6c 20 65 6e 64 20 74 68 65 20 73  * will end the s
12840 65 61 72 63 68 2e 20 20 54 68 65 72 65 20 69 73  earch.  There is
12850 20 6e 6f 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20   no termination 
12860 6b 65 79 20 69 66 20 74 68 65 72 65 0a 20 20 20  key if there.   
12870 20 20 20 2a 2a 20 61 72 65 20 6e 6f 20 65 71 75     ** are no equ
12880 61 6c 69 74 79 20 74 65 72 6d 73 20 61 6e 64 20  ality terms and 
12890 6e 6f 20 22 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e  no "X<..." term.
128a0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
128b0 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34 3a 20  ** 2002-Dec-04: 
128c0 4f 6e 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64  On a reverse-ord
128d0 65 72 20 73 63 61 6e 2c 20 74 68 65 20 73 6f 2d  er scan, the so-
128e0 63 61 6c 6c 65 64 20 22 74 65 72 6d 69 6e 61 74  called "terminat
128f0 69 6f 6e 22 0a 20 20 20 20 20 20 2a 2a 20 6b 65  ion".      ** ke
12900 79 20 63 6f 6d 70 75 74 65 64 20 68 65 72 65 20  y computed here 
12910 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62  really ends up b
12920 65 69 6e 67 20 74 68 65 20 73 74 61 72 74 20 6b  eing the start k
12930 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ey..      */.   
12940 20 20 20 69 66 28 20 74 6f 70 4c 69 6d 69 74 20     if( topLimit 
12950 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
12960 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  *pX;.        int
12970 20 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c   k = pIdx->aiCol
12980 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
12990 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
129a0 28 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e  (&wc, iCur, k, n
129b0 6f 74 52 65 61 64 79 2c 20 74 6f 70 4f 70 2c 20  otReady, topOp, 
129c0 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61  pIdx);.        a
129d0 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20  ssert( pTerm!=0 
129e0 29 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  );.        pX = 
129f0 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pTerm->pExpr;.  
12a00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
12a10 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45  Term->flags & TE
12a20 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a  RM_CODED)==0 );.
12a30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
12a40 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
12a50 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
12a60 20 20 20 20 20 74 6f 70 45 71 20 3d 20 70 54 65       topEq = pTe
12a70 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20  rm->eOperator & 
12a80 28 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20  (WO_LE|WO_GE);. 
12a90 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
12aa0 72 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d  rm(pLevel, pTerm
12ab0 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f  );.        testO
12ac0 70 20 3d 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20  p = OP_IdxGE;.  
12ad0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ae0 20 20 20 74 65 73 74 4f 70 20 3d 20 6e 45 71 3e     testOp = nEq>
12af0 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20 4f  0 ? OP_IdxGE : O
12b00 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20  P_Noop;.        
12b10 74 6f 70 45 71 20 3d 20 31 3b 0a 20 20 20 20 20  topEq = 1;.     
12b20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 65 73   }.      if( tes
12b30 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  tOp!=OP_Noop ){.
12b40 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c          int nCol
12b50 20 3d 20 6e 45 71 20 2b 20 74 6f 70 4c 69 6d 69   = nEq + topLimi
12b60 74 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  t;.        pLeve
12b70 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
12b80 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
12b90 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
12ba0 65 28 76 2c 20 6e 43 6f 6c 2c 20 6e 45 71 2c 20  e(v, nCol, nEq, 
12bb0 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
12bc0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
12bd0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
12be0 20 3d 20 74 6f 70 45 71 20 3f 20 4f 50 5f 4d 6f   = topEq ? OP_Mo
12bf0 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f 76 65 4c 74  veLe : OP_MoveLt
12c00 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12c10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12c20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  op, iIdxCur, brk
12c30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
12c40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12c50 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
12c60 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
12c70 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
12c80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12c90 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29 7b  else if( bRev ){
12ca0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12cb0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
12cc0 4c 61 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62  Last, iIdxCur, b
12cd0 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rk);.      }..  
12ce0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
12cf0 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20  the start key.  
12d00 54 68 69 73 20 69 73 20 74 68 65 20 6b 65 79 20  This is the key 
12d10 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 65  that defines the
12d20 20 6c 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20   lower.      ** 
12d30 62 6f 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61  bound on the sea
12d40 72 63 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e  rch.  There is n
12d50 6f 20 73 74 61 72 74 20 6b 65 79 20 69 66 20 74  o start key if t
12d60 68 65 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20  here are no.    
12d70 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65    ** equality te
12d80 72 6d 73 20 61 6e 64 20 69 66 20 74 68 65 72 65  rms and if there
12d90 20 69 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74   is no "X>..." t
12da0 65 72 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a  erm.  In.      *
12db0 2a 20 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e  * that case, gen
12dc0 65 72 61 74 65 20 61 20 22 52 65 77 69 6e 64 22  erate a "Rewind"
12dd0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
12de0 70 6c 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20  place of the.   
12df0 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20     ** start key 
12e00 73 65 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a  search..      **
12e10 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44  .      ** 2002-D
12e20 65 63 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61  ec-04: In the ca
12e30 73 65 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d  se of a reverse-
12e40 6f 72 64 65 72 20 73 65 61 72 63 68 2c 20 74 68  order search, th
12e50 65 20 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20  e so-called.    
12e60 20 20 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79    ** "start" key
12e70 20 72 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20   really ends up 
12e80 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 74 68  being used as th
12e90 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65  e termination ke
12ea0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
12eb0 20 20 69 66 28 20 62 74 6d 4c 69 6d 69 74 20 29    if( btmLimit )
12ec0 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a  {.        Expr *
12ed0 70 58 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pX;.        int 
12ee0 6b 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75  k = pIdx->aiColu
12ef0 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 70  mn[j];.        p
12f00 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28  Term = findTerm(
12f10 26 77 63 2c 20 69 43 75 72 2c 20 6b 2c 20 6e 6f  &wc, iCur, k, no
12f20 74 52 65 61 64 79 2c 20 62 74 6d 4f 70 2c 20 70  tReady, btmOp, p
12f30 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 61 73  Idx);.        as
12f40 73 65 72 74 28 20 70 54 65 72 6d 21 3d 30 20 29  sert( pTerm!=0 )
12f50 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20 70  ;.        pX = p
12f60 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Term->pExpr;.   
12f70 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 54       assert( (pT
12f80 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54 45 52  erm->flags & TER
12f90 4d 5f 43 4f 44 45 44 29 3d 3d 30 20 29 3b 0a 20  M_CODED)==0 );. 
12fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
12fb0 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
12fc0 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
12fd0 20 20 20 20 62 74 6d 45 71 20 3d 20 70 54 65 72      btmEq = pTer
12fe0 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20 26 20 28  m->eOperator & (
12ff0 57 4f 5f 4c 45 7c 57 4f 5f 47 45 29 3b 0a 20 20  WO_LE|WO_GE);.  
13000 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
13010 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
13020 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13030 20 20 20 20 20 20 20 62 74 6d 45 71 20 3d 20 31         btmEq = 1
13040 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
13050 69 66 28 20 6e 45 71 3e 30 20 7c 7c 20 62 74 6d  if( nEq>0 || btm
13060 4c 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20  Limit ){.       
13070 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45 71 20   int nCol = nEq 
13080 2b 20 62 74 6d 4c 69 6d 69 74 3b 0a 20 20 20 20  + btmLimit;.    
13090 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
130a0 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 30 2c 20  obe(v, nCol, 0, 
130b0 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20 20  brk, pIdx);.    
130c0 20 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a      if( bRev ){.
130d0 20 20 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c            pLevel
130e0 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
130f0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
13100 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13110 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f  dOp(v, OP_MemSto
13120 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d  re, pLevel->iMem
13130 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
13140 74 65 73 74 4f 70 20 3d 20 4f 50 5f 49 64 78 4c  testOp = OP_IdxL
13150 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
13160 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
13170 6f 70 20 3d 20 62 74 6d 45 71 20 3f 20 4f 50 5f  op = btmEq ? OP_
13180 4d 6f 76 65 47 65 20 3a 20 4f 50 5f 4d 6f 76 65  MoveGe : OP_Move
13190 47 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  Gt;.          sq
131a0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
131b0 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c 20 62  , op, iIdxCur, b
131c0 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rk);.        }. 
131d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
131e0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 74  Rev ){.        t
131f0 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  estOp = OP_Noop;
13200 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13210 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13220 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77  eAddOp(v, OP_Rew
13230 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20 62 72  ind, iIdxCur, br
13240 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  k);.      }..   
13250 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74     /* Generate t
13260 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68  he the top of th
13270 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68 65 72  e loop.  If ther
13280 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61 74 69  e is a terminati
13290 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  on.      ** key 
132a0 77 65 20 68 61 76 65 20 74 6f 20 74 65 73 74 20  we have to test 
132b0 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61 6e 64  for that key and
132c0 20 61 62 6f 72 74 20 61 74 20 74 68 65 20 74 6f   abort at the to
132d0 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  p of the.      *
132e0 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f  * loop..      */
132f0 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73  .      start = s
13300 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
13310 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
13320 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e  if( testOp!=OP_N
13330 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73  oop ){.        s
13340 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13350 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70  v, OP_MemLoad, p
13360 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b  Level->iMem, 0);
13370 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
13380 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73  VdbeAddOp(v, tes
13390 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20 62 72  tOp, iIdxCur, br
133a0 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  k);.        if( 
133b0 28 74 6f 70 45 71 20 26 26 20 21 62 52 65 76 29  (topEq && !bRev)
133c0 20 7c 7c 20 28 21 62 74 6d 45 71 20 26 26 20 62   || (!btmEq && b
133d0 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rev) ){.        
133e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
133f0 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 22 2b 22  ngeP3(v, -1, "+"
13400 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
13410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
13420 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13430 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77  eAddOp(v, OP_Row
13440 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29  Key, iIdxCur, 0)
13450 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
13460 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
13470 64 78 49 73 4e 75 6c 6c 2c 20 6e 4e 6f 74 4e 75  dxIsNull, nNotNu
13480 6c 6c 2c 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20  ll, cont);.     
13490 20 69 66 28 20 21 6f 6d 69 74 54 61 62 6c 65 20   if( !omitTable 
134a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
134b0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
134c0 50 5f 49 64 78 52 6f 77 69 64 2c 20 69 49 64 78  P_IdxRowid, iIdx
134d0 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Cur, 0);.       
134e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
134f0 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20  p(v, OP_MoveGe, 
13500 69 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  iCur, 0);.      
13510 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 63 6f  }..      /* Reco
13520 72 64 20 74 68 65 20 69 6e 73 74 72 75 63 74 69  rd the instructi
13530 6f 6e 20 75 73 65 64 20 74 6f 20 74 65 72 6d 69  on used to termi
13540 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 0a 20  nate the loop.. 
13550 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 4c       */.      pL
13560 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20  evel->op = bRev 
13570 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
13580 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
13590 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
135a0 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
135b0 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
135c0 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
135d0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 43  >flags & WHERE_C
135e0 4f 4c 55 4d 4e 5f 45 51 20 29 7b 0a 20 20 20 20  OLUMN_EQ ){.    
135f0 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68    /* Case 4:  Th
13600 65 72 65 20 69 73 20 61 6e 20 69 6e 64 65 78 20  ere is an index 
13610 61 6e 64 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66  and all terms of
13620 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
13630 65 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  e that.      ** 
13640 20 20 20 20 20 20 20 20 20 72 65 66 65 72 20 74           refer t
13650 6f 20 74 68 65 20 69 6e 64 65 78 20 75 73 69 6e  o the index usin
13660 67 20 74 68 65 20 22 3d 3d 22 20 6f 72 20 22 49  g the "==" or "I
13670 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20  N" operators..  
13680 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
13690 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e   start;.      in
136a0 74 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e  t nEq = pLevel->
136b0 6e 45 71 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47  nEq;..      /* G
136c0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
136d0 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63 6f 6e  evaluate all con
136e0 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20 75 73  straint terms us
136f0 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20 20 20  ing == or IN.   
13700 20 20 20 2a 2a 20 61 6e 64 20 6c 65 61 76 65 20     ** and leave 
13710 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74 68  the values of th
13720 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74 68 65  ose terms on the
13730 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2f   stack..      */
13740 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c 45 71  .      codeAllEq
13750 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50 61 72  ualityTerms(pPar
13760 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77 63 2c  se, pLevel, &wc,
13770 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b 29 3b   notReady, brk);
13780 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
13790 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6b 65 79  ate a single key
137a0 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
137b0 65 64 20 74 6f 20 62 6f 74 68 20 73 74 61 72 74  ed to both start
137c0 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 0a 20   and terminate. 
137d0 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 61 72       ** the sear
137e0 63 68 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ch.      */.    
137f0 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
13800 65 28 76 2c 20 6e 45 71 2c 20 30 2c 20 62 72 6b  e(v, nEq, 0, brk
13810 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 73  , pIdx);.      s
13820 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
13830 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
13840 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29  pLevel->iMem, 0)
13850 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65  ;..      /* Gene
13860 72 61 74 65 20 63 6f 64 65 20 28 31 29 20 74 6f  rate code (1) to
13870 20 6d 6f 76 65 20 74 6f 20 74 68 65 20 66 69 72   move to the fir
13880 73 74 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d  st matching elem
13890 65 6e 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ent of the table
138a0 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 6e 20  ..      ** Then 
138b0 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 32  generate code (2
138c0 29 20 74 68 61 74 20 6a 75 6d 70 73 20 74 6f 20  ) that jumps to 
138d0 22 62 72 6b 22 20 61 66 74 65 72 20 74 68 65 20  "brk" after the 
138e0 63 75 72 73 6f 72 20 69 73 20 70 61 73 74 0a 20  cursor is past. 
138f0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74       ** the last
13900 20 6d 61 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e   matching elemen
13910 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20  t of the table. 
13920 20 54 68 65 20 63 6f 64 65 20 28 31 29 20 69 73   The code (1) is
13930 20 65 78 65 63 75 74 65 64 0a 20 20 20 20 20 20   executed.      
13940 2a 2a 20 6f 6e 63 65 20 74 6f 20 69 6e 69 74 69  ** once to initi
13950 61 6c 69 7a 65 20 74 68 65 20 73 65 61 72 63 68  alize the search
13960 2c 20 74 68 65 20 63 6f 64 65 20 28 32 29 20 69  , the code (2) i
13970 73 20 65 78 65 63 75 74 65 64 20 62 65 66 6f 72  s executed befor
13980 65 20 65 61 63 68 0a 20 20 20 20 20 20 2a 2a 20  e each.      ** 
13990 69 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  iteration of the
139a0 20 73 63 61 6e 20 74 6f 20 73 65 65 20 69 66 20   scan to see if 
139b0 74 68 65 20 73 63 61 6e 20 68 61 73 20 66 69 6e  the scan has fin
139c0 69 73 68 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  ished. */.      
139d0 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
139e0 20 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72      /* Scan in r
139f0 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a  everse order */.
13a00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13a10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13a20 6f 76 65 4c 65 2c 20 69 49 64 78 43 75 72 2c 20  oveLe, iIdxCur, 
13a30 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  brk);.        st
13a40 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
13a50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
13a60 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
13a70 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
13a80 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13a90 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49  (v, OP_IdxLT, iI
13aa0 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20  dxCur, brk);.   
13ab0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20       pLevel->op 
13ac0 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20 20  = OP_Prev;.     
13ad0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13ae0 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68 65 20 66  /* Scan in the f
13af0 6f 72 77 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a  orward order */.
13b00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13b10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13b20 6f 76 65 47 65 2c 20 69 49 64 78 43 75 72 2c 20  oveGe, iIdxCur, 
13b30 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  brk);.        st
13b40 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  art = sqlite3Vdb
13b50 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
13b60 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d  Load, pLevel->iM
13b70 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  em, 0);.        
13b80 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
13b90 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69 49 64 78  , OP_IdxGE, iIdx
13ba0 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50  Cur, brk, "+", P
13bb0 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  3_STATIC);.     
13bc0 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20     pLevel->op = 
13bd0 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  OP_Next;.      }
13be0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
13bf0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f  beAddOp(v, OP_Ro
13c00 77 4b 65 79 2c 20 69 49 64 78 43 75 72 2c 20 30  wKey, iIdxCur, 0
13c10 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
13c20 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
13c30 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45 71 2c 20  IdxIsNull, nEq, 
13c40 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28  cont);.      if(
13c50 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20   !omitTable ){. 
13c60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13c70 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
13c80 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c  xRowid, iIdxCur,
13c90 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
13ca0 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
13cb0 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72   OP_MoveGe, iCur
13cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
13cd0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d      pLevel->p1 =
13ce0 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20   iIdxCur;.      
13cf0 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74 61  pLevel->p2 = sta
13d00 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rt;.    }else{. 
13d10 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a 20       /* Case 5: 
13d20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61   There is no usa
13d30 62 6c 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d  ble index.  We m
13d40 75 73 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74  ust do a complet
13d50 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
13d60 20 20 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20      scan of the 
13d70 65 6e 74 69 72 65 20 74 61 62 6c 65 2e 0a 20 20  entire table..  
13d80 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73      */.      ass
13d90 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
13da0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
13db0 74 28 20 62 52 65 76 3d 3d 30 20 29 3b 0a 20 20  t( bRev==0 );.  
13dc0 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
13dd0 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20   OP_Next;.      
13de0 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75  pLevel->p1 = iCu
13df0 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  r;.      pLevel-
13e00 3e 70 32 20 3d 20 31 20 2b 20 73 71 6c 69 74 65  >p2 = 1 + sqlite
13e10 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13e20 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62  _Rewind, iCur, b
13e30 72 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  rk);.    }.    n
13e40 6f 74 52 65 61 64 79 20 26 3d 20 7e 67 65 74 4d  otReady &= ~getM
13e50 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43  ask(&maskSet, iC
13e60 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 6e 73  ur);..    /* Ins
13e70 65 72 74 20 63 6f 64 65 20 74 6f 20 74 65 73 74  ert code to test
13e80 20 65 76 65 72 79 20 73 75 62 65 78 70 72 65 73   every subexpres
13e90 73 69 6f 6e 20 74 68 61 74 20 63 61 6e 20 62 65  sion that can be
13ea0 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20 20 20 20   completely.    
13eb0 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75 73 69 6e  ** computed usin
13ec0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 65  g the current se
13ed0 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a 20 20 20  t of tables..   
13ee0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 54 65 72   */.    for(pTer
13ef0 6d 3d 77 63 2e 61 2c 20 6a 3d 77 63 2e 6e 54 65  m=wc.a, j=wc.nTe
13f00 72 6d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 70 54  rm; j>0; j--, pT
13f10 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  erm++){.      Ex
13f20 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66  pr *pE;.      if
13f30 28 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26  ( pTerm->flags &
13f40 20 28 54 45 52 4d 5f 56 49 52 54 55 41 4c 7c 54   (TERM_VIRTUAL|T
13f50 45 52 4d 5f 43 4f 44 45 44 29 20 29 20 63 6f 6e  ERM_CODED) ) con
13f60 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
13f70 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
13f80 6c 6c 20 26 20 6e 6f 74 52 65 61 64 79 29 21 3d  ll & notReady)!=
13f90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
13fa0 20 20 20 20 70 45 20 3d 20 70 54 65 72 6d 2d 3e      pE = pTerm->
13fb0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 61 73 73  pExpr;.      ass
13fc0 65 72 74 28 20 70 45 21 3d 30 20 29 3b 0a 20 20  ert( pE!=0 );.  
13fd0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
13fe0 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78  iLeftJoin && !Ex
13ff0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
14000 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
14010 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
14020 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
14030 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
14040 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c  alse(pParse, pE,
14050 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20   cont, 1);.     
14060 20 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 7c 3d   pTerm->flags |=
14070 20 54 45 52 4d 5f 43 4f 44 45 44 3b 0a 20 20 20   TERM_CODED;.   
14080 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61   }..    /* For a
14090 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
140a0 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
140b0 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
140c0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
140d0 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
140e0 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
140f0 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
14100 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
14110 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  able.  .    */. 
14120 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
14130 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
14140 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20    pLevel->top = 
14150 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
14160 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
14170 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14180 70 28 76 2c 20 4f 50 5f 4d 65 6d 49 6e 74 2c 20  p(v, OP_MemInt, 
14190 31 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  1, pLevel->iLeft
141a0 4a 6f 69 6e 29 3b 0a 20 20 20 20 20 20 56 64 62  Join);.      Vdb
141b0 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
141c0 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
141d0 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66   hit"));.      f
141e0 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a  or(pTerm=wc.a, j
141f0 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20  =0; j<wc.nTerm; 
14200 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
14210 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
14220 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52 4d 5f  ->flags & (TERM_
14230 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43 4f 44  VIRTUAL|TERM_COD
14240 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ED) ) continue;.
14250 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
14260 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
14270 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
14280 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
14290 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
142a0 70 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20  pExpr );.       
142b0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
142c0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72  lse(pParse, pTer
142d0 6d 2d 3e 70 45 78 70 72 2c 20 63 6f 6e 74 2c 20  m->pExpr, cont, 
142e0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72  1);.        pTer
142f0 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
14300 5f 43 4f 44 45 44 3b 0a 20 20 20 20 20 20 7d 0a  _CODED;.      }.
14310 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
14320 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 2f  f SQLITE_TEST  /
14330 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  * For testing an
14340 64 20 64 65 62 75 67 67 69 6e 67 20 75 73 65 20  d debugging use 
14350 6f 6e 6c 79 20 2a 2f 0a 20 20 2f 2a 20 52 65 63  only */.  /* Rec
14360 6f 72 64 20 69 6e 20 74 68 65 20 71 75 65 72 79  ord in the query
14370 20 70 6c 61 6e 20 69 6e 66 6f 72 6d 61 74 69 6f   plan informatio
14380 6e 20 61 62 6f 75 74 20 74 68 65 20 63 75 72 72  n about the curr
14390 65 6e 74 20 74 61 62 6c 65 0a 20 20 2a 2a 20 61  ent table.  ** a
143a0 6e 64 20 74 68 65 20 69 6e 64 65 78 20 75 73 65  nd the index use
143b0 64 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 28  d to access it (
143c0 69 66 20 61 6e 79 29 2e 20 20 49 66 20 74 68 65  if any).  If the
143d0 20 74 61 62 6c 65 20 69 74 73 65 6c 66 0a 20 20   table itself.  
143e0 2a 2a 20 69 73 20 6e 6f 74 20 75 73 65 64 2c 20  ** is not used, 
143f0 69 74 73 20 6e 61 6d 65 20 69 73 20 6a 75 73 74  its name is just
14400 20 27 7b 7d 27 2e 20 20 49 66 20 6e 6f 20 69 6e   '{}'.  If no in
14410 64 65 78 20 69 73 20 75 73 65 64 0a 20 20 2a 2a  dex is used.  **
14420 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6c 69   the index is li
14430 73 74 65 64 20 61 73 20 22 7b 7d 22 2e 20 20 49  sted as "{}".  I
14440 66 20 74 68 65 20 70 72 69 6d 61 72 79 20 6b 65  f the primary ke
14450 79 20 69 73 20 75 73 65 64 20 74 68 65 0a 20 20  y is used the.  
14460 2a 2a 20 69 6e 64 65 78 20 6e 61 6d 65 20 69 73  ** index name is
14470 20 27 2a 27 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72   '*'..  */.  for
14480 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
14490 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
144a0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69    char *z;.    i
144b0 6e 74 20 6e 3b 0a 20 20 20 20 70 4c 65 76 65 6c  nt n;.    pLevel
144c0 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d   = &pWInfo->a[i]
144d0 3b 0a 20 20 20 20 70 54 61 62 49 74 65 6d 20 3d  ;.    pTabItem =
144e0 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
144f0 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
14500 20 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e    z = pTabItem->
14510 7a 41 6c 69 61 73 3b 0a 20 20 20 20 69 66 28 20  zAlias;.    if( 
14520 7a 3d 3d 30 20 29 20 7a 20 3d 20 70 54 61 62 49  z==0 ) z = pTabI
14530 74 65 6d 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  tem->pTab->zName
14540 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
14550 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 2b 6e  (z);.    if( n+n
14560 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73  QPlan < sizeof(s
14570 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
14580 6e 29 2d 31 30 20 29 7b 0a 20 20 20 20 20 20 69  n)-10 ){.      i
14590 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
145a0 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
145b0 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  Y ){.        str
145c0 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
145d0 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
145e0 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20 20 20 20   "{}");.        
145f0 6e 51 50 6c 61 6e 20 2b 3d 20 32 3b 0a 20 20 20  nQPlan += 2;.   
14600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14610 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74 65    strcpy(&sqlite
14620 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50  3_query_plan[nQP
14630 6c 61 6e 5d 2c 20 7a 29 3b 0a 20 20 20 20 20 20  lan], z);.      
14640 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20    nQPlan += n;. 
14650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
14660 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b  ite3_query_plan[
14670 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b  nQPlan++] = ' ';
14680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
14690 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 28  Level->flags & (
146a0 57 48 45 52 45 5f 52 4f 57 49 44 5f 45 51 7c 57  WHERE_ROWID_EQ|W
146b0 48 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45  HERE_ROWID_RANGE
146c0 29 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70  ) ){.      strcp
146d0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
146e0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
146f0 2a 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50 6c  * ");.      nQPl
14700 61 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  an += 2;.    }el
14710 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70  se if( pLevel->p
14720 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Idx==0 ){.      
14730 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
14740 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
14750 6e 5d 2c 20 22 7b 7d 20 22 29 3b 0a 20 20 20 20  n], "{} ");.    
14760 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 33 3b 0a 20    nQPlan += 3;. 
14770 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14780 6e 20 3d 20 73 74 72 6c 65 6e 28 70 4c 65 76 65  n = strlen(pLeve
14790 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65 29 3b  l->pIdx->zName);
147a0 0a 20 20 20 20 20 20 69 66 28 20 6e 2b 6e 51 50  .      if( n+nQP
147b0 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c  lan < sizeof(sql
147c0 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29  ite3_query_plan)
147d0 2d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  -2 ){.        st
147e0 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75  rcpy(&sqlite3_qu
147f0 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d  ery_plan[nQPlan]
14800 2c 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 2d 3e  , pLevel->pIdx->
14810 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  zName);.        
14820 6e 51 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20  nQPlan += n;.   
14830 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
14840 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
14850 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 7d  ] = ' ';.      }
14860 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 77 68 69  .    }.  }.  whi
14870 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
14880 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
14890 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
148a0 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
148b0 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
148c0 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
148d0 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
148e0 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
148f0 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
14900 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14910 54 45 53 54 20 2f 2f 20 54 65 73 74 69 6e 67 20  TEST // Testing 
14920 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 75 73  and debugging us
14930 65 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 2f 2a 20  e only */..  /* 
14940 52 65 63 6f 72 64 20 74 68 65 20 63 6f 6e 74 69  Record the conti
14950 6e 75 61 74 69 6f 6e 20 61 64 64 72 65 73 73 20  nuation address 
14960 69 6e 20 74 68 65 20 57 68 65 72 65 49 6e 66 6f  in the WhereInfo
14970 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
14980 6e 0a 20 20 2a 2a 20 63 6c 65 61 6e 20 75 70 20  n.  ** clean up 
14990 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
149a0 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74  .  pWInfo->iCont
149b0 69 6e 75 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 77  inue = cont;.  w
149c0 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
149d0 26 77 63 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  &wc);.  return p
149e0 57 49 6e 66 6f 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  WInfo;..  /* Jum
149f0 70 20 68 65 72 65 20 69 66 20 6d 61 6c 6c 6f 63  p here if malloc
14a00 20 66 61 69 6c 73 20 2a 2f 0a 77 68 65 72 65 42   fails */.whereB
14a10 65 67 69 6e 4e 6f 4d 65 6d 3a 0a 20 20 77 68 65  eginNoMem:.  whe
14a20 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28 26 77  reClauseClear(&w
14a30 63 29 3b 0a 20 20 77 68 65 72 65 49 6e 66 6f 46  c);.  whereInfoF
14a40 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72  ree(pWInfo);.  r
14a50 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
14a60 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65  * Generate the e
14a70 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  nd of the WHERE 
14a80 6c 6f 6f 70 2e 20 20 53 65 65 20 63 6f 6d 6d 65  loop.  See comme
14a90 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73 71 6c 69 74  nts on .** sqlit
14aa0 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 66  e3WhereBegin() f
14ab0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
14ac0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  formation..*/.vo
14ad0 69 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  id sqlite3WhereE
14ae0 6e 64 28 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  nd(WhereInfo *pW
14af0 49 6e 66 6f 29 7b 0a 20 20 56 64 62 65 20 2a 76  Info){.  Vdbe *v
14b00 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 50 61 72 73   = pWInfo->pPars
14b10 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
14b20 69 3b 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  i;.  WhereLevel 
14b30 2a 70 4c 65 76 65 6c 3b 0a 20 20 53 72 63 4c 69  *pLevel;.  SrcLi
14b40 73 74 20 2a 70 54 61 62 4c 69 73 74 20 3d 20 70  st *pTabList = p
14b50 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69 73 74 3b  WInfo->pTabList;
14b60 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
14b70 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 69 6f 6e  loop termination
14b80 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f   code..  */.  fo
14b90 72 28 69 3d 70 54 61 62 4c 69 73 74 2d 3e 6e 53  r(i=pTabList->nS
14ba0 72 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  rc-1; i>=0; i--)
14bb0 7b 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26  {.    pLevel = &
14bc0 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20  pWInfo->a[i];.  
14bd0 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
14be0 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65  olveLabel(v, pLe
14bf0 76 65 6c 2d 3e 63 6f 6e 74 29 3b 0a 20 20 20 20  vel->cont);.    
14c00 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6f 70 21 3d  if( pLevel->op!=
14c10 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
14c20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14c30 70 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 6f 70 2c  p(v, pLevel->op,
14c40 20 70 4c 65 76 65 6c 2d 3e 70 31 2c 20 70 4c 65   pLevel->p1, pLe
14c50 76 65 6c 2d 3e 70 32 29 3b 0a 20 20 20 20 7d 0a  vel->p2);.    }.
14c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
14c70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
14c80 4c 65 76 65 6c 2d 3e 62 72 6b 29 3b 0a 20 20 20  Level->brk);.   
14c90 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e   if( pLevel->nIn
14ca0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   ){.      int *a
14cb0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
14cc0 20 20 20 20 20 66 6f 72 28 6a 3d 70 4c 65 76 65       for(j=pLeve
14cd0 6c 2d 3e 6e 49 6e 2c 20 61 3d 26 70 4c 65 76 65  l->nIn, a=&pLeve
14ce0 6c 2d 3e 61 49 6e 4c 6f 6f 70 5b 6a 2a 32 2d 32  l->aInLoop[j*2-2
14cf0 5d 3b 20 6a 3e 30 3b 20 6a 2d 2d 2c 20 61 2d 3d  ]; j>0; j--, a-=
14d00 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
14d10 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14d20 4f 50 5f 4e 65 78 74 2c 20 61 5b 30 5d 2c 20 61  OP_Next, a[0], a
14d30 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [1]);.        sq
14d40 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72  lite3VdbeJumpHer
14d50 65 28 76 2c 20 61 5b 31 5d 2d 31 29 3b 0a 20 20  e(v, a[1]-1);.  
14d60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
14d70 74 65 46 72 65 65 28 70 4c 65 76 65 6c 2d 3e 61  teFree(pLevel->a
14d80 49 6e 4c 6f 6f 70 29 3b 0a 20 20 20 20 7d 0a 20  InLoop);.    }. 
14d90 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
14da0 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
14db0 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
14dc0 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
14dd0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
14de0 49 66 4d 65 6d 50 6f 73 2c 20 70 4c 65 76 65 6c  IfMemPos, pLevel
14df0 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b  ->iLeftJoin, 0);
14e00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
14e10 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75  beAddOp(v, OP_Nu
14e20 6c 6c 52 6f 77 2c 20 70 54 61 62 4c 69 73 74 2d  llRow, pTabList-
14e30 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 2c 20 30  >a[i].iCursor, 0
14e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  );.      if( pLe
14e50 76 65 6c 2d 3e 69 49 64 78 43 75 72 3e 3d 30 20  vel->iIdxCur>=0 
14e60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14e70 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
14e80 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 4c 65 76 65  P_NullRow, pLeve
14e90 6c 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  l->iIdxCur, 0);.
14ea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
14eb0 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
14ec0 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 4c  , OP_Goto, 0, pL
14ed0 65 76 65 6c 2d 3e 74 6f 70 29 3b 0a 20 20 20 20  evel->top);.    
14ee0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
14ef0 70 48 65 72 65 28 76 2c 20 61 64 64 72 29 3b 0a  pHere(v, addr);.
14f00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
14f10 54 68 65 20 22 62 72 65 61 6b 22 20 70 6f 69 6e  The "break" poin
14f20 74 20 69 73 20 68 65 72 65 2c 20 6a 75 73 74 20  t is here, just 
14f30 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20  past the end of 
14f40 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 2e 0a  the outer loop..
14f50 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a 20 20 2a    ** Set it..  *
14f60 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  /.  sqlite3VdbeR
14f70 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 70  esolveLabel(v, p
14f80 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 29 3b 0a  WInfo->iBreak);.
14f90 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  .  /* Close all 
14fa0 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73 20 74  of the cursors t
14fb0 68 61 74 20 77 65 72 65 20 6f 70 65 6e 65 64 20  hat were opened 
14fc0 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
14fd0 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  egin..  */.  for
14fe0 28 69 3d 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49  (i=0, pLevel=pWI
14ff0 6e 66 6f 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69  nfo->a; i<pTabLi
15000 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
15010 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 73 74  Level++){.    st
15020 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
15030 6d 20 2a 70 54 61 62 49 74 65 6d 20 3d 20 26 70  m *pTabItem = &p
15040 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65  TabList->a[pLeve
15050 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 54  l->iFrom];.    T
15060 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
15070 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  bItem->pTab;.   
15080 20 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30   assert( pTab!=0
15090 20 29 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62   );.    if( pTab
150a0 2d 3e 69 73 45 70 68 65 6d 20 7c 7c 20 70 54 61  ->isEphem || pTa
150b0 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e  b->pSelect ) con
150c0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
150d0 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20  pLevel->flags & 
150e0 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 29 3d  WHERE_IDX_ONLY)=
150f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
15100 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
15110 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62 49 74  OP_Close, pTabIt
15120 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30 29 3b  em->iCursor, 0);
15130 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15140 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30 20 29  Level->pIdx!=0 )
15150 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
15160 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
15170 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lose, pLevel->iI
15180 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 7d  dxCur, 0);.    }
15190 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 63 75  ..    /* Make cu
151a0 72 73 6f 72 20 73 75 62 73 74 69 74 75 74 69 6f  rsor substitutio
151b0 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77 68 65  ns for cases whe
151c0 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20 75 73  re we want to us
151d0 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 74 68  e.    ** just th
151e0 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65 76 65  e index and neve
151f0 72 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20  r reference the 
15200 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20 0a 20  table..    ** . 
15210 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f 20 74     ** Calls to t
15220 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f  he code generato
15230 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73 71 6c  r in between sql
15240 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 20 61  ite3WhereBegin a
15250 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  nd.    ** sqlite
15260 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c 20 68  3WhereEnd will h
15270 61 76 65 20 63 72 65 61 74 65 64 20 63 6f 64 65  ave created code
15280 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 73   that references
15290 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a   the table.    *
152a0 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54 68 69  * directly.  Thi
152b0 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61 6c 6c  s loop scans all
152c0 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f 6b 69   that code looki
152d0 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73 0a 20  ng for opcodes. 
152e0 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66 65 72     ** that refer
152f0 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65 20 61  ence the table a
15300 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68 65 6d  nd converts them
15310 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20 74 68   into opcodes th
15320 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  at.    ** refere
15330 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e 0a 20  nce the index.. 
15340 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
15350 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
15360 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
15370 20 20 20 20 20 20 69 6e 74 20 6b 2c 20 6a 2c 20        int k, j, 
15380 6c 61 73 74 3b 0a 20 20 20 20 20 20 56 64 62 65  last;.      Vdbe
15390 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 20 20 49  Op *pOp;.      I
153a0 6e 64 65 78 20 2a 70 49 64 78 20 3d 20 70 4c 65  ndex *pIdx = pLe
153b0 76 65 6c 2d 3e 70 49 64 78 3b 0a 0a 20 20 20 20  vel->pIdx;..    
153c0 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
153d0 30 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 20 3d  0 );.      pOp =
153e0 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
153f0 70 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 54 6f  p(v, pWInfo->iTo
15400 70 29 3b 0a 20 20 20 20 20 20 6c 61 73 74 20 3d  p);.      last =
15410 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
15420 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
15430 20 20 66 6f 72 28 6b 3d 70 57 49 6e 66 6f 2d 3e    for(k=pWInfo->
15440 69 54 6f 70 3b 20 6b 3c 6c 61 73 74 3b 20 6b 2b  iTop; k<last; k+
15450 2b 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  +, pOp++){.     
15460 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 31 21 3d     if( pOp->p1!=
15470 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 20  pLevel->iTabCur 
15480 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
15490 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
154a0 6f 64 65 3d 3d 4f 50 5f 43 6f 6c 75 6d 6e 20 29  ode==OP_Column )
154b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
154c0 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49  >p1 = pLevel->iI
154d0 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20 20 20  dxCur;.         
154e0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78   for(j=0; j<pIdx
154f0 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  ->nColumn; j++){
15500 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
15510 20 70 4f 70 2d 3e 70 32 3d 3d 70 49 64 78 2d 3e   pOp->p2==pIdx->
15520 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 20 29 7b 0a 20  aiColumn[j] ){. 
15530 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4f 70               pOp
15540 2d 3e 70 32 20 3d 20 6a 3b 0a 20 20 20 20 20 20  ->p2 = j;.      
15550 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15560 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15580 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
15590 6f 70 63 6f 64 65 3d 3d 4f 50 5f 52 6f 77 69 64  opcode==OP_Rowid
155a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
155b0 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65 6c 2d 3e  p->p1 = pLevel->
155c0 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20 20 20  iIdxCur;.       
155d0 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
155e0 20 4f 50 5f 49 64 78 52 6f 77 69 64 3b 0a 20 20   OP_IdxRowid;.  
155f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15600 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
15610 4e 75 6c 6c 52 6f 77 20 29 7b 0a 20 20 20 20 20  NullRow ){.     
15620 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65       pOp->opcode
15630 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
15640 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
15650 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
15660 6e 61 6c 20 63 6c 65 61 6e 75 70 0a 20 20 2a 2f  nal cleanup.  */
15670 0a 20 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65  .  whereInfoFree
15680 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75  (pWInfo);.  retu
15690 72 6e 3b 0a 7d 0a                                rn;.}.