/ Hex Artifact Content
Login

Artifact 6175449f1ff97a5bfea4068a35c050456c632e89:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d  ******.** This m
0180: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 43  odule contains C
0190: 20 63 6f 64 65 20 74 68 61 74 20 67 65 6e 65 72   code that gener
01a0: 61 74 65 73 20 56 44 42 45 20 63 6f 64 65 20 75  ates VDBE code u
01b0: 73 65 64 20 74 6f 20 70 72 6f 63 65 73 73 0a 2a  sed to process.*
01c0: 2a 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  * the WHERE clau
01d0: 73 65 20 6f 66 20 53 51 4c 20 73 74 61 74 65 6d  se of SQL statem
01e0: 65 6e 74 73 2e 20 20 54 68 69 73 20 6d 6f 64 75  ents.  This modu
01f0: 6c 65 20 69 73 20 72 65 70 6f 6e 73 69 62 6c 65  le is reponsible
0200: 20 66 6f 72 0a 2a 2a 20 67 65 6e 65 72 61 74 69   for.** generati
0210: 6e 67 20 74 68 65 20 63 6f 64 65 20 74 68 61 74  ng the code that
0220: 20 6c 6f 6f 70 73 20 74 68 72 6f 75 67 68 20 61   loops through a
0230: 20 74 61 62 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66   table looking f
0240: 6f 72 20 61 70 70 6c 69 63 61 62 6c 65 0a 2a 2a  or applicable.**
0250: 20 72 6f 77 73 2e 20 20 49 6e 64 69 63 65 73 20   rows.  Indices 
0260: 61 72 65 20 73 65 6c 65 63 74 65 64 20 61 6e 64  are selected and
0270: 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20 74   used to speed t
0280: 68 65 20 73 65 61 72 63 68 20 77 68 65 6e 20 64  he search when d
0290: 6f 69 6e 67 0a 2a 2a 20 73 6f 20 69 73 20 61 70  oing.** so is ap
02a0: 70 6c 69 63 61 62 6c 65 2e 20 20 42 65 63 61 75  plicable.  Becau
02b0: 73 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 20 69  se this module i
02c0: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
02d0: 72 20 73 65 6c 65 63 74 69 6e 67 0a 2a 2a 20 69  r selecting.** i
02e0: 6e 64 69 63 65 73 2c 20 79 6f 75 20 6d 69 67 68  ndices, you migh
02f0: 74 20 61 6c 73 6f 20 74 68 69 6e 6b 20 6f 66 20  t also think of 
0300: 74 68 69 73 20 6d 6f 64 75 6c 65 20 61 73 20 74  this module as t
0310: 68 65 20 22 71 75 65 72 79 20 6f 70 74 69 6d 69  he "query optimi
0320: 7a 65 72 22 2e 0a 2a 2a 0a 2a 2a 20 24 49 64 3a  zer"..**.** $Id:
0330: 20 77 68 65 72 65 2e 63 2c 76 20 31 2e 32 32 32   where.c,v 1.222
0340: 20 32 30 30 36 2f 30 36 2f 32 33 20 30 38 3a 30   2006/06/23 08:0
0350: 35 3a 33 31 20 64 61 6e 69 65 6c 6b 31 39 37 37  5:31 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 20 20 69 6e 74 20 72 63  rderBy;.  int rc
8200: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73  ;..  /* If the s
8210: 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e 66  qlite3_index_inf
8220: 6f 20 73 74 72 75 63 74 75 72 65 20 68 61 73 20  o structure has 
8230: 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
8240: 73 6c 79 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  sly.  ** allocat
8250: 65 64 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ed and initializ
8260: 65 64 20 66 6f 72 20 74 68 69 73 20 76 69 72 74  ed for this virt
8270: 75 61 6c 20 74 61 62 6c 65 2c 20 74 68 65 6e 20  ual table, then 
8280: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 61 6e  allocate.  ** an
8290: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 20  d initialize it 
82a0: 6e 6f 77 0a 20 20 2a 2f 0a 20 20 70 49 64 78 49  now.  */.  pIdxI
82b0: 6e 66 6f 20 3d 20 2a 70 70 49 64 78 49 6e 66 6f  nfo = *ppIdxInfo
82c0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
82d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 57 68 65 72 65  ==0 ){.    Where
82e0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 20  Term *pTerm;.   
82f0: 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 0a 20 20 20   int nTerm;..   
8300: 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75   /* Count the nu
8310: 6d 62 65 72 20 6f 66 20 70 6f 73 73 69 62 6c 65  mber of possible
8320: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 63 6f   WHERE clause co
8330: 6e 73 74 72 61 69 6e 74 73 20 72 65 66 65 72 72  nstraints referr
8340: 69 6e 67 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ing.    ** to th
8350: 69 73 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  is virtual table
8360: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 6e 54   */.    for(i=nT
8370: 65 72 6d 3d 30 2c 20 70 54 65 72 6d 3d 70 57 43  erm=0, pTerm=pWC
8380: 2d 3e 61 3b 20 69 3c 70 57 43 2d 3e 6e 54 65 72  ->a; i<pWC->nTer
8390: 6d 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  m; i++, pTerm++)
83a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
83b0: 6d 2d 3e 6c 65 66 74 43 75 72 73 6f 72 20 21 3d  m->leftCursor !=
83c0: 20 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20 29   pSrc->iCursor )
83d0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
83e0: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
83f0: 72 61 74 6f 72 3d 3d 57 4f 5f 49 4e 20 29 20 63  rator==WO_IN ) c
8400: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e  ontinue;.      n
8410: 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  Term++;.    }.. 
8420: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 52 44     /* If the ORD
8430: 45 52 20 42 59 20 63 6c 61 75 73 65 20 63 6f 6e  ER BY clause con
8440: 74 61 69 6e 73 20 6f 6e 6c 79 20 63 6f 6c 75 6d  tains only colum
8450: 6e 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e  ns in the curren
8460: 74 20 0a 20 20 20 20 2a 2a 20 76 69 72 74 75 61  t .    ** virtua
8470: 6c 20 74 61 62 6c 65 20 74 68 65 6e 20 61 6c 6c  l table then all
8480: 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
8490: 74 68 65 20 61 4f 72 64 65 72 42 79 20 70 61 72  the aOrderBy par
84a0: 74 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  t of.    ** the 
84b0: 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f 69 6e  sqlite3_index_in
84c0: 66 6f 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20  fo structure..  
84d0: 20 20 2a 2f 0a 20 20 20 20 6e 4f 72 64 65 72 42    */.    nOrderB
84e0: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
84f0: 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20  OrderBy ){.     
8500: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
8510: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
8520: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
8530: 2a 70 45 78 70 72 20 3d 20 70 4f 72 64 65 72 42  *pExpr = pOrderB
8540: 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  y->a[i].pExpr;. 
8550: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
8560: 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
8570: 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  || pExpr->iTable
8580: 21 3d 70 53 72 63 2d 3e 69 43 75 72 73 6f 72 20  !=pSrc->iCursor 
8590: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
85a0: 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 70 4f  .      if( i==pO
85b0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 20 29 7b  rderBy->nExpr ){
85c0: 0a 20 20 20 20 20 20 20 20 6e 4f 72 64 65 72 42  .        nOrderB
85d0: 79 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45  y = pOrderBy->nE
85e0: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
85f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63   }..    /* Alloc
8600: 61 74 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ate the sqlite3_
8610: 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63  index_info struc
8620: 74 75 72 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ture.    */.    
8630: 70 49 64 78 49 6e 66 6f 20 3d 20 73 71 6c 69 74  pIdxInfo = sqlit
8640: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
8650: 2a 70 49 64 78 49 6e 66 6f 29 0a 20 20 20 20 20  *pIdxInfo).     
8660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8670: 20 20 20 20 20 20 20 20 2b 20 28 73 69 7a 65 6f          + (sizeo
8680: 66 28 2a 70 49 64 78 43 6f 6e 73 29 20 2b 20 73  f(*pIdxCons) + s
8690: 69 7a 65 6f 66 28 2a 70 55 73 61 67 65 29 29 2a  izeof(*pUsage))*
86a0: 6e 54 65 72 6d 0a 20 20 20 20 20 20 20 20 20 20  nTerm.          
86b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86c0: 20 20 20 2b 20 73 69 7a 65 6f 66 28 2a 70 49 64     + sizeof(*pId
86d0: 78 4f 72 64 65 72 42 79 29 2a 6e 4f 72 64 65 72  xOrderBy)*nOrder
86e0: 42 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  By );.    if( pI
86f0: 64 78 49 6e 66 6f 3d 3d 30 20 29 7b 0a 20 20 20  dxInfo==0 ){.   
8700: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8710: 73 67 28 70 50 61 72 73 65 2c 20 22 6f 75 74 20  sg(pParse, "out 
8720: 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20 20  of memory");.   
8730: 20 20 20 72 65 74 75 72 6e 20 30 2e 30 3b 0a 20     return 0.0;. 
8740: 20 20 20 7d 0a 20 20 20 20 2a 70 70 49 64 78 49     }.    *ppIdxI
8750: 6e 66 6f 20 3d 20 70 49 64 78 49 6e 66 6f 3b 0a  nfo = pIdxInfo;.
8760: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  .    /* Initiali
8770: 7a 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65  ze the structure
8780: 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f 69  .  The sqlite3_i
8790: 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72 75 63 74  ndex_info struct
87a0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20  ure contains.   
87b0: 20 2a 2a 20 6d 61 6e 79 20 66 69 65 6c 64 73 20   ** many fields 
87c0: 74 68 61 74 20 61 72 65 20 64 65 63 6c 61 72 65  that are declare
87d0: 64 20 22 63 6f 6e 73 74 22 20 74 6f 20 70 72 65  d "const" to pre
87e0: 76 65 6e 74 20 78 42 65 73 74 49 6e 64 65 78 20  vent xBestIndex 
87f0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 63 68 61 6e  from.    ** chan
8800: 67 69 6e 67 20 74 68 65 6d 2e 20 20 57 65 20 68  ging them.  We h
8810: 61 76 65 20 74 6f 20 64 6f 20 73 6f 6d 65 20 66  ave to do some f
8820: 75 6e 6b 79 20 63 61 73 74 69 6e 67 20 69 6e 20  unky casting in 
8830: 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 2a 2a 20  order to.    ** 
8840: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 6f 73 65  initialize those
8850: 20 66 69 65 6c 64 73 2e 0a 20 20 20 20 2a 2f 0a   fields..    */.
8860: 20 20 20 20 70 49 64 78 43 6f 6e 73 20 3d 20 28      pIdxCons = (
8870: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8880: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 2a  ndex_constraint*
8890: 29 26 70 49 64 78 49 6e 66 6f 5b 31 5d 3b 0a 20  )&pIdxInfo[1];. 
88a0: 20 20 20 70 49 64 78 4f 72 64 65 72 42 79 20 3d     pIdxOrderBy =
88b0: 20 28 73 74 72 75 63 74 20 73 71 6c 69 74 65 33   (struct sqlite3
88c0: 5f 69 6e 64 65 78 5f 6f 72 64 65 72 62 79 2a 29  _index_orderby*)
88d0: 26 70 49 64 78 43 6f 6e 73 5b 6e 54 65 72 6d 5d  &pIdxCons[nTerm]
88e0: 3b 0a 20 20 20 20 70 55 73 61 67 65 20 3d 20 28  ;.    pUsage = (
88f0: 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69  struct sqlite3_i
8900: 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f  ndex_constraint_
8910: 75 73 61 67 65 2a 29 26 70 49 64 78 4f 72 64 65  usage*)&pIdxOrde
8920: 72 42 79 5b 6e 4f 72 64 65 72 42 79 5d 3b 0a 20  rBy[nOrderBy];. 
8930: 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78 49     *(int*)&pIdxI
8940: 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74  nfo->nConstraint
8950: 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 2a 28   = nTerm;.    *(
8960: 69 6e 74 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  int*)&pIdxInfo->
8970: 6e 4f 72 64 65 72 42 79 20 3d 20 6e 4f 72 64 65  nOrderBy = nOrde
8980: 72 42 79 3b 0a 20 20 20 20 2a 28 73 74 72 75 63  rBy;.    *(struc
8990: 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
89a0: 63 6f 6e 73 74 72 61 69 6e 74 2a 2a 29 26 70 49  constraint**)&pI
89b0: 64 78 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61  dxInfo->aConstra
89c0: 69 6e 74 20 3d 20 70 49 64 78 43 6f 6e 73 3b 0a  int = pIdxCons;.
89d0: 20 20 20 20 2a 28 73 74 72 75 63 74 20 73 71 6c      *(struct sql
89e0: 69 74 65 33 5f 69 6e 64 65 78 5f 6f 72 64 65 72  ite3_index_order
89f0: 62 79 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d 3e  by**)&pIdxInfo->
8a00: 61 4f 72 64 65 72 42 79 20 3d 20 70 49 64 78 4f  aOrderBy = pIdxO
8a10: 72 64 65 72 42 79 3b 0a 20 20 20 20 2a 28 73 74  rderBy;.    *(st
8a20: 72 75 63 74 20 73 71 6c 69 74 65 33 5f 69 6e 64  ruct sqlite3_ind
8a30: 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74 5f 75 73  ex_constraint_us
8a40: 61 67 65 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  age**)&pIdxInfo-
8a50: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
8a60: 65 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  e =.            
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 20                  
8aa0: 20 20 20 20 20 20 20 20 20 70 55 73 61 67 65 3b           pUsage;
8ab0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 6a 3d 30 2c  ..    for(i=j=0,
8ac0: 20 70 54 65 72 6d 3d 70 57 43 2d 3e 61 3b 20 69   pTerm=pWC->a; i
8ad0: 3c 70 57 43 2d 3e 6e 54 65 72 6d 3b 20 69 2b 2b  <pWC->nTerm; i++
8ae0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
8af0: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 6c 65 66    if( pTerm->lef
8b00: 74 43 75 72 73 6f 72 20 21 3d 20 70 53 72 63 2d  tCursor != pSrc-
8b10: 3e 69 43 75 72 73 6f 72 20 29 20 63 6f 6e 74 69  >iCursor ) conti
8b20: 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nue;.      if( p
8b30: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3d  Term->eOperator=
8b40: 3d 57 4f 5f 49 4e 20 29 20 63 6f 6e 74 69 6e 75  =WO_IN ) continu
8b50: 65 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e  e;.      pIdxCon
8b60: 73 5b 6a 5d 2e 69 43 6f 6c 75 6d 6e 20 3d 20 70  s[j].iColumn = p
8b70: 54 65 72 6d 2d 3e 6c 65 66 74 43 6f 6c 75 6d 6e  Term->leftColumn
8b80: 3b 0a 20 20 20 20 20 20 70 49 64 78 43 6f 6e 73  ;.      pIdxCons
8b90: 5b 6a 5d 2e 69 54 65 72 6d 4f 66 66 73 65 74 20  [j].iTermOffset 
8ba0: 3d 20 69 3b 0a 20 20 20 20 20 20 70 49 64 78 43  = i;.      pIdxC
8bb0: 6f 6e 73 5b 6a 5d 2e 6f 70 20 3d 20 70 54 65 72  ons[j].op = pTer
8bc0: 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 3b 0a 20 20  m->eOperator;.  
8bd0: 20 20 20 20 2f 2a 20 54 68 65 20 64 69 72 65 63      /* The direc
8be0: 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 69 6e 20  t assignment in 
8bf0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6e  the previous lin
8c00: 65 20 69 73 20 70 6f 73 73 69 62 6c 65 20 6f 6e  e is possible on
8c10: 6c 79 20 62 65 63 61 75 73 65 0a 20 20 20 20 20  ly because.     
8c20: 20 2a 2a 20 74 68 65 20 57 4f 5f 20 61 6e 64 20   ** the WO_ and 
8c30: 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e  SQLITE_INDEX_CON
8c40: 53 54 52 41 49 4e 54 5f 20 63 6f 64 65 73 20 61  STRAINT_ codes a
8c50: 72 65 20 69 64 65 6e 74 69 63 61 6c 2e 20 20 54  re identical.  T
8c60: 68 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 6c 6c  he.      ** foll
8c70: 6f 77 69 6e 67 20 61 73 73 65 72 74 73 20 76 65  owing asserts ve
8c80: 72 69 66 79 20 74 68 69 73 20 66 61 63 74 2e 20  rify this fact. 
8c90: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
8ca0: 20 57 4f 5f 45 51 3d 3d 53 51 4c 49 54 45 5f 49   WO_EQ==SQLITE_I
8cb0: 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  NDEX_CONSTRAINT_
8cc0: 45 51 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  EQ );.      asse
8cd0: 72 74 28 20 57 4f 5f 4c 54 3d 3d 53 51 4c 49 54  rt( WO_LT==SQLIT
8ce0: 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49  E_INDEX_CONSTRAI
8cf0: 4e 54 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 61  NT_LT );.      a
8d00: 73 73 65 72 74 28 20 57 4f 5f 4c 45 3d 3d 53 51  ssert( WO_LE==SQ
8d10: 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f 4e 53 54  LITE_INDEX_CONST
8d20: 52 41 49 4e 54 5f 4c 45 20 29 3b 0a 20 20 20 20  RAINT_LE );.    
8d30: 20 20 61 73 73 65 72 74 28 20 57 4f 5f 47 54 3d    assert( WO_GT=
8d40: 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58 5f 43 4f  =SQLITE_INDEX_CO
8d50: 4e 53 54 52 41 49 4e 54 5f 47 54 20 29 3b 0a 20  NSTRAINT_GT );. 
8d60: 20 20 20 20 20 61 73 73 65 72 74 28 20 57 4f 5f       assert( WO_
8d70: 47 45 3d 3d 53 51 4c 49 54 45 5f 49 4e 44 45 58  GE==SQLITE_INDEX
8d80: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 47 45 20 29  _CONSTRAINT_GE )
8d90: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
8da0: 57 4f 5f 4d 41 54 43 48 3d 3d 53 51 4c 49 54 45  WO_MATCH==SQLITE
8db0: 5f 49 4e 44 45 58 5f 43 4f 4e 53 54 52 41 49 4e  _INDEX_CONSTRAIN
8dc0: 54 5f 4d 41 54 43 48 20 29 3b 0a 20 20 20 20 20  T_MATCH );.     
8dd0: 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e   assert( pTerm->
8de0: 65 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f  eOperator & (WO_
8df0: 45 51 7c 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  EQ|WO_LT|WO_LE|W
8e00: 4f 5f 47 54 7c 57 4f 5f 47 45 7c 57 4f 5f 4d 41  O_GT|WO_GE|WO_MA
8e10: 54 43 48 29 20 29 3b 0a 20 20 20 20 20 20 6a 2b  TCH) );.      j+
8e20: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
8e30: 28 69 3d 30 3b 20 69 3c 6e 4f 72 64 65 72 42 79  (i=0; i<nOrderBy
8e40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
8e50: 70 72 20 2a 70 45 78 70 72 20 3d 20 70 4f 72 64  pr *pExpr = pOrd
8e60: 65 72 42 79 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  erBy->a[i].pExpr
8e70: 3b 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65  ;.      pIdxOrde
8e80: 72 42 79 5b 69 5d 2e 69 43 6f 6c 75 6d 6e 20 3d  rBy[i].iColumn =
8e90: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b   pExpr->iColumn;
8ea0: 0a 20 20 20 20 20 20 70 49 64 78 4f 72 64 65 72  .      pIdxOrder
8eb0: 42 79 5b 69 5d 2e 64 65 73 63 20 3d 20 70 4f 72  By[i].desc = pOr
8ec0: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 73 6f 72 74  derBy->a[i].sort
8ed0: 4f 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  Order;.    }.  }
8ee0: 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
8ef0: 6f 69 6e 74 2c 20 74 68 65 20 73 71 6c 69 74 65  oint, the sqlite
8f00: 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 73 74 72  3_index_info str
8f10: 75 63 74 75 72 65 20 74 68 61 74 20 70 49 64 78  ucture that pIdx
8f20: 49 6e 66 6f 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  Info points.  **
8f30: 20 74 6f 20 77 69 6c 6c 20 68 61 76 65 20 62 65   to will have be
8f40: 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20  en initialized, 
8f50: 65 69 74 68 65 72 20 64 75 72 69 6e 67 20 74 68  either during th
8f60: 65 20 63 75 72 72 65 6e 74 20 69 6e 76 6f 63 61  e current invoca
8f70: 74 69 6f 6e 20 6f 72 0a 20 20 2a 2a 20 64 75 72  tion or.  ** dur
8f80: 69 6e 67 20 73 6f 6d 65 20 70 72 69 6f 72 20 69  ing some prior i
8f90: 6e 76 6f 63 61 74 69 6f 6e 2e 20 20 4e 6f 77 20  nvocation.  Now 
8fa0: 77 65 20 6a 75 73 74 20 68 61 76 65 20 74 6f 20  we just have to 
8fb0: 63 75 73 74 6f 6d 69 7a 65 20 74 68 65 0a 20 20  customize the.  
8fc0: 2a 2a 20 64 65 74 61 69 6c 73 20 6f 66 20 70 49  ** details of pI
8fd0: 64 78 49 6e 66 6f 20 66 6f 72 20 74 68 65 20 63  dxInfo for the c
8fe0: 75 72 72 65 6e 74 20 69 6e 76 6f 63 61 74 69 6f  urrent invocatio
8ff0: 6e 20 61 6e 64 20 70 61 73 73 20 69 74 20 74 6f  n and pass it to
9000: 0a 20 20 2a 2a 20 78 42 65 73 74 49 6e 64 65 78  .  ** xBestIndex
9010: 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ..  */..  /* The
9020: 20 6d 6f 64 75 6c 65 20 6e 61 6d 65 20 6d 75 73   module name mus
9030: 74 20 62 65 20 64 65 66 69 6e 65 64 20 2a 2f 0a  t be defined */.
9040: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
9050: 61 7a 4d 6f 64 75 6c 65 41 72 67 20 26 26 20 70  azModuleArg && p
9060: 54 61 62 2d 3e 61 7a 4d 6f 64 75 6c 65 41 72 67  Tab->azModuleArg
9070: 5b 30 5d 20 29 3b 0a 20 20 69 66 28 20 70 54 61  [0] );.  if( pTa
9080: 62 2d 3e 70 56 74 61 62 3d 3d 30 20 29 7b 0a 20  b->pVtab==0 ){. 
9090: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
90a0: 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 64 65  sg(pParse, "unde
90b0: 66 69 6e 65 64 20 6d 6f 64 75 6c 65 20 25 73 20  fined module %s 
90c0: 66 6f 72 20 74 61 62 6c 65 20 25 73 22 2c 0a 20  for table %s",. 
90d0: 20 20 20 20 20 20 20 70 54 61 62 2d 3e 61 7a 4d         pTab->azM
90e0: 6f 64 75 6c 65 41 72 67 5b 30 5d 2c 20 70 54 61  oduleArg[0], pTa
90f0: 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72  b->zName);.    r
9100: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a  eturn 0.0;.  }..
9110: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 61 43 6f    /* Set the aCo
9120: 6e 73 74 72 61 69 6e 74 5b 5d 2e 75 73 61 62 6c  nstraint[].usabl
9130: 65 20 66 69 65 6c 64 73 20 61 6e 64 20 69 6e 69  e fields and ini
9140: 74 69 61 6c 69 7a 65 20 61 6c 6c 20 0a 20 20 2a  tialize all .  *
9150: 2a 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * output variabl
9160: 65 73 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a 2a  es to zero..  **
9170: 0a 20 20 2a 2a 20 61 43 6f 6e 73 74 72 61 69 6e  .  ** aConstrain
9180: 74 5b 5d 2e 75 73 61 62 6c 65 20 69 73 20 74 72  t[].usable is tr
9190: 75 65 20 66 6f 72 20 63 6f 6e 73 74 72 61 69 6e  ue for constrain
91a0: 74 73 20 77 68 65 72 65 20 74 68 65 20 72 69 67  ts where the rig
91b0: 68 74 2d 68 61 6e 64 0a 20 20 2a 2a 20 73 69 64  ht-hand.  ** sid
91c0: 65 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20  e contains only 
91d0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 61  references to ta
91e0: 62 6c 65 73 20 74 6f 20 74 68 65 20 6c 65 66 74  bles to the left
91f0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 0a   of the current.
9200: 20 20 2a 2a 20 74 61 62 6c 65 2e 20 20 49 6e 20    ** table.  In 
9210: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 69 66 20  other words, if 
9220: 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  the constraint i
9230: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 3a 0a 20  s of the form:. 
9240: 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   **.  **        
9250: 20 20 20 63 6f 6c 75 6d 6e 20 3d 20 65 78 70 72     column = expr
9260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 61 6e 64 20 77  .  **.  ** and w
9270: 65 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67  e are evaluating
9280: 20 61 20 6a 6f 69 6e 2c 20 74 68 65 6e 20 74 68   a join, then th
9290: 65 20 63 6f 6e 73 74 72 61 69 6e 74 20 6f 6e 20  e constraint on 
92a0: 63 6f 6c 75 6d 6e 20 69 73 20 0a 20 20 2a 2a 20  column is .  ** 
92b0: 6f 6e 6c 79 20 76 61 6c 69 64 20 69 66 20 61 6c  only valid if al
92c0: 6c 20 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e  l tables referen
92d0: 63 65 64 20 69 6e 20 65 78 70 72 20 6f 63 63 75  ced in expr occu
92e0: 72 20 74 6f 20 74 68 65 20 6c 65 66 74 0a 20 20  r to the left.  
92f0: 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ** of the table 
9300: 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d  containing colum
9310: 6e 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  n..  **.  ** The
9320: 20 61 43 6f 6e 73 74 72 61 69 6e 74 73 5b 5d 20   aConstraints[] 
9330: 61 72 72 61 79 20 63 6f 6e 74 61 69 6e 73 20 65  array contains e
9340: 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63  ntries for all c
9350: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20  onstraints.  ** 
9360: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  on the current t
9370: 61 62 6c 65 2e 20 20 54 68 61 74 20 77 61 79 20  able.  That way 
9380: 77 65 20 6f 6e 6c 79 20 68 61 76 65 20 74 6f 20  we only have to 
9390: 63 6f 6d 70 75 74 65 20 69 74 20 6f 6e 63 65 0a  compute it once.
93a0: 20 20 2a 2a 20 65 76 65 6e 20 74 68 6f 75 67 68    ** even though
93b0: 20 77 65 20 6d 69 67 68 74 20 74 72 79 20 74 6f   we might try to
93c0: 20 70 69 63 6b 20 74 68 65 20 62 65 73 74 20 69   pick the best i
93d0: 6e 64 65 78 20 6d 75 6c 74 69 70 6c 65 20 74 69  ndex multiple ti
93e0: 6d 65 73 2e 0a 20 20 2a 2a 20 46 6f 72 20 65 61  mes..  ** For ea
93f0: 63 68 20 61 74 74 65 6d 70 74 20 61 74 20 70 69  ch attempt at pi
9400: 63 6b 69 6e 67 20 61 6e 20 69 6e 64 65 78 2c 20  cking an index, 
9410: 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74 61 62  the order of tab
9420: 6c 65 73 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  les in the.  ** 
9430: 6a 6f 69 6e 20 6d 69 67 68 74 20 62 65 20 64 69  join might be di
9440: 66 66 65 72 65 6e 74 20 73 6f 20 77 65 20 68 61  fferent so we ha
9450: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
9460: 74 68 65 20 75 73 61 62 6c 65 20 66 6c 61 67 0a  the usable flag.
9470: 20 20 2a 2a 20 65 61 63 68 20 74 69 6d 65 2e 0a    ** each time..
9480: 20 20 2a 2f 0a 20 20 70 49 64 78 43 6f 6e 73 20    */.  pIdxCons 
9490: 3d 20 2a 28 73 74 72 75 63 74 20 73 71 6c 69 74  = *(struct sqlit
94a0: 65 33 5f 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61  e3_index_constra
94b0: 69 6e 74 2a 2a 29 26 70 49 64 78 49 6e 66 6f 2d  int**)&pIdxInfo-
94c0: 3e 61 43 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20  >aConstraint;.  
94d0: 70 55 73 61 67 65 20 3d 20 70 49 64 78 49 6e 66  pUsage = pIdxInf
94e0: 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73  o->aConstraintUs
94f0: 61 67 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  age;.  for(i=0; 
9500: 69 3c 70 49 64 78 49 6e 66 6f 2d 3e 6e 43 6f 6e  i<pIdxInfo->nCon
9510: 73 74 72 61 69 6e 74 3b 20 69 2b 2b 2c 20 70 49  straint; i++, pI
9520: 64 78 43 6f 6e 73 2b 2b 29 7b 0a 20 20 20 20 6a  dxCons++){.    j
9530: 20 3d 20 70 49 64 78 43 6f 6e 73 2d 3e 69 54 65   = pIdxCons->iTe
9540: 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 70 54  rmOffset;.    pT
9550: 65 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 6a 5d  erm = &pWC->a[j]
9560: 3b 0a 20 20 20 20 70 49 64 78 43 6f 6e 73 2d 3e  ;.    pIdxCons->
9570: 75 73 61 62 6c 65 20 3d 20 20 28 70 54 65 72 6d  usable =  (pTerm
9580: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
9590: 6e 6f 74 52 65 61 64 79 29 3d 3d 30 3b 0a 20 20  notReady)==0;.  
95a0: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 55 73 61 67  }.  memset(pUsag
95b0: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 55 73  e, 0, sizeof(pUs
95c0: 61 67 65 5b 30 5d 29 2a 70 49 64 78 49 6e 66 6f  age[0])*pIdxInfo
95d0: 2d 3e 6e 43 6f 6e 73 74 72 61 69 6e 74 29 3b 0a  ->nConstraint);.
95e0: 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d 3e    if( pIdxInfo->
95f0: 6e 65 65 64 54 6f 46 72 65 65 49 64 78 53 74 72  needToFreeIdxStr
9600: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9610: 66 72 65 65 28 70 49 64 78 49 6e 66 6f 2d 3e 69  free(pIdxInfo->i
9620: 64 78 53 74 72 29 3b 0a 20 20 7d 0a 20 20 70 49  dxStr);.  }.  pI
9630: 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 20 3d  dxInfo->idxStr =
9640: 20 30 3b 0a 20 20 70 49 64 78 49 6e 66 6f 2d 3e   0;.  pIdxInfo->
9650: 69 64 78 4e 75 6d 20 3d 20 30 3b 0a 20 20 70 49  idxNum = 0;.  pI
9660: 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
9670: 65 65 49 64 78 53 74 72 20 3d 20 30 3b 0a 20 20  eeIdxStr = 0;.  
9680: 70 49 64 78 49 6e 66 6f 2d 3e 6f 72 64 65 72 42  pIdxInfo->orderB
9690: 79 43 6f 6e 73 75 6d 65 64 20 3d 20 30 3b 0a 20  yConsumed = 0;. 
96a0: 20 70 49 64 78 49 6e 66 6f 2d 3e 65 73 74 69 6d   pIdxInfo->estim
96b0: 61 74 65 64 43 6f 73 74 20 3d 20 53 51 4c 49 54  atedCost = SQLIT
96c0: 45 5f 42 49 47 5f 44 42 4c 20 2f 20 32 2e 30 3b  E_BIG_DBL / 2.0;
96d0: 0a 20 20 6e 4f 72 64 65 72 42 79 20 3d 20 70 49  .  nOrderBy = pI
96e0: 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79  dxInfo->nOrderBy
96f0: 3b 0a 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f  ;.  if( pIdxInfo
9700: 2d 3e 6e 4f 72 64 65 72 42 79 20 26 26 20 21 6f  ->nOrderBy && !o
9710: 72 64 65 72 42 79 55 73 61 62 6c 65 20 29 7b 0a  rderByUsable ){.
9720: 20 20 20 20 2a 28 69 6e 74 2a 29 26 70 49 64 78      *(int*)&pIdx
9730: 49 6e 66 6f 2d 3e 6e 4f 72 64 65 72 42 79 20 3d  Info->nOrderBy =
9740: 20 30 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   0;.  }..  sqlit
9750: 65 33 53 61 66 65 74 79 4f 66 66 28 70 50 61 72  e3SafetyOff(pPar
9760: 73 65 2d 3e 64 62 29 3b 0a 20 20 72 63 20 3d 20  se->db);.  rc = 
9770: 70 54 61 62 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f  pTab->pVtab->pMo
9780: 64 75 6c 65 2d 3e 78 42 65 73 74 49 6e 64 65 78  dule->xBestIndex
9790: 28 70 54 61 62 2d 3e 70 56 74 61 62 2c 20 70 49  (pTab->pVtab, pI
97a0: 64 78 49 6e 66 6f 29 3b 0a 20 20 69 66 28 20 72  dxInfo);.  if( r
97b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
97c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
97d0: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
97e0: 20 20 73 71 6c 69 74 65 33 46 61 69 6c 65 64 4d    sqlite3FailedM
97f0: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 7d 65 6c  alloc();.    }el
9800: 73 65 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  se {.      sqlit
9810: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9820: 65 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33  e, "%s", sqlite3
9830: 45 72 72 53 74 72 28 72 63 29 29 3b 0a 20 20 20  ErrStr(rc));.   
9840: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53 61   }.    sqlite3Sa
9850: 66 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64  fetyOn(pParse->d
9860: 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  b);.  }else{.   
9870: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 53 61 66   rc = sqlite3Saf
9880: 65 74 79 4f 6e 28 70 50 61 72 73 65 2d 3e 64 62  etyOn(pParse->db
9890: 29 3b 0a 20 20 7d 0a 0a 20 20 2a 28 69 6e 74 2a  );.  }..  *(int*
98a0: 29 26 70 49 64 78 49 6e 66 6f 2d 3e 6e 4f 72 64  )&pIdxInfo->nOrd
98b0: 65 72 42 79 20 3d 20 6e 4f 72 64 65 72 42 79 3b  erBy = nOrderBy;
98c0: 0a 20 20 72 65 74 75 72 6e 20 70 49 64 78 49 6e  .  return pIdxIn
98d0: 66 6f 2d 3e 65 73 74 69 6d 61 74 65 64 43 6f 73  fo->estimatedCos
98e0: 74 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  t;.}.#endif /* S
98f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9900: 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a  ALTABLE */../*.*
9910: 2a 20 46 69 6e 64 20 74 68 65 20 62 65 73 74 20  * Find the best 
9920: 69 6e 64 65 78 20 66 6f 72 20 61 63 63 65 73 73  index for access
9930: 69 6e 67 20 61 20 70 61 72 74 69 63 75 6c 61 72  ing a particular
9940: 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
9950: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
9960: 74 68 65 20 69 6e 64 65 78 2c 20 66 6c 61 67 73  the index, flags
9970: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 20 68   that describe h
9980: 6f 77 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  ow the index sho
9990: 75 6c 64 20 62 65 20 75 73 65 64 2c 20 74 68 65  uld be used, the
99a0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 71  .** number of eq
99b0: 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69 6e  uality constrain
99c0: 74 73 2c 20 61 6e 64 20 74 68 65 20 22 63 6f 73  ts, and the "cos
99d0: 74 22 20 66 6f 72 20 74 68 69 73 20 69 6e 64 65  t" for this inde
99e0: 78 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 6f 77  x..**.** The low
99f0: 65 73 74 20 63 6f 73 74 20 69 6e 64 65 78 20 77  est cost index w
9a00: 69 6e 73 2e 20 20 54 68 65 20 63 6f 73 74 20 69  ins.  The cost i
9a10: 73 20 61 6e 20 65 73 74 69 6d 61 74 65 20 6f 66  s an estimate of
9a20: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 0a 2a   the amount of.*
9a30: 2a 20 43 50 55 20 61 6e 64 20 64 69 73 6b 20 49  * CPU and disk I
9a40: 2f 4f 20 6e 65 65 64 20 74 6f 20 70 72 6f 63 65  /O need to proce
9a50: 73 73 20 74 68 65 20 72 65 71 75 65 73 74 20 75  ss the request u
9a60: 73 69 6e 67 20 74 68 65 20 73 65 6c 65 63 74 65  sing the selecte
9a70: 64 20 69 6e 64 65 78 2e 0a 2a 2a 20 46 61 63 74  d index..** Fact
9a80: 6f 72 73 20 74 68 61 74 20 69 6e 66 6c 75 65 6e  ors that influen
9a90: 63 65 20 63 6f 73 74 20 69 6e 63 6c 75 64 65 3a  ce cost include:
9aa0: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 54 68 65  .**.**    *  The
9ab0: 20 65 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   estimated numbe
9ac0: 72 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77  r of rows that w
9ad0: 69 6c 6c 20 62 65 20 72 65 74 72 69 65 76 65 64  ill be retrieved
9ae0: 2e 20 20 28 54 68 65 0a 2a 2a 20 20 20 20 20 20  .  (The.**      
9af0: 20 66 65 77 65 72 20 74 68 65 20 62 65 74 74 65   fewer the bette
9b00: 72 2e 29 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  r.).**.**    *  
9b10: 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73  Whether or not s
9b20: 6f 72 74 69 6e 67 20 6d 75 73 74 20 6f 63 63 75  orting must occu
9b30: 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 57  r..**.**    *  W
9b40: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
9b50: 65 72 65 20 6d 75 73 74 20 62 65 20 73 65 70 61  ere must be sepa
9b60: 72 61 74 65 20 6c 6f 6f 6b 75 70 73 20 69 6e 20  rate lookups in 
9b70: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 69 6e 64  the.**       ind
9b80: 65 78 20 61 6e 64 20 69 6e 20 74 68 65 20 6d 61  ex and in the ma
9b90: 69 6e 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2f 0a  in table..**.*/.
9ba0: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 62 65  static double be
9bb0: 73 74 49 6e 64 65 78 28 0a 20 20 50 61 72 73 65  stIndex(.  Parse
9bc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9bd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
9be0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
9bf0: 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65 20 2a  .  WhereClause *
9c00: 70 57 43 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pWC,           /
9c10: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
9c20: 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  se */.  struct S
9c30: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 53 72  rcList_item *pSr
9c40: 63 2c 20 20 2f 2a 20 54 68 65 20 46 52 4f 4d 20  c,  /* The FROM 
9c50: 63 6c 61 75 73 65 20 74 65 72 6d 20 74 6f 20 73  clause term to s
9c60: 65 61 72 63 68 20 2a 2f 0a 20 20 42 69 74 6d 61  earch */.  Bitma
9c70: 73 6b 20 6e 6f 74 52 65 61 64 79 2c 20 20 20 20  sk notReady,    
9c80: 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
9c90: 66 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 61  f cursors that a
9ca0: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
9cb0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
9cc0: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 20 20  pOrderBy,       
9cd0: 20 20 2f 2a 20 54 68 65 20 6f 72 64 65 72 20 62    /* The order b
9ce0: 79 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 49 6e  y clause */.  In
9cf0: 64 65 78 20 2a 2a 70 70 49 6e 64 65 78 2c 20 20  dex **ppIndex,  
9d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
9d10: 65 20 2a 70 70 49 6e 64 65 78 20 70 6f 69 6e 74  e *ppIndex point
9d20: 20 74 6f 20 74 68 65 20 62 65 73 74 20 69 6e 64   to the best ind
9d30: 65 78 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 46 6c  ex */.  int *pFl
9d40: 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
9d50: 20 20 20 20 2f 2a 20 50 75 74 20 66 6c 61 67 73      /* Put flags
9d60: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69 73   describing this
9d70: 20 63 68 6f 69 63 65 20 69 6e 20 2a 70 46 6c 61   choice in *pFla
9d80: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 45  gs */.  int *pnE
9d90: 71 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  q               
9da0: 20 20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 6e      /* Put the n
9db0: 75 6d 62 65 72 20 6f 66 20 3d 3d 20 6f 72 20 49  umber of == or I
9dc0: 4e 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 68 65  N constraints he
9dd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 57 68 65 72 65  re */.){.  Where
9de0: 54 65 72 6d 20 2a 70 54 65 72 6d 3b 0a 20 20 49  Term *pTerm;.  I
9df0: 6e 64 65 78 20 2a 62 65 73 74 49 64 78 20 3d 20  ndex *bestIdx = 
9e00: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  0;         /* In
9e10: 64 65 78 20 74 68 61 74 20 67 69 76 65 73 20 74  dex that gives t
9e20: 68 65 20 6c 6f 77 65 73 74 20 63 6f 73 74 20 2a  he lowest cost *
9e30: 2f 0a 20 20 64 6f 75 62 6c 65 20 6c 6f 77 65 73  /.  double lowes
9e40: 74 43 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20  tCost;          
9e50: 2f 2a 20 54 68 65 20 63 6f 73 74 20 6f 66 20 75  /* The cost of u
9e60: 73 69 6e 67 20 62 65 73 74 49 64 78 20 2a 2f 0a  sing bestIdx */.
9e70: 20 20 69 6e 74 20 62 65 73 74 46 6c 61 67 73 20    int bestFlags 
9e80: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
9e90: 20 46 6c 61 67 73 20 61 73 73 6f 63 69 61 74 65   Flags associate
9ea0: 64 20 77 69 74 68 20 62 65 73 74 49 64 78 20 2a  d with bestIdx *
9eb0: 2f 0a 20 20 69 6e 74 20 62 65 73 74 4e 45 71 20  /.  int bestNEq 
9ec0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
9ed0: 2f 2a 20 42 65 73 74 20 76 61 6c 75 65 20 66 6f  /* Best value fo
9ee0: 72 20 6e 45 71 20 2a 2f 0a 20 20 69 6e 74 20 69  r nEq */.  int i
9ef0: 43 75 72 20 3d 20 70 53 72 63 2d 3e 69 43 75 72  Cur = pSrc->iCur
9f00: 73 6f 72 3b 20 20 20 2f 2a 20 54 68 65 20 63 75  sor;   /* The cu
9f10: 72 73 6f 72 20 6f 66 20 74 68 65 20 74 61 62 6c  rsor of the tabl
9f20: 65 20 74 6f 20 62 65 20 61 63 63 65 73 73 65 64  e to be accessed
9f30: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 50 72   */.  Index *pPr
9f40: 6f 62 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  obe;            
9f50: 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 77 65    /* An index we
9f60: 20 61 72 65 20 65 76 61 6c 75 61 74 69 6e 67 20   are evaluating 
9f70: 2a 2f 0a 20 20 69 6e 74 20 72 65 76 3b 20 20 20  */.  int rev;   
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f90: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 63 61 6e   /* True to scan
9fa0: 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
9fb0: 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  r */.  int flags
9fc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9fd0: 20 20 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f     /* Flags asso
9fe0: 63 69 61 74 65 64 20 77 69 74 68 20 70 50 72 6f  ciated with pPro
9ff0: 62 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 71 3b  be */.  int nEq;
a000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a020: 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73 74 72   == or IN constr
a030: 61 69 6e 74 73 20 2a 2f 0a 20 20 64 6f 75 62 6c  aints */.  doubl
a040: 65 20 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20  e cost;         
a050: 20 20 20 20 20 20 20 2f 2a 20 43 6f 73 74 20 6f         /* Cost o
a060: 66 20 75 73 69 6e 67 20 70 50 72 6f 62 65 20 2a  f using pProbe *
a070: 2f 0a 0a 20 20 54 52 41 43 45 28 28 22 62 65 73  /..  TRACE(("bes
a080: 74 49 6e 64 65 78 3a 20 74 62 6c 3d 25 73 20 6e  tIndex: tbl=%s n
a090: 6f 74 52 65 61 64 79 3d 25 78 5c 6e 22 2c 20 70  otReady=%x\n", p
a0a0: 53 72 63 2d 3e 70 54 61 62 2d 3e 7a 4e 61 6d 65  Src->pTab->zName
a0b0: 2c 20 6e 6f 74 52 65 61 64 79 29 29 3b 0a 20 20  , notReady));.  
a0c0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 53 51 4c  lowestCost = SQL
a0d0: 49 54 45 5f 42 49 47 5f 44 42 4c 3b 0a 20 20 70  ITE_BIG_DBL;.  p
a0e0: 50 72 6f 62 65 20 3d 20 70 53 72 63 2d 3e 70 54  Probe = pSrc->pT
a0f0: 61 62 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 2f  ab->pIndex;..  /
a100: 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 68  * If the table h
a110: 61 73 20 6e 6f 20 69 6e 64 69 63 65 73 20 61 6e  as no indices an
a120: 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
a130: 65 72 6d 73 20 69 6e 20 74 68 65 20 77 68 65 72  erms in the wher
a140: 65 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 74 68  e.  ** clause th
a150: 61 74 20 72 65 66 65 72 20 74 6f 20 74 68 65 20  at refer to the 
a160: 52 4f 57 49 44 2c 20 74 68 65 6e 20 77 65 20 77  ROWID, then we w
a170: 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 61 62 6c  ill never be abl
a180: 65 20 74 6f 20 64 6f 0a 20 20 2a 2a 20 61 6e 79  e to do.  ** any
a190: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
a1a0: 20 61 20 66 75 6c 6c 20 74 61 62 6c 65 20 73 63   a full table sc
a1b0: 61 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65  an on this table
a1c0: 2e 20 20 57 65 20 6d 69 67 68 74 20 61 73 0a 20  .  We might as. 
a1d0: 20 2a 2a 20 77 65 6c 6c 20 70 75 74 20 69 74 20   ** well put it 
a1e0: 66 69 72 73 74 20 69 6e 20 74 68 65 20 6a 6f 69  first in the joi
a1f0: 6e 20 6f 72 64 65 72 2e 20 20 54 68 61 74 20 77  n order.  That w
a200: 61 79 2c 20 70 65 72 68 61 70 73 20 69 74 20 63  ay, perhaps it c
a210: 61 6e 20 62 65 0a 20 20 2a 2a 20 72 65 66 65 72  an be.  ** refer
a220: 65 6e 63 65 64 20 62 79 20 6f 74 68 65 72 20 74  enced by other t
a230: 61 62 6c 65 73 20 69 6e 20 74 68 65 20 6a 6f 69  ables in the joi
a240: 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  n..  */.  if( pP
a250: 72 6f 62 65 3d 3d 30 20 26 26 0a 20 20 20 20 20  robe==0 &&.     
a260: 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69 43  findTerm(pWC, iC
a270: 75 72 2c 20 2d 31 2c 20 30 2c 20 57 4f 5f 45 51  ur, -1, 0, WO_EQ
a280: 7c 57 4f 5f 49 4e 7c 57 4f 5f 4c 54 7c 57 4f 5f  |WO_IN|WO_LT|WO_
a290: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 30  LE|WO_GT|WO_GE,0
a2a0: 29 3d 3d 30 20 26 26 0a 20 20 20 20 20 28 70 4f  )==0 &&.     (pO
a2b0: 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 21 73 6f  rderBy==0 || !so
a2c0: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43  rtableByRowid(iC
a2d0: 75 72 2c 20 70 4f 72 64 65 72 42 79 2c 20 26 72  ur, pOrderBy, &r
a2e0: 65 76 29 29 20 29 7b 0a 20 20 20 20 2a 70 46 6c  ev)) ){.    *pFl
a2f0: 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 2a 70 70  ags = 0;.    *pp
a300: 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 2a  Index = 0;.    *
a310: 70 6e 45 71 20 3d 20 30 3b 0a 20 20 20 20 72 65  pnEq = 0;.    re
a320: 74 75 72 6e 20 30 2e 30 3b 0a 20 20 7d 0a 0a 20  turn 0.0;.  }.. 
a330: 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 61 20   /* Check for a 
a340: 72 6f 77 69 64 3d 45 58 50 52 20 6f 72 20 72 6f  rowid=EXPR or ro
a350: 77 69 64 20 49 4e 20 28 2e 2e 2e 29 20 63 6f 6e  wid IN (...) con
a360: 73 74 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20  straints.  */.  
a370: 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
a380: 28 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (pWC, iCur, -1, 
a390: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
a3a0: 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 69 66 28  WO_IN, 0);.  if(
a3b0: 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20 45 78   pTerm ){.    Ex
a3c0: 70 72 20 2a 70 45 78 70 72 3b 0a 20 20 20 20 2a  pr *pExpr;.    *
a3d0: 70 70 49 6e 64 65 78 20 3d 20 30 3b 0a 20 20 20  ppIndex = 0;.   
a3e0: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 57 48 45   bestFlags = WHE
a3f0: 52 45 5f 52 4f 57 49 44 5f 45 51 3b 0a 20 20 20  RE_ROWID_EQ;.   
a400: 20 69 66 28 20 70 54 65 72 6d 2d 3e 65 4f 70 65   if( pTerm->eOpe
a410: 72 61 74 6f 72 20 26 20 57 4f 5f 45 51 20 29 7b  rator & WO_EQ ){
a420: 0a 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 3d  .      /* Rowid=
a430: 3d 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  = is always the 
a440: 62 65 73 74 20 70 69 63 6b 2e 20 20 4c 6f 6f 6b  best pick.  Look
a450: 20 6e 6f 20 66 75 72 74 68 65 72 2e 20 20 42 65   no further.  Be
a460: 63 61 75 73 65 20 6f 6e 6c 79 0a 20 20 20 20 20  cause only.     
a470: 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20 72 6f 77   ** a single row
a480: 20 69 73 20 67 65 6e 65 72 61 74 65 64 2c 20 6f   is generated, o
a490: 75 74 70 75 74 20 69 73 20 61 6c 77 61 79 73 20  utput is always 
a4a0: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 20  in sorted order 
a4b0: 2a 2f 0a 20 20 20 20 20 20 2a 70 46 6c 61 67 73  */.      *pFlags
a4c0: 20 3d 20 57 48 45 52 45 5f 52 4f 57 49 44 5f 45   = WHERE_ROWID_E
a4d0: 51 20 7c 20 57 48 45 52 45 5f 55 4e 49 51 55 45  Q | WHERE_UNIQUE
a4e0: 3b 0a 20 20 20 20 20 20 2a 70 6e 45 71 20 3d 20  ;.      *pnEq = 
a4f0: 31 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28  1;.      TRACE((
a500: 22 2e 2e 2e 20 62 65 73 74 20 69 73 20 72 6f 77  "... best is row
a510: 69 64 5c 6e 22 29 29 3b 0a 20 20 20 20 20 20 72  id\n"));.      r
a520: 65 74 75 72 6e 20 30 2e 30 3b 0a 20 20 20 20 7d  eturn 0.0;.    }
a530: 65 6c 73 65 20 69 66 28 20 28 70 45 78 70 72 20  else if( (pExpr 
a540: 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 29 2d  = pTerm->pExpr)-
a550: 3e 70 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  >pList!=0 ){.   
a560: 20 20 20 2f 2a 20 52 6f 77 69 64 20 49 4e 20 28     /* Rowid IN (
a570: 4c 49 53 54 29 3a 20 63 6f 73 74 20 69 73 20 4e  LIST): cost is N
a580: 6c 6f 67 4e 20 77 68 65 72 65 20 4e 20 69 73 20  logN where N is 
a590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6c 69  the number of li
a5a0: 73 74 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  st.      ** elem
a5b0: 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
a5c0: 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20 70 45 78  lowestCost = pEx
a5d0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
a5e0: 3b 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  ;.      lowestCo
a5f0: 73 74 20 2a 3d 20 65 73 74 4c 6f 67 28 6c 6f 77  st *= estLog(low
a600: 65 73 74 43 6f 73 74 29 3b 0a 20 20 20 20 7d 65  estCost);.    }e
a610: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 52 6f  lse{.      /* Ro
a620: 77 69 64 20 49 4e 20 28 53 45 4c 45 43 54 29 3a  wid IN (SELECT):
a630: 20 63 6f 73 74 20 69 73 20 4e 6c 6f 67 4e 20 77   cost is NlogN w
a640: 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e 75  here N is the nu
a650: 6d 62 65 72 20 6f 66 20 72 6f 77 73 0a 20 20 20  mber of rows.   
a660: 20 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 65 73     ** in the res
a670: 75 6c 74 20 6f 66 20 74 68 65 20 69 6e 6e 65 72  ult of the inner
a680: 20 73 65 6c 65 63 74 2e 20 20 57 65 20 68 61 76   select.  We hav
a690: 65 20 6e 6f 20 77 61 79 20 74 6f 20 65 73 74 69  e no way to esti
a6a0: 6d 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  mate.      ** th
a6b0: 61 74 20 76 61 6c 75 65 20 73 6f 20 6d 61 6b 65  at value so make
a6c0: 20 61 20 77 69 6c 64 20 67 75 65 73 73 2e 20 2a   a wild guess. *
a6d0: 2f 0a 20 20 20 20 20 20 6c 6f 77 65 73 74 43 6f  /.      lowestCo
a6e0: 73 74 20 3d 20 32 30 30 3b 0a 20 20 20 20 7d 0a  st = 200;.    }.
a6f0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 20      TRACE(("... 
a700: 72 6f 77 69 64 20 49 4e 20 63 6f 73 74 3a 20 25  rowid IN cost: %
a710: 2e 39 67 5c 6e 22 2c 20 6c 6f 77 65 73 74 43 6f  .9g\n", lowestCo
a720: 73 74 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  st));.  }..  /* 
a730: 45 73 74 69 6d 61 74 65 20 74 68 65 20 63 6f 73  Estimate the cos
a740: 74 20 6f 66 20 61 20 74 61 62 6c 65 20 73 63 61  t of a table sca
a750: 6e 2e 20 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  n.  If we do not
a760: 20 6b 6e 6f 77 20 68 6f 77 20 6d 61 6e 79 0a 20   know how many. 
a770: 20 2a 2a 20 65 6e 74 72 69 65 73 20 61 72 65 20   ** entries are 
a780: 69 6e 20 74 68 65 20 74 61 62 6c 65 2c 20 75 73  in the table, us
a790: 65 20 31 20 6d 69 6c 6c 69 6f 6e 20 61 73 20 61  e 1 million as a
a7a0: 20 67 75 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 63   guess..  */.  c
a7b0: 6f 73 74 20 3d 20 70 50 72 6f 62 65 20 3f 20 70  ost = pProbe ? p
a7c0: 50 72 6f 62 65 2d 3e 61 69 52 6f 77 45 73 74 5b  Probe->aiRowEst[
a7d0: 30 5d 20 3a 20 31 30 30 30 30 30 30 3b 0a 20 20  0] : 1000000;.  
a7e0: 54 52 41 43 45 28 28 22 2e 2e 2e 20 74 61 62 6c  TRACE(("... tabl
a7f0: 65 20 73 63 61 6e 20 62 61 73 65 20 63 6f 73 74  e scan base cost
a800: 3a 20 25 2e 39 67 5c 6e 22 2c 20 63 6f 73 74 29  : %.9g\n", cost)
a810: 29 3b 0a 20 20 66 6c 61 67 73 20 3d 20 57 48 45  );.  flags = WHE
a820: 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 3b 0a  RE_ROWID_RANGE;.
a830: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
a840: 63 6f 6e 73 74 72 61 69 6e 74 73 20 6f 6e 20 61  constraints on a
a850: 20 72 61 6e 67 65 20 6f 66 20 72 6f 77 69 64 73   range of rowids
a860: 20 69 6e 20 61 20 74 61 62 6c 65 20 73 63 61 6e   in a table scan
a870: 2e 0a 20 20 2a 2f 0a 20 20 70 54 65 72 6d 20 3d  ..  */.  pTerm =
a880: 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20 69   findTerm(pWC, i
a890: 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65 61 64  Cur, -1, notRead
a8a0: 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 7c 57  y, WO_LT|WO_LE|W
a8b0: 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20 30 29 3b 0a  O_GT|WO_GE, 0);.
a8c0: 20 20 69 66 28 20 70 54 65 72 6d 20 29 7b 0a 20    if( pTerm ){. 
a8d0: 20 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28     if( findTerm(
a8e0: 70 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e  pWC, iCur, -1, n
a8f0: 6f 74 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57  otReady, WO_LT|W
a900: 4f 5f 4c 45 2c 20 30 29 20 29 7b 0a 20 20 20 20  O_LE, 0) ){.    
a910: 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45    flags |= WHERE
a920: 5f 54 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20  _TOP_LIMIT;.    
a930: 20 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a    cost /= 3;  /*
a940: 20 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69   Guess that rowi
a950: 64 3c 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65  d<EXPR eliminate
a960: 73 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 72 20  s two-thirds or 
a970: 72 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  rows */.    }.  
a980: 20 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70    if( findTerm(p
a990: 57 43 2c 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f  WC, iCur, -1, no
a9a0: 74 52 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f  tReady, WO_GT|WO
a9b0: 5f 47 45 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  _GE, 0) ){.     
a9c0: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
a9d0: 42 54 4d 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20  BTM_LIMIT;.     
a9e0: 20 63 6f 73 74 20 2f 3d 20 33 3b 20 20 2f 2a 20   cost /= 3;  /* 
a9f0: 47 75 65 73 73 20 74 68 61 74 20 72 6f 77 69 64  Guess that rowid
aa00: 3e 45 58 50 52 20 65 6c 69 6d 69 6e 61 74 65 73  >EXPR eliminates
aa10: 20 74 77 6f 2d 74 68 69 72 64 73 20 6f 66 20 72   two-thirds of r
aa20: 6f 77 73 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ows */.    }.   
aa30: 20 54 52 41 43 45 28 28 22 2e 2e 2e 20 72 6f 77   TRACE(("... row
aa40: 69 64 20 72 61 6e 67 65 20 72 65 64 75 63 65 73  id range reduces
aa50: 20 63 6f 73 74 20 74 6f 20 25 2e 39 67 5c 6e 22   cost to %.9g\n"
aa60: 2c 20 63 6f 73 74 29 29 3b 0a 20 20 7d 65 6c 73  , cost));.  }els
aa70: 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 3d 20 30  e{.    flags = 0
aa80: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
aa90: 68 65 20 74 61 62 6c 65 20 73 63 61 6e 20 64 6f  he table scan do
aaa0: 65 73 20 6e 6f 74 20 73 61 74 69 73 66 79 20 74  es not satisfy t
aab0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
aac0: 73 65 2c 20 69 6e 63 72 65 61 73 65 0a 20 20 2a  se, increase.  *
aad0: 2a 20 74 68 65 20 63 6f 73 74 20 62 79 20 4e 6c  * the cost by Nl
aae0: 6f 67 4e 20 74 6f 20 63 6f 76 65 72 20 74 68 65  ogN to cover the
aaf0: 20 65 78 70 65 6e 73 65 20 6f 66 20 73 6f 72 74   expense of sort
ab00: 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4f  ing. */.  if( pO
ab10: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 69 66  rderBy ){.    if
ab20: 28 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69  ( sortableByRowi
ab30: 64 28 69 43 75 72 2c 20 70 4f 72 64 65 72 42 79  d(iCur, pOrderBy
ab40: 2c 20 26 72 65 76 29 20 29 7b 0a 20 20 20 20 20  , &rev) ){.     
ab50: 20 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f   flags |= WHERE_
ab60: 4f 52 44 45 52 42 59 7c 57 48 45 52 45 5f 52 4f  ORDERBY|WHERE_RO
ab70: 57 49 44 5f 52 41 4e 47 45 3b 0a 20 20 20 20 20  WID_RANGE;.     
ab80: 20 69 66 28 20 72 65 76 20 29 7b 0a 20 20 20 20   if( rev ){.    
ab90: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
aba0: 52 45 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  RE_REVERSE;.    
abb0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
abc0: 20 20 20 20 20 63 6f 73 74 20 2b 3d 20 63 6f 73       cost += cos
abd0: 74 2a 65 73 74 4c 6f 67 28 63 6f 73 74 29 3b 0a  t*estLog(cost);.
abe0: 20 20 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e        TRACE(("..
abf0: 2e 20 73 6f 72 74 69 6e 67 20 69 6e 63 72 65 61  . sorting increa
ac00: 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39 67  ses cost to %.9g
ac10: 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20 20  \n", cost));.   
ac20: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 63 6f 73   }.  }.  if( cos
ac30: 74 3c 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  t<lowestCost ){.
ac40: 20 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d      lowestCost =
ac50: 20 63 6f 73 74 3b 0a 20 20 20 20 62 65 73 74 46   cost;.    bestF
ac60: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
ac70: 7d 0a 0a 20 20 2f 2a 20 4c 6f 6f 6b 20 61 74 20  }..  /* Look at 
ac80: 65 61 63 68 20 69 6e 64 65 78 2e 0a 20 20 2a 2f  each index..  */
ac90: 0a 20 20 66 6f 72 28 3b 20 70 50 72 6f 62 65 3b  .  for(; pProbe;
aca0: 20 70 50 72 6f 62 65 3d 70 50 72 6f 62 65 2d 3e   pProbe=pProbe->
acb0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
acc0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
acd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ace0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
acf0: 64 6f 75 62 6c 65 20 69 6e 4d 75 6c 74 69 70 6c  double inMultipl
ad00: 69 65 72 20 3d 20 31 3b 0a 0a 20 20 20 20 54 52  ier = 1;..    TR
ad10: 41 43 45 28 28 22 2e 2e 2e 20 69 6e 64 65 78 20  ACE(("... index 
ad20: 25 73 3a 5c 6e 22 2c 20 70 50 72 6f 62 65 2d 3e  %s:\n", pProbe->
ad30: 7a 4e 61 6d 65 29 29 3b 0a 0a 20 20 20 20 2f 2a  zName));..    /*
ad40: 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
ad50: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
ad60: 74 68 65 20 69 6e 64 65 78 20 74 68 61 74 20 61  the index that a
ad70: 72 65 20 73 61 74 69 73 66 69 65 64 0a 20 20 20  re satisfied.   
ad80: 20 2a 2a 20 62 79 20 78 3d 45 58 50 52 20 63 6f   ** by x=EXPR co
ad90: 6e 73 74 72 61 69 6e 74 73 20 6f 72 20 78 20 49  nstraints or x I
ada0: 4e 20 28 2e 2e 2e 29 20 63 6f 6e 73 74 72 61 69  N (...) constrai
adb0: 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nts..    */.    
adc0: 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 66  flags = 0;.    f
add0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 72 6f 62 65  or(i=0; i<pProbe
ade0: 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69 2b 2b 29 7b  ->nColumn; i++){
adf0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d 20 70  .      int j = p
ae00: 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  Probe->aiColumn[
ae10: 69 5d 3b 0a 20 20 20 20 20 20 70 54 65 72 6d 20  i];.      pTerm 
ae20: 3d 20 66 69 6e 64 54 65 72 6d 28 70 57 43 2c 20  = findTerm(pWC, 
ae30: 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52 65 61 64  iCur, j, notRead
ae40: 79 2c 20 57 4f 5f 45 51 7c 57 4f 5f 49 4e 2c 20  y, WO_EQ|WO_IN, 
ae50: 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69  pProbe);.      i
ae60: 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 20 62 72  f( pTerm==0 ) br
ae70: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6c 61 67 73  eak;.      flags
ae80: 20 7c 3d 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e   |= WHERE_COLUMN
ae90: 5f 45 51 3b 0a 20 20 20 20 20 20 69 66 28 20 70  _EQ;.      if( p
aea0: 54 65 72 6d 2d 3e 65 4f 70 65 72 61 74 6f 72 20  Term->eOperator 
aeb0: 26 20 57 4f 5f 49 4e 20 29 7b 0a 20 20 20 20 20  & WO_IN ){.     
aec0: 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d     Expr *pExpr =
aed0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
aee0: 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
aef0: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 3b  WHERE_COLUMN_IN;
af00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
af10: 70 72 2d 3e 70 53 65 6c 65 63 74 21 3d 30 20 29  pr->pSelect!=0 )
af20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 4d 75  {.          inMu
af30: 6c 74 69 70 6c 69 65 72 20 2a 3d 20 32 35 3b 0a  ltiplier *= 25;.
af40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
af50: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 21 3d  ( pExpr->pList!=
af60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
af70: 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 3d 20 70  nMultiplier *= p
af80: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
af90: 70 72 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  pr + 1;.        
afa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
afb0: 20 20 20 20 63 6f 73 74 20 3d 20 70 50 72 6f 62      cost = pProb
afc0: 65 2d 3e 61 69 52 6f 77 45 73 74 5b 69 5d 20 2a  e->aiRowEst[i] *
afd0: 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72 20 2a 20   inMultiplier * 
afe0: 65 73 74 4c 6f 67 28 69 6e 4d 75 6c 74 69 70 6c  estLog(inMultipl
aff0: 69 65 72 29 3b 0a 20 20 20 20 6e 45 71 20 3d 20  ier);.    nEq = 
b000: 69 3b 0a 20 20 20 20 69 66 28 20 70 50 72 6f 62  i;.    if( pProb
b010: 65 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e  e->onError!=OE_N
b020: 6f 6e 65 20 26 26 20 28 66 6c 61 67 73 20 26 20  one && (flags & 
b030: 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 49 4e 29  WHERE_COLUMN_IN)
b040: 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==0.         && 
b050: 6e 45 71 3d 3d 70 50 72 6f 62 65 2d 3e 6e 43 6f  nEq==pProbe->nCo
b060: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 66 6c  lumn ){.      fl
b070: 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 55 4e 49  ags |= WHERE_UNI
b080: 51 55 45 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  QUE;.    }.    T
b090: 52 41 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 6e 45  RACE(("...... nE
b0a0: 71 3d 25 64 20 69 6e 4d 75 6c 74 3d 25 2e 39 67  q=%d inMult=%.9g
b0b0: 20 63 6f 73 74 3d 25 2e 39 67 5c 6e 22 2c 20 6e   cost=%.9g\n", n
b0c0: 45 71 2c 20 69 6e 4d 75 6c 74 69 70 6c 69 65 72  Eq, inMultiplier
b0d0: 2c 20 63 6f 73 74 29 29 3b 0a 0a 20 20 20 20 2f  , cost));..    /
b0e0: 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 61 6e 67 65  * Look for range
b0f0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20   constraints.   
b100: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 45 71 3c   */.    if( nEq<
b110: 70 50 72 6f 62 65 2d 3e 6e 43 6f 6c 75 6d 6e 20  pProbe->nColumn 
b120: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 20 3d  ){.      int j =
b130: 20 70 50 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d   pProbe->aiColum
b140: 6e 5b 6e 45 71 5d 3b 0a 20 20 20 20 20 20 70 54  n[nEq];.      pT
b150: 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d 28 70  erm = findTerm(p
b160: 57 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74  WC, iCur, j, not
b170: 52 65 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f  Ready, WO_LT|WO_
b180: 4c 45 7c 57 4f 5f 47 54 7c 57 4f 5f 47 45 2c 20  LE|WO_GT|WO_GE, 
b190: 70 50 72 6f 62 65 29 3b 0a 20 20 20 20 20 20 69  pProbe);.      i
b1a0: 66 28 20 70 54 65 72 6d 20 29 7b 0a 20 20 20 20  f( pTerm ){.    
b1b0: 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48 45      flags |= WHE
b1c0: 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47 45 3b  RE_COLUMN_RANGE;
b1d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 69 6e  .        if( fin
b1e0: 64 54 65 72 6d 28 70 57 43 2c 20 69 43 75 72 2c  dTerm(pWC, iCur,
b1f0: 20 6a 2c 20 6e 6f 74 52 65 61 64 79 2c 20 57 4f   j, notReady, WO
b200: 5f 4c 54 7c 57 4f 5f 4c 45 2c 20 70 50 72 6f 62  _LT|WO_LE, pProb
b210: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  e) ){.          
b220: 66 6c 61 67 73 20 7c 3d 20 57 48 45 52 45 5f 54  flags |= WHERE_T
b230: 4f 50 5f 4c 49 4d 49 54 3b 0a 20 20 20 20 20 20  OP_LIMIT;.      
b240: 20 20 20 20 63 6f 73 74 20 2f 3d 20 33 3b 0a 20      cost /= 3;. 
b250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b260: 20 69 66 28 20 66 69 6e 64 54 65 72 6d 28 70 57   if( findTerm(pW
b270: 43 2c 20 69 43 75 72 2c 20 6a 2c 20 6e 6f 74 52  C, iCur, j, notR
b280: 65 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47  eady, WO_GT|WO_G
b290: 45 2c 20 70 50 72 6f 62 65 29 20 29 7b 0a 20 20  E, pProbe) ){.  
b2a0: 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
b2b0: 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49 54   WHERE_BTM_LIMIT
b2c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 73 74  ;.          cost
b2d0: 20 2f 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 7d   /= 3;.        }
b2e0: 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
b2f0: 22 2e 2e 2e 2e 2e 2e 20 72 61 6e 67 65 20 72 65  "...... range re
b300: 64 75 63 65 73 20 63 6f 73 74 20 74 6f 20 25 2e  duces cost to %.
b310: 39 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20  9g\n", cost));. 
b320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
b330: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 64 64    /* Add the add
b340: 69 74 69 6f 6e 61 6c 20 63 6f 73 74 20 6f 66 20  itional cost of 
b350: 73 6f 72 74 69 6e 67 20 69 66 20 74 68 61 74 20  sorting if that 
b360: 69 73 20 61 20 66 61 63 74 6f 72 2e 0a 20 20 20  is a factor..   
b370: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4f 72 64   */.    if( pOrd
b380: 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20 69 66  erBy ){.      if
b390: 28 20 28 66 6c 61 67 73 20 26 20 57 48 45 52 45  ( (flags & WHERE
b3a0: 5f 43 4f 4c 55 4d 4e 5f 49 4e 29 3d 3d 30 20 26  _COLUMN_IN)==0 &
b3b0: 26 0a 20 20 20 20 20 20 20 20 20 20 20 69 73 53  &.           isS
b3c0: 6f 72 74 69 6e 67 49 6e 64 65 78 28 70 50 61 72  ortingIndex(pPar
b3d0: 73 65 2c 70 50 72 6f 62 65 2c 69 43 75 72 2c 70  se,pProbe,iCur,p
b3e0: 4f 72 64 65 72 42 79 2c 6e 45 71 2c 26 72 65 76  OrderBy,nEq,&rev
b3f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
b400: 20 66 6c 61 67 73 3d 3d 30 20 29 7b 0a 20 20 20   flags==0 ){.   
b410: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
b420: 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f 52 41 4e 47  HERE_COLUMN_RANG
b430: 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  E;.        }.   
b440: 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 57 48       flags |= WH
b450: 45 52 45 5f 4f 52 44 45 52 42 59 3b 0a 20 20 20  ERE_ORDERBY;.   
b460: 20 20 20 20 20 69 66 28 20 72 65 76 20 29 7b 0a       if( rev ){.
b470: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
b480: 7c 3d 20 57 48 45 52 45 5f 52 45 56 45 52 53 45  |= WHERE_REVERSE
b490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b4a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b4b0: 20 63 6f 73 74 20 2b 3d 20 63 6f 73 74 2a 65 73   cost += cost*es
b4c0: 74 4c 6f 67 28 63 6f 73 74 29 3b 0a 20 20 20 20  tLog(cost);.    
b4d0: 20 20 20 20 54 52 41 43 45 28 28 22 2e 2e 2e 2e      TRACE(("....
b4e0: 2e 2e 20 6f 72 64 65 72 62 79 20 69 6e 63 72 65  .. orderby incre
b4f0: 61 73 65 73 20 63 6f 73 74 20 74 6f 20 25 2e 39  ases cost to %.9
b500: 67 5c 6e 22 2c 20 63 6f 73 74 29 29 3b 0a 20 20  g\n", cost));.  
b510: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
b520: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
b530: 20 69 66 20 77 65 20 63 61 6e 20 67 65 74 20 61   if we can get a
b540: 77 61 79 20 77 69 74 68 20 75 73 69 6e 67 20 6a  way with using j
b550: 75 73 74 20 74 68 65 20 69 6e 64 65 78 20 77 69  ust the index wi
b560: 74 68 6f 75 74 0a 20 20 20 20 2a 2a 20 65 76 65  thout.    ** eve
b570: 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 61  r reading the ta
b580: 62 6c 65 2e 20 20 49 66 20 74 68 61 74 20 69 73  ble.  If that is
b590: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
b5a0: 68 61 6c 76 65 20 74 68 65 0a 20 20 20 20 2a 2a  halve the.    **
b5b0: 20 63 6f 73 74 20 6f 66 20 74 68 69 73 20 69 6e   cost of this in
b5c0: 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  dex..    */.    
b5d0: 69 66 28 20 66 6c 61 67 73 20 26 26 20 70 53 72  if( flags && pSr
b5e0: 63 2d 3e 63 6f 6c 55 73 65 64 20 3c 20 28 28 28  c->colUsed < (((
b5f0: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 42 4d 53  Bitmask)1)<<(BMS
b600: 2d 31 29 29 20 29 7b 0a 20 20 20 20 20 20 42 69  -1)) ){.      Bi
b610: 74 6d 61 73 6b 20 6d 20 3d 20 70 53 72 63 2d 3e  tmask m = pSrc->
b620: 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20 69  colUsed;.      i
b630: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt j;.      for(
b640: 6a 3d 30 3b 20 6a 3c 70 50 72 6f 62 65 2d 3e 6e  j=0; j<pProbe->n
b650: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
b660: 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 50        int x = pP
b670: 72 6f 62 65 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  robe->aiColumn[j
b680: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 78  ];.        if( x
b690: 3c 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20  <BMS-1 ){.      
b6a0: 20 20 20 20 6d 20 26 3d 20 7e 28 28 28 42 69 74      m &= ~(((Bit
b6b0: 6d 61 73 6b 29 31 29 3c 3c 78 29 3b 0a 20 20 20  mask)1)<<x);.   
b6c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b6d0: 20 20 20 20 20 69 66 28 20 6d 3d 3d 30 20 29 7b       if( m==0 ){
b6e0: 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c  .        flags |
b6f0: 3d 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c 59  = WHERE_IDX_ONLY
b700: 3b 0a 20 20 20 20 20 20 20 20 63 6f 73 74 20 2f  ;.        cost /
b710: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 2;.        TRA
b720: 43 45 28 28 22 2e 2e 2e 2e 2e 2e 20 69 64 78 2d  CE(("...... idx-
b730: 6f 6e 6c 79 20 72 65 64 75 63 65 73 20 63 6f 73  only reduces cos
b740: 74 20 74 6f 20 25 2e 39 67 5c 6e 22 2c 20 63 6f  t to %.9g\n", co
b750: 73 74 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  st));.      }.  
b760: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b770: 68 69 73 20 69 6e 64 65 78 20 68 61 73 20 61 63  his index has ac
b780: 68 69 65 76 65 64 20 74 68 65 20 6c 6f 77 65 73  hieved the lowes
b790: 74 20 63 6f 73 74 20 73 6f 20 66 61 72 2c 20 74  t cost so far, t
b7a0: 68 65 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20  hen use it..    
b7b0: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 73 74 20  */.    if( cost 
b7c0: 3c 20 6c 6f 77 65 73 74 43 6f 73 74 20 29 7b 0a  < lowestCost ){.
b7d0: 20 20 20 20 20 20 62 65 73 74 49 64 78 20 3d 20        bestIdx = 
b7e0: 70 50 72 6f 62 65 3b 0a 20 20 20 20 20 20 6c 6f  pProbe;.      lo
b7f0: 77 65 73 74 43 6f 73 74 20 3d 20 63 6f 73 74 3b  westCost = cost;
b800: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
b810: 6c 61 67 73 21 3d 30 20 29 3b 0a 20 20 20 20 20  lags!=0 );.     
b820: 20 62 65 73 74 46 6c 61 67 73 20 3d 20 66 6c 61   bestFlags = fla
b830: 67 73 3b 0a 20 20 20 20 20 20 62 65 73 74 4e 45  gs;.      bestNE
b840: 71 20 3d 20 6e 45 71 3b 0a 20 20 20 20 7d 0a 20  q = nEq;.    }. 
b850: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
b860: 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 0a  the best result.
b870: 20 20 2a 2f 0a 20 20 2a 70 70 49 6e 64 65 78 20    */.  *ppIndex 
b880: 3d 20 62 65 73 74 49 64 78 3b 0a 20 20 54 52 41  = bestIdx;.  TRA
b890: 43 45 28 28 22 62 65 73 74 20 69 6e 64 65 78 20  CE(("best index 
b8a0: 69 73 20 25 73 2c 20 63 6f 73 74 3d 25 2e 39 67  is %s, cost=%.9g
b8b0: 2c 20 66 6c 61 67 73 3d 25 78 2c 20 6e 45 71 3d  , flags=%x, nEq=
b8c0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 62  %d\n",.        b
b8d0: 65 73 74 49 64 78 20 3f 20 62 65 73 74 49 64 78  estIdx ? bestIdx
b8e0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 28 6e 6f 6e 65  ->zName : "(none
b8f0: 29 22 2c 20 6c 6f 77 65 73 74 43 6f 73 74 2c 20  )", lowestCost, 
b900: 62 65 73 74 46 6c 61 67 73 2c 20 62 65 73 74 4e  bestFlags, bestN
b910: 45 71 29 29 3b 0a 20 20 2a 70 46 6c 61 67 73 20  Eq));.  *pFlags 
b920: 3d 20 62 65 73 74 46 6c 61 67 73 3b 0a 20 20 2a  = bestFlags;.  *
b930: 70 6e 45 71 20 3d 20 62 65 73 74 4e 45 71 3b 0a  pnEq = bestNEq;.
b940: 20 20 72 65 74 75 72 6e 20 6c 6f 77 65 73 74 43    return lowestC
b950: 6f 73 74 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44  ost;.}.../*.** D
b960: 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69 6e  isable a term in
b970: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
b980: 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20 6e  e.  Except, do n
b990: 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20 74  ot disable the t
b9a0: 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e  erm.** if it con
b9b0: 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55 54  trols a LEFT OUT
b9c0: 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64  ER JOIN and it d
b9d0: 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65  id not originate
b9e0: 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72   in the ON.** or
b9f0: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f 66   USING clause of
ba00: 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a   that join..**.*
ba10: 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20 74  * Consider the t
ba20: 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e  erm t2.z='ok' in
ba30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71   the following q
ba40: 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ueries:.**.**   
ba50: 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52  (1)  SELECT * FR
ba60: 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20  OM t1 LEFT JOIN 
ba70: 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20  t2 ON t1.a=t2.x 
ba80: 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a  WHERE t2.z='ok'.
ba90: 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43 54  **   (2)  SELECT
baa0: 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54 20   * FROM t1 LEFT 
bab0: 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d  JOIN t2 ON t1.a=
bac0: 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f  t2.x AND t2.z='o
bad0: 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45 4c  k'.**   (3)  SEL
bae0: 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74  ECT * FROM t1, t
baf0: 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32 2e  2 WHERE t1.a=t2.
bb00: 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
bb10: 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27  **.** The t2.z='
bb20: 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64 20  ok' is disabled 
bb30: 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62 65  in the in (2) be
bb40: 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e 61  cause it origina
bb50: 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e  tes.** in the ON
bb60: 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74 65   clause.  The te
bb70: 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  rm is disabled i
bb80: 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69 74  n (3) because it
bb90: 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20   is not part.** 
bba0: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
bbb0: 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74  JOIN.  In (1), t
bbc0: 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 64  he term is not d
bbd0: 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44  isabled..**.** D
bbe0: 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d 20  isabling a term 
bbf0: 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72 6d  causes that term
bc00: 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74 65   to not be teste
bc10: 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c  d in the inner l
bc20: 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f  oop.** of the jo
bc30: 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20 69  in.  Disabling i
bc40: 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f  s an optimizatio
bc50: 6e 2e 20 20 57 68 65 6e 20 74 65 72 6d 73 20 61  n.  When terms a
bc60: 72 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  re satisfied.** 
bc70: 62 79 20 69 6e 64 69 63 65 73 2c 20 77 65 20 64  by indices, we d
bc80: 69 73 61 62 6c 65 20 74 68 65 6d 20 74 6f 20 70  isable them to p
bc90: 72 65 76 65 6e 74 20 72 65 64 75 6e 64 61 6e 74  revent redundant
bca0: 20 74 65 73 74 73 20 69 6e 20 74 68 65 20 69 6e   tests in the in
bcb0: 6e 65 72 0a 2a 2a 20 6c 6f 6f 70 2e 20 20 57 65  ner.** loop.  We
bcc0: 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
bcd0: 6f 72 72 65 63 74 20 72 65 73 75 6c 74 73 20 69  orrect results i
bce0: 66 20 6e 6f 74 68 69 6e 67 20 77 65 72 65 20 65  f nothing were e
bcf0: 76 65 72 20 64 69 73 61 62 6c 65 64 2c 0a 2a 2a  ver disabled,.**
bd00: 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
bd10: 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20 73 6c   run a little sl
bd20: 6f 77 65 72 2e 20 20 54 68 65 20 74 72 69 63 6b  ower.  The trick
bd30: 20 69 73 20 74 6f 20 64 69 73 61 62 6c 65 20 61   is to disable a
bd40: 73 20 6d 75 63 68 0a 2a 2a 20 61 73 20 77 65 20  s much.** as we 
bd50: 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
bd60: 62 6c 69 6e 67 20 74 6f 6f 20 6d 75 63 68 2e 20  bling too much. 
bd70: 20 49 66 20 77 65 20 64 69 73 61 62 6c 65 64 20   If we disabled 
bd80: 69 6e 20 28 31 29 2c 20 77 65 27 64 20 67 65 74  in (1), we'd get
bd90: 0a 2a 2a 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  .** the wrong an
bda0: 73 77 65 72 2e 20 20 53 65 65 20 74 69 63 6b 65  swer.  See ticke
bdb0: 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61 74 69  t #813..*/.stati
bdc0: 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 54 65  c void disableTe
bdd0: 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20 2a 70  rm(WhereLevel *p
bde0: 4c 65 76 65 6c 2c 20 57 68 65 72 65 54 65 72 6d  Level, WhereTerm
bdf0: 20 2a 70 54 65 72 6d 29 7b 0a 20 20 69 66 28 20   *pTerm){.  if( 
be00: 70 54 65 72 6d 0a 20 20 20 20 20 20 26 26 20 28  pTerm.      && (
be10: 70 54 65 72 6d 2d 3e 66 6c 61 67 73 20 26 20 54  pTerm->flags & T
be20: 45 52 4d 5f 43 4f 44 45 44 29 3d 3d 30 0a 20 20  ERM_CODED)==0.  
be30: 20 20 20 20 26 26 20 28 70 4c 65 76 65 6c 2d 3e      && (pLevel->
be40: 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
be50: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
be60: 70 54 65 72 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pTerm->pExpr, EP
be70: 5f 46 72 6f 6d 4a 6f 69 6e 29 29 0a 20 20 29 7b  _FromJoin)).  ){
be80: 0a 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c 61 67  .    pTerm->flag
be90: 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45 44 3b  s |= TERM_CODED;
bea0: 0a 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e  .    if( pTerm->
beb0: 69 50 61 72 65 6e 74 3e 3d 30 20 29 7b 0a 20 20  iParent>=0 ){.  
bec0: 20 20 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70      WhereTerm *p
bed0: 4f 74 68 65 72 20 3d 20 26 70 54 65 72 6d 2d 3e  Other = &pTerm->
bee0: 70 57 43 2d 3e 61 5b 70 54 65 72 6d 2d 3e 69 50  pWC->a[pTerm->iP
bef0: 61 72 65 6e 74 5d 3b 0a 20 20 20 20 20 20 69 66  arent];.      if
bf00: 28 20 28 2d 2d 70 4f 74 68 65 72 2d 3e 6e 43 68  ( (--pOther->nCh
bf10: 69 6c 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ild)==0 ){.     
bf20: 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70     disableTerm(p
bf30: 4c 65 76 65 6c 2c 20 70 4f 74 68 65 72 29 3b 0a  Level, pOther);.
bf40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
bf50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
bf60: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 62 75  ate code that bu
bf70: 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66 6f 72  ilds a probe for
bf80: 20 61 6e 20 69 6e 64 65 78 2e 20 20 44 65 74 61   an index.  Deta
bf90: 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  ils:.**.**    * 
bfa0: 20 43 68 65 63 6b 20 74 68 65 20 74 6f 70 20 6e   Check the top n
bfb0: 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f  Column entries o
bfc0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49 66  n the stack.  If
bfd0: 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66   any.**       of
bfe0: 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20 61   those entries a
bff0: 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d  re NULL, jump im
c000: 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 62 72 6b  mediately to brk
c010: 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63 68  ,.**       which
c020: 20 69 73 20 74 68 65 20 6c 6f 6f 70 20 65 78 69   is the loop exi
c030: 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65  t, since no inde
c040: 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74  x entry will mat
c050: 63 68 0a 2a 2a 20 20 20 20 20 20 20 69 66 20 61  ch.**       if a
c060: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ny part of the k
c070: 65 79 20 69 73 20 4e 55 4c 4c 2e 20 50 6f 70 20  ey is NULL. Pop 
c080: 28 6e 43 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 29  (nColumn+nExtra)
c090: 20 0a 2a 2a 20 20 20 20 20 20 20 65 6c 65 6d 65   .**       eleme
c0a0: 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  nts from the sta
c0b0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20  ck..**.**    *  
c0c0: 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f 62  Construct a prob
c0d0: 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  e entry from the
c0e0: 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65 6e 74   top nColumn ent
c0f0: 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20  ries in.**      
c100: 20 74 68 65 20 73 74 61 63 6b 20 77 69 74 68 20   the stack with 
c110: 61 66 66 69 6e 69 74 69 65 73 20 61 70 70 72 6f  affinities appro
c120: 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64 65 78  priate for index
c130: 20 70 49 64 78 2e 20 0a 2a 2a 20 20 20 20 20 20   pIdx. .**      
c140: 20 4f 6e 6c 79 20 6e 43 6f 6c 75 6d 6e 20 65 6c   Only nColumn el
c150: 65 6d 65 6e 74 73 20 61 72 65 20 70 6f 70 70 65  ements are poppe
c160: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
c170: 20 69 6e 20 74 68 69 73 20 63 61 73 65 0a 2a 2a   in this case.**
c180: 20 20 20 20 20 20 20 28 62 79 20 4f 50 5f 4d 61         (by OP_Ma
c190: 6b 65 52 65 63 6f 72 64 29 2e 0a 2a 2a 0a 2a 2f  keRecord)..**.*/
c1a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62 75 69  .static void bui
c1b0: 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 0a 20 20  ldIndexProbe(.  
c1c0: 56 64 62 65 20 2a 76 2c 20 0a 20 20 69 6e 74 20  Vdbe *v, .  int 
c1d0: 6e 43 6f 6c 75 6d 6e 2c 20 0a 20 20 69 6e 74 20  nColumn, .  int 
c1e0: 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62  nExtra, .  int b
c1f0: 72 6b 2c 20 0a 20 20 49 6e 64 65 78 20 2a 70 49  rk, .  Index *pI
c200: 64 78 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  dx.){.  sqlite3V
c210: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
c220: 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e  otNull, -nColumn
c230: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
c240: 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a  rentAddr(v)+3);.
c250: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c260: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43  Op(v, OP_Pop, nC
c270: 6f 6c 75 6d 6e 2b 6e 45 78 74 72 61 2c 20 30 29  olumn+nExtra, 0)
c280: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
c290: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
c2a0: 20 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69   0, brk);.  sqli
c2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c2c0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e  OP_MakeRecord, n
c2d0: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71  Column, 0);.  sq
c2e0: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
c2f0: 74 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a  tyStr(v, pIdx);.
c300: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  }.../*.** Genera
c310: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 73 69  te code for a si
c320: 6e 67 6c 65 20 65 71 75 61 6c 69 74 79 20 74 65  ngle equality te
c330: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
c340: 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75 61  clause.  An equa
c350: 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61 6e  lity.** term can
c360: 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78 70   be either X=exp
c370: 72 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e 29 2e  r or X IN (...).
c380: 20 20 20 70 54 65 72 6d 20 69 73 20 74 68 65 20     pTerm is the 
c390: 74 65 72 6d 20 74 6f 20 62 65 20 0a 2a 2a 20 63  term to be .** c
c3a0: 6f 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  oded..**.** The 
c3b0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 66 6f  current value fo
c3c0: 72 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74  r the constraint
c3d0: 20 69 73 20 6c 65 66 74 20 6f 6e 20 74 68 65 20   is left on the 
c3e0: 74 6f 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b  top of the stack
c3f0: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 63 6f  ..**.** For a co
c400: 6e 73 74 72 61 69 6e 74 20 6f 66 20 74 68 65 20  nstraint of the 
c410: 66 6f 72 6d 20 58 3d 65 78 70 72 2c 20 74 68 65  form X=expr, the
c420: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 65   expression is e
c430: 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69 74 73  valuated and its
c440: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 73 20 6c 65  .** result is le
c450: 66 74 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ft on the stack.
c460: 20 20 46 6f 72 20 63 6f 6e 73 74 72 61 69 6e 74    For constraint
c470: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 20  s of the form X 
c480: 49 4e 20 28 2e 2e 2e 29 0a 2a 2a 20 74 68 69 73  IN (...).** this
c490: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 75 70   routine sets up
c4a0: 20 61 20 6c 6f 6f 70 20 74 68 61 74 20 77 69 6c   a loop that wil
c4b0: 6c 20 69 74 65 72 61 74 65 20 6f 76 65 72 20 61  l iterate over a
c4c0: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 58 2e 0a  ll values of X..
c4d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
c4e0: 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28  odeEqualityTerm(
c4f0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c500: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
c510: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c520: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
c530: 65 72 6d 2c 20 20 20 2f 2a 20 54 68 65 20 74 65  erm,   /* The te
c540: 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  rm of the WHERE 
c550: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64  clause to be cod
c560: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c  ed */.  int brk,
c570: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a              /* J
c580: 75 6d 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e  ump here to aban
c590: 64 6f 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a  don the loop */.
c5a0: 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c    WhereLevel *pL
c5b0: 65 76 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65  evel  /* When le
c5c0: 76 65 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20  vel of the FROM 
c5d0: 63 6c 61 75 73 65 20 77 65 20 61 72 65 20 77 6f  clause we are wo
c5e0: 72 6b 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20  rking on */.){. 
c5f0: 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72   Expr *pX = pTer
c600: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 69 66 28 20  m->pExpr;.  if( 
c610: 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49 4e 20 29 7b  pX->op!=TK_IN ){
c620: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 58 2d  .    assert( pX-
c630: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
c640: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c650: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
c660: 69 67 68 74 29 3b 0a 23 69 66 6e 64 65 66 20 53  ight);.#ifndef S
c670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
c680: 45 52 59 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ERY.  }else{.   
c690: 20 69 6e 74 20 69 54 61 62 3b 0a 20 20 20 20 69   int iTab;.    i
c6a0: 6e 74 20 2a 61 49 6e 3b 0a 20 20 20 20 56 64 62  nt *aIn;.    Vdb
c6b0: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c6c0: 56 64 62 65 3b 0a 0a 20 20 20 20 73 71 6c 69 74  Vdbe;..    sqlit
c6d0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
c6e0: 70 50 61 72 73 65 2c 20 70 58 29 3b 0a 20 20 20  pParse, pX);.   
c6f0: 20 69 54 61 62 20 3d 20 70 58 2d 3e 69 54 61 62   iTab = pX->iTab
c700: 6c 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  le;.    sqlite3V
c710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
c720: 65 77 69 6e 64 2c 20 69 54 61 62 2c 20 30 29 3b  ewind, iTab, 0);
c730: 0a 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74  .    VdbeComment
c740: 28 28 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70  ((v, "# %.*s", p
c750: 58 2d 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73  X->span.n, pX->s
c760: 70 61 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65  pan.z));.    pLe
c770: 76 65 6c 2d 3e 6e 49 6e 2b 2b 3b 0a 20 20 20 20  vel->nIn++;.    
c780: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 4f 72 46  sqliteReallocOrF
c790: 72 65 65 28 28 76 6f 69 64 2a 2a 29 26 70 4c 65  ree((void**)&pLe
c7a0: 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 2c 0a 20 20  vel->aInLoop,.  
c7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
c7d0: 69 7a 65 6f 66 28 70 4c 65 76 65 6c 2d 3e 61 49  izeof(pLevel->aI
c7e0: 6e 4c 6f 6f 70 5b 30 5d 29 2a 32 2a 70 4c 65 76  nLoop[0])*2*pLev
c7f0: 65 6c 2d 3e 6e 49 6e 29 3b 0a 20 20 20 20 61 49  el->nIn);.    aI
c800: 6e 20 3d 20 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c  n = pLevel->aInL
c810: 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20 61 49 6e  oop;.    if( aIn
c820: 20 29 7b 0a 20 20 20 20 20 20 61 49 6e 20 2b 3d   ){.      aIn +=
c830: 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 2a 32 20 2d   pLevel->nIn*2 -
c840: 20 32 3b 0a 20 20 20 20 20 20 61 49 6e 5b 30 5d   2;.      aIn[0]
c850: 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 20 20 61   = iTab;.      a
c860: 49 6e 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 56  In[1] = sqlite3V
c870: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
c880: 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b  olumn, iTab, 0);
c890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c8a0: 20 20 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 3d 20    pLevel->nIn = 
c8b0: 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  0;.    }.#endif.
c8c0: 20 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72    }.  disableTer
c8d0: 6d 28 70 4c 65 76 65 6c 2c 20 70 54 65 72 6d 29  m(pLevel, pTerm)
c8e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
c8f0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
c900: 6c 6c 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20  ll evaluate all 
c910: 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73 74 72  == and IN constr
c920: 61 69 6e 74 73 20 66 6f 72 20 61 6e 0a 2a 2a 20  aints for an.** 
c930: 69 6e 64 65 78 2e 20 20 54 68 65 20 76 61 6c 75  index.  The valu
c940: 65 73 20 66 6f 72 20 61 6c 6c 20 63 6f 6e 73 74  es for all const
c950: 72 61 69 6e 74 73 20 61 72 65 20 6c 65 66 74 20  raints are left 
c960: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a  on the stack..**
c970: 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  .** For example,
c980: 20 63 6f 6e 73 69 64 65 72 20 74 61 62 6c 65 20   consider table 
c990: 74 31 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  t1(a,b,c,d,e,f) 
c9a0: 77 69 74 68 20 69 6e 64 65 78 20 69 31 28 61 2c  with index i1(a,
c9b0: 62 2c 63 29 2e 0a 2a 2a 20 53 75 70 70 6f 73 65  b,c)..** Suppose
c9c0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c9d0: 65 20 69 73 20 74 68 69 73 3a 20 20 61 3d 3d 35  e is this:  a==5
c9e0: 20 41 4e 44 20 62 20 49 4e 20 28 31 2c 32 2c 33   AND b IN (1,2,3
c9f0: 29 20 41 4e 44 20 63 3e 35 20 41 4e 44 20 63 3c  ) AND c>5 AND c<
ca00: 31 30 0a 2a 2a 20 54 68 65 20 69 6e 64 65 78 20  10.** The index 
ca10: 68 61 73 20 61 73 20 6d 61 6e 79 20 61 73 20 74  has as many as t
ca20: 68 72 65 65 20 65 71 75 61 6c 69 74 79 20 63 6f  hree equality co
ca30: 6e 73 74 72 61 69 6e 74 73 2c 20 62 75 74 20 69  nstraints, but i
ca40: 6e 20 74 68 69 73 0a 2a 2a 20 65 78 61 6d 70 6c  n this.** exampl
ca50: 65 2c 20 74 68 65 20 74 68 69 72 64 20 22 63 22  e, the third "c"
ca60: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 69 6e 65   value is an ine
ca70: 71 75 61 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 6c  quality.  So onl
ca80: 79 20 74 77 6f 20 0a 2a 2a 20 63 6f 6e 73 74 72  y two .** constr
ca90: 61 69 6e 74 73 20 61 72 65 20 63 6f 64 65 64 2e  aints are coded.
caa0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77    This routine w
cab0: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  ill generate cod
cac0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 0a 2a 2a  e to evaluate.**
cad0: 20 61 3d 3d 35 20 61 6e 64 20 62 20 49 4e 20 28   a==5 and b IN (
cae0: 31 2c 32 2c 33 29 2e 20 20 54 68 65 20 63 75 72  1,2,3).  The cur
caf0: 72 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20  rent values for 
cb00: 61 20 61 6e 64 20 62 20 77 69 6c 6c 20 62 65 20  a and b will be 
cb10: 6c 65 66 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73  left.** on the s
cb20: 74 61 63 6b 20 2d 20 61 20 69 73 20 74 68 65 20  tack - a is the 
cb30: 64 65 65 70 65 73 74 20 61 6e 64 20 62 20 74 68  deepest and b th
cb40: 65 20 73 68 61 6c 6c 6f 77 65 73 74 2e 0a 2a 2a  e shallowest..**
cb50: 0a 2a 2a 20 49 6e 20 74 68 65 20 65 78 61 6d 70  .** In the examp
cb60: 6c 65 20 61 62 6f 76 65 20 6e 45 71 3d 3d 32 2e  le above nEq==2.
cb70: 20 20 42 75 74 20 74 68 69 73 20 73 75 62 72 6f    But this subro
cb80: 75 74 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20  utine works for 
cb90: 61 6e 79 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  any value.** of 
cba0: 6e 45 71 20 69 6e 63 6c 75 64 69 6e 67 20 30 2e  nEq including 0.
cbb0: 20 20 49 66 20 6e 45 71 3d 3d 30 2c 20 74 68 69    If nEq==0, thi
cbc0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 61  s routine is nea
cbd0: 72 6c 79 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20  rly a no-op..** 
cbe0: 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 69  The only thing i
cbf0: 74 20 64 6f 65 73 20 69 73 20 61 6c 6c 6f 63 61  t does is alloca
cc00: 74 65 20 74 68 65 20 70 4c 65 76 65 6c 2d 3e 69  te the pLevel->i
cc10: 4d 65 6d 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  Mem memory cell.
cc20: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
cc30: 69 6e 65 20 61 6c 77 61 79 73 20 61 6c 6c 6f 63  ine always alloc
cc40: 61 74 65 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ates at least on
cc50: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e  e memory cell an
cc60: 64 20 70 75 74 73 0a 2a 2a 20 74 68 65 20 61 64  d puts.** the ad
cc70: 64 72 65 73 73 20 6f 66 20 74 68 61 74 20 6d 65  dress of that me
cc80: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 70 4c 65  mory cell in pLe
cc90: 76 65 6c 2d 3e 69 4d 65 6d 2e 20 20 54 68 65 20  vel->iMem.  The 
cca0: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 63 61 6c  code that.** cal
ccb0: 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
ccc0: 77 69 6c 6c 20 75 73 65 20 70 4c 65 76 65 6c 2d  will use pLevel-
ccd0: 3e 69 4d 65 6d 20 74 6f 20 73 74 6f 72 65 20 74  >iMem to store t
cce0: 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 2a  he termination.*
ccf0: 2a 20 6b 65 79 20 76 61 6c 75 65 20 6f 66 20 74  * key value of t
cd00: 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 6f 6e 65  he loop.  If one
cd10: 20 6f 72 20 6d 6f 72 65 20 49 4e 20 6f 70 65 72   or more IN oper
cd20: 61 74 6f 72 73 20 61 70 70 65 61 72 2c 20 74 68  ators appear, th
cd30: 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  en.** this routi
cd40: 6e 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 6e 20  ne allocates an 
cd50: 61 64 64 69 74 69 6f 6e 61 6c 20 6e 45 71 20 6d  additional nEq m
cd60: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 66 6f 72 20  emory cells for 
cd70: 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 75 73 65 2e  internal.** use.
cd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cd90: 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74 79 54  codeAllEqualityT
cda0: 65 72 6d 73 28 0a 20 20 50 61 72 73 65 20 2a 70  erms(.  Parse *p
cdb0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
cdc0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
cdd0: 20 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c   */.  WhereLevel
cde0: 20 2a 70 4c 65 76 65 6c 2c 20 20 20 2f 2a 20 57   *pLevel,   /* W
cdf0: 68 69 63 68 20 6e 65 73 74 65 64 20 6c 6f 6f 70  hich nested loop
ce00: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 77 65 20   of the FROM we 
ce10: 61 72 65 20 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  are coding */.  
ce20: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
ce30: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45  ,     /* The WHE
ce40: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 42  RE clause */.  B
ce50: 69 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 2c  itmask notReady,
ce60: 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 70 61       /* Which pa
ce70: 72 74 73 20 6f 66 20 46 52 4f 4d 20 68 61 76 65  rts of FROM have
ce80: 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6f   not yet been co
ce90: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ded */.  int brk
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ceb0: 2a 20 4a 75 6d 70 20 68 65 72 65 20 74 6f 20 65  * Jump here to e
cec0: 6e 64 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 29  nd the loop */.)
ced0: 7b 0a 20 20 69 6e 74 20 6e 45 71 20 3d 20 70 4c  {.  int nEq = pL
cee0: 65 76 65 6c 2d 3e 6e 45 71 3b 20 20 20 20 20 20  evel->nEq;      
cef0: 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
cf00: 6f 66 20 3d 3d 20 6f 72 20 49 4e 20 63 6f 6e 73  of == or IN cons
cf10: 74 72 61 69 6e 74 73 20 74 6f 20 63 6f 64 65 20  traints to code 
cf20: 2a 2f 0a 20 20 69 6e 74 20 74 65 72 6d 73 49 6e  */.  int termsIn
cf30: 4d 65 6d 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Mem = 0;        
cf40: 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73     /* If true, s
cf50: 74 6f 72 65 20 76 61 6c 75 65 20 69 6e 20 6d 65  tore value in me
cf60: 6d 5b 5d 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 56  m[] cells */.  V
cf70: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
cf80: 3e 70 56 64 62 65 3b 20 20 20 20 20 20 2f 2a 20  >pVdbe;      /* 
cf90: 54 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68  The virtual mach
cfa0: 69 6e 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ine under constr
cfb0: 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 49 6e 64 65  uction */.  Inde
cfc0: 78 20 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c  x *pIdx = pLevel
cfd0: 2d 3e 70 49 64 78 3b 20 20 20 2f 2a 20 54 68 65  ->pIdx;   /* The
cfe0: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 75 73 65   index being use
cff0: 64 20 66 6f 72 20 74 68 69 73 20 6c 6f 6f 70 20  d for this loop 
d000: 2a 2f 0a 20 20 69 6e 74 20 69 43 75 72 20 3d 20  */.  int iCur = 
d010: 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75 72 3b  pLevel->iTabCur;
d020: 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72     /* The cursor
d030: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 2a 2f   of the table */
d040: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 70 54  .  WhereTerm *pT
d050: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
d060: 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 63 6f 6e   /* A single con
d070: 73 74 72 61 69 6e 74 20 74 65 72 6d 20 2a 2f 0a  straint term */.
d080: 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20    int j;        
d090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
d0b0: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
d0c0: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6d 65 6d  out how many mem
d0d0: 6f 72 79 20 63 65 6c 6c 73 20 77 65 20 77 69 6c  ory cells we wil
d0e0: 6c 20 6e 65 65 64 20 74 68 65 6e 20 61 6c 6c 6f  l need then allo
d0f0: 63 61 74 65 20 74 68 65 6d 2e 0a 20 20 2a 2a 20  cate them..  ** 
d100: 57 65 20 61 6c 77 61 79 73 20 6e 65 65 64 20 61  We always need a
d110: 74 20 6c 65 61 73 74 20 6f 6e 65 20 75 73 65 64  t least one used
d120: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 6c 6f   to store the lo
d130: 6f 70 20 74 65 72 6d 69 6e 61 74 6f 72 0a 20 20  op terminator.  
d140: 2a 2a 20 76 61 6c 75 65 2e 20 20 49 66 20 74 68  ** value.  If th
d150: 65 72 65 20 61 72 65 20 49 4e 20 6f 70 65 72 61  ere are IN opera
d160: 74 6f 72 73 20 77 65 27 6c 6c 20 6e 65 65 64 20  tors we'll need 
d170: 6f 6e 65 20 66 6f 72 20 65 61 63 68 20 3d 3d 20  one for each == 
d180: 6f 72 0a 20 20 2a 2a 20 49 4e 20 63 6f 6e 73 74  or.  ** IN const
d190: 72 61 69 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 4c  raint..  */.  pL
d1a0: 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61  evel->iMem = pPa
d1b0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 69  rse->nMem++;.  i
d1c0: 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  f( pLevel->flags
d1d0: 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e 5f   & WHERE_COLUMN_
d1e0: 49 4e 20 29 7b 0a 20 20 20 20 70 50 61 72 73 65  IN ){.    pParse
d1f0: 2d 3e 6e 4d 65 6d 20 2b 3d 20 70 4c 65 76 65 6c  ->nMem += pLevel
d200: 2d 3e 6e 45 71 3b 0a 20 20 20 20 74 65 72 6d 73  ->nEq;.    terms
d210: 49 6e 4d 65 6d 20 3d 20 31 3b 0a 20 20 7d 0a 0a  InMem = 1;.  }..
d220: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
d230: 65 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  e equality const
d240: 72 61 69 6e 74 73 0a 20 20 2a 2f 0a 20 20 66 6f  raints.  */.  fo
d250: 72 28 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e  r(j=0; j<pIdx->n
d260: 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Column; j++){.  
d270: 20 20 69 6e 74 20 6b 20 3d 20 70 49 64 78 2d 3e    int k = pIdx->
d280: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
d290: 20 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72   pTerm = findTer
d2a0: 6d 28 70 57 43 2c 20 69 43 75 72 2c 20 6b 2c 20  m(pWC, iCur, k, 
d2b0: 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
d2c0: 57 4f 5f 49 4e 2c 20 70 49 64 78 29 3b 0a 20 20  WO_IN, pIdx);.  
d2d0: 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
d2e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 73 73 65   break;.    asse
d2f0: 72 74 28 20 28 70 54 65 72 6d 2d 3e 66 6c 61 67  rt( (pTerm->flag
d300: 73 20 26 20 54 45 52 4d 5f 43 4f 44 45 44 29 3d  s & TERM_CODED)=
d310: 3d 30 20 29 3b 0a 20 20 20 20 63 6f 64 65 45 71  =0 );.    codeEq
d320: 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72 73  ualityTerm(pPars
d330: 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70  e, pTerm, brk, p
d340: 4c 65 76 65 6c 29 3b 0a 20 20 20 20 69 66 28 20  Level);.    if( 
d350: 74 65 72 6d 73 49 6e 4d 65 6d 20 29 7b 0a 20 20  termsInMem ){.  
d360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
d370: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
d380: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
d390: 6d 2b 6a 2b 31 2c 20 31 29 3b 0a 20 20 20 20 7d  m+j+1, 1);.    }
d3a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
d3b0: 3d 3d 6e 45 71 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ==nEq );..  /* M
d3c0: 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
d3d0: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 61 6c 75   constraint valu
d3e0: 65 73 20 61 72 65 20 6f 6e 20 74 68 65 20 74 6f  es are on the to
d3f0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 0a 20  p of the stack. 
d400: 20 2a 2f 0a 20 20 69 66 28 20 74 65 72 6d 73 49   */.  if( termsI
d410: 6e 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28  nMem ){.    for(
d420: 6a 3d 30 3b 20 6a 3c 6e 45 71 3b 20 6a 2b 2b 29  j=0; j<nEq; j++)
d430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
d440: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
d450: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
d460: 69 4d 65 6d 2b 6a 2b 31 2c 20 30 29 3b 0a 20 20  iMem+j+1, 0);.  
d470: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64    }.  }.}..#if d
d480: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
d490: 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  ST)./*.** The fo
d4a0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
d4b0: 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64 65   holds a text de
d4c0: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75 65  scription of que
d4d0: 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74 65  ry plan generate
d4e0: 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73 74  d.** by the most
d4f0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
d500: 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69  sqlite3WhereBegi
d510: 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  n().  Each call 
d520: 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a 2a  to WhereBegin.**
d530: 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20   overwrites the 
d540: 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73 20  previous.  This 
d550: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75  information is u
d560: 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
d570: 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73 20  and.** analysis 
d580: 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73 71  only..*/.char sq
d590: 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
d5a0: 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a 20  [BMS*2*40];  /* 
d5b0: 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69 6e  Text of the join
d5c0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
d5d0: 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20 20  QPlan = 0;      
d5e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
d5f0: 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71 75  free slow in _qu
d600: 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a 23  ery_plan[] */..#
d610: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d620: 54 45 53 54 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20  TEST */.../*.** 
d630: 46 72 65 65 20 61 20 57 68 65 72 65 49 6e 66 6f  Free a WhereInfo
d640: 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 73 74   structure.*/.st
d650: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 49  atic void whereI
d660: 6e 66 6f 46 72 65 65 28 57 68 65 72 65 49 6e 66  nfoFree(WhereInf
d670: 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 69 66  o *pWInfo){.  if
d680: 28 20 70 57 49 6e 66 6f 20 29 7b 0a 20 20 20 20  ( pWInfo ){.    
d690: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
d6a0: 3d 30 3b 20 69 3c 70 57 49 6e 66 6f 2d 3e 6e 4c  =0; i<pWInfo->nL
d6b0: 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  evel; i++){.    
d6c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f    sqlite3_index_
d6d0: 69 6e 66 6f 20 2a 70 49 6e 66 6f 20 3d 20 70 57  info *pInfo = pW
d6e0: 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64 78 49  Info->a[i].pIdxI
d6f0: 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 70  nfo;.      if( p
d700: 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Info ){.        
d710: 69 66 28 20 70 49 6e 66 6f 2d 3e 6e 65 65 64 54  if( pInfo->needT
d720: 6f 46 72 65 65 49 64 78 53 74 72 20 29 7b 0a 20  oFreeIdxStr ){. 
d730: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
d740: 5f 66 72 65 65 28 70 49 6e 66 6f 2d 3e 69 64 78  _free(pInfo->idx
d750: 53 74 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Str);.        }.
d760: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
d770: 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20  ee(pInfo);.     
d780: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
d790: 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  iteFree(pWInfo);
d7a0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47  .  }.}.../*.** G
d7b0: 65 6e 65 72 61 74 65 20 74 68 65 20 62 65 67 69  enerate the begi
d7c0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f  nning of the loo
d7d0: 70 20 75 73 65 64 20 66 6f 72 20 57 48 45 52 45  p used for WHERE
d7e0: 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69   clause processi
d7f0: 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ng..** The retur
d800: 6e 20 76 61 6c 75 65 20 69 73 20 61 20 70 6f 69  n value is a poi
d810: 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70 61 71 75  nter to an opaqu
d820: 65 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  e structure that
d830: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66   contains.** inf
d840: 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ormation needed 
d850: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
d860: 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74   loop.  Later, t
d870: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
d880: 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76  ne.** should inv
d890: 6f 6b 65 20 73 71 6c 69 74 65 33 57 68 65 72 65  oke sqlite3Where
d8a0: 45 6e 64 28 29 20 77 69 74 68 20 74 68 65 20 72  End() with the r
d8b0: 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74  eturn value of t
d8c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
d8d0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70  in order to comp
d8e0: 6c 65 74 65 20 74 68 65 20 57 48 45 52 45 20 63  lete the WHERE c
d8f0: 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67  lause processing
d900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
d910: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 69 73  ror occurs, this
d920: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
d930: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
d940: 20 62 61 73 69 63 20 69 64 65 61 20 69 73 20 74   basic idea is t
d950: 6f 20 64 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f  o do a nested lo
d960: 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72  op, one loop for
d970: 20 65 61 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a   each table in.*
d980: 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  * the FROM claus
d990: 65 20 6f 66 20 61 20 73 65 6c 65 63 74 2e 20 20  e of a select.  
d9a0: 28 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44 41  (INSERT and UPDA
d9b0: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72  TE statements ar
d9c0: 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73  e the.** same as
d9d0: 20 61 20 53 45 4c 45 43 54 20 77 69 74 68 20 6f   a SELECT with o
d9e0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nly a single tab
d9f0: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
da00: 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20  lause.)  For.** 
da10: 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
da20: 53 51 4c 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a  SQL is this:.**.
da30: 2a 2a 20 20 20 20 20 20 20 53 45 4c 45 43 54 20  **       SELECT 
da40: 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74  * FROM t1, t2, t
da50: 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a  3 WHERE ...;.**.
da60: 2a 2a 20 54 68 65 6e 20 74 68 65 20 63 6f 64 65  ** Then the code
da70: 20 67 65 6e 65 72 61 74 65 64 20 69 73 20 63 6f   generated is co
da80: 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20  nceptually like 
da90: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
daa0: 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72 65 61 63  *.**      foreac
dab0: 68 20 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 20  h row1 in t1 do 
dac0: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
dad0: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
dae0: 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 32      foreach row2
daf0: 20 69 6e 20 74 32 20 64 6f 20 20 20 20 20 20 7c   in t2 do      |
db00: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
db10: 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20  reBegin().**    
db20: 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72 6f        foreach ro
db30: 77 33 20 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a  w3 in t3 do   /.
db40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 2e 2e  **            ..
db50: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 65 6e  ..**          en
db60: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
db70: 20 20 20 20 20 20 5c 20 20 20 20 43 6f 64 65 20        \    Code 
db80: 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 20 20 20  generated.**    
db90: 20 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20      end         
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
dbb0: 2d 2d 20 62 79 20 73 71 6c 69 74 65 33 57 68 65  -- by sqlite3Whe
dbc0: 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20  reEnd().**      
dbd0: 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  end             
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a              /.**
dbf0: 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
dc00: 65 20 6c 6f 6f 70 73 20 6d 69 67 68 74 20 6e 6f  e loops might no
dc10: 74 20 62 65 20 6e 65 73 74 65 64 20 69 6e 20 74  t be nested in t
dc20: 68 65 20 6f 72 64 65 72 20 69 6e 20 77 68 69 63  he order in whic
dc30: 68 20 74 68 65 79 0a 2a 2a 20 61 70 70 65 61 72  h they.** appear
dc40: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
dc50: 75 73 65 20 69 66 20 61 20 64 69 66 66 65 72 65  use if a differe
dc60: 6e 74 20 6f 72 64 65 72 20 69 73 20 62 65 74 74  nt order is bett
dc70: 65 72 20 61 62 6c 65 20 74 6f 20 6d 61 6b 65 0a  er able to make.
dc80: 2a 2a 20 75 73 65 20 6f 66 20 69 6e 64 69 63 65  ** use of indice
dc90: 73 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  s.  Note also th
dca0: 61 74 20 77 68 65 6e 20 74 68 65 20 49 4e 20 6f  at when the IN o
dcb0: 70 65 72 61 74 6f 72 20 61 70 70 65 61 72 73 20  perator appears 
dcc0: 69 6e 0a 2a 2a 20 74 68 65 20 57 48 45 52 45 20  in.** the WHERE 
dcd0: 63 6c 61 75 73 65 2c 20 69 74 20 6d 69 67 68 74  clause, it might
dce0: 20 72 65 73 75 6c 74 20 69 6e 20 61 64 64 69 74   result in addit
dcf0: 69 6f 6e 61 6c 20 6e 65 73 74 65 64 20 6c 6f 6f  ional nested loo
dd00: 70 73 20 66 6f 72 0a 2a 2a 20 73 63 61 6e 6e 69  ps for.** scanni
dd10: 6e 67 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 76  ng through all v
dd20: 61 6c 75 65 73 20 6f 6e 20 74 68 65 20 72 69 67  alues on the rig
dd30: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
dd40: 74 68 65 20 49 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68  the IN..**.** Th
dd50: 65 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75  ere are Btree cu
dd60: 72 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64  rsors associated
dd70: 20 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65   with each table
dd80: 2e 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f  .  t1 uses curso
dd90: 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62  r.** number pTab
dda0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73  List->a[0].iCurs
ddb0: 6f 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65  or.  t2 uses the
ddc0: 20 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74   cursor pTabList
ddd0: 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a  ->a[1].iCursor..
dde0: 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  ** And so forth.
ddf0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67    This routine g
de00: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
de10: 20 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45   open those VDBE
de20: 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20   cursors.** and 
de30: 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28  sqlite3WhereEnd(
de40: 29 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20  ) generates the 
de50: 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68  code to close th
de60: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f  em..**.** The co
de70: 64 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57  de that sqlite3W
de80: 68 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65  hereBegin() gene
de90: 72 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65  rates leaves the
dea0: 20 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a   cursors named.*
deb0: 2a 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f  * in pTabList po
dec0: 69 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20  inting at their 
ded0: 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
dee0: 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20  ies.  The [...] 
def0: 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20  code.** can use 
df00: 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50  OP_Column and OP
df10: 5f 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f  _Rowid opcodes o
df20: 6e 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20  n these cursors 
df30: 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61  to extract.** da
df40: 74 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69  ta from the vari
df50: 6f 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68  ous tables of th
df60: 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66  e loop..**.** If
df70: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
df80: 65 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20  e is empty, the 
df90: 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75  foreach loops mu
dfa0: 73 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65  st each scan the
dfb0: 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62  ir.** entire tab
dfc0: 6c 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72  les.  Thus a thr
dfd0: 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61  ee-way join is a
dfe0: 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69  n O(N^3) operati
dff0: 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74  on.  But if.** t
e000: 68 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69  he tables have i
e010: 6e 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65  ndices and there
e020: 20 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68   are terms in th
e030: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
e040: 68 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20  hat.** refer to 
e050: 74 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61  those indices, a
e060: 20 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20   complete table 
e070: 73 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69  scan can be avoi
e080: 64 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  ded and the.** c
e090: 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63  ode will run muc
e0a0: 68 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20  h faster.  Most 
e0b0: 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74  of the work of t
e0c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
e0d0: 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65  hecking.** to se
e0e0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69  e if there are i
e0f0: 6e 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20  ndices that can 
e100: 62 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64  be used to speed
e110: 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a   up the loop..**
e120: 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65  .** Terms of the
e130: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72   WHERE clause ar
e140: 65 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c  e also used to l
e150: 69 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20  imit which rows 
e160: 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65  actually.** make
e170: 20 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22   it to the "..."
e180: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
e190: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74  f the loop.  Aft
e1a0: 65 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68  er each "foreach
e1b0: 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74  ",.** terms of t
e1c0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
e1d0: 74 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65  that use only te
e1e0: 72 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70  rms in that loop
e1f0: 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f   and outer.** lo
e200: 6f 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65  ops are evaluate
e210: 64 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61  d and if false a
e220: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72   jump is made ar
e230: 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75  ound all subsequ
e240: 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f  ent.** inner loo
e250: 70 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68  ps (or around th
e260: 65 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74  e "..." if the t
e270: 65 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69  est occurs withi
e280: 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20  n the inner-.** 
e290: 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a  most loop).**.**
e2a0: 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a   OUTER JOINS.**.
e2b0: 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e  ** An outer join
e2c0: 20 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e   of tables t1 an
e2d0: 64 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61  d t2 is concepta
e2e0: 6c 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c  lly coded as fol
e2f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66  lows:.**.**    f
e300: 6f 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74  oreach row1 in t
e310: 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61  1 do.**      fla
e320: 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f  g = 0.**      fo
e330: 72 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32  reach row2 in t2
e340: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74   do.**        st
e350: 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  art:.**         
e360: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
e370: 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20   flag = 1.**    
e380: 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66    end.**      if
e390: 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a   flag==0 then.**
e3a0: 20 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65          move the
e3b0: 20 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20   row2 cursor to 
e3c0: 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20  a null row.**   
e3d0: 20 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a       goto start.
e3e0: 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20  **      fi.**   
e3f0: 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52   end.**.** ORDER
e400: 20 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45   BY CLAUSE PROCE
e410: 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f  SSING.**.** *ppO
e420: 72 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e  rderBy is a poin
e430: 74 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52  ter to the ORDER
e440: 20 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20   BY clause of a 
e450: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
e460: 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  ,.** if there is
e470: 20 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20   one.  If there 
e480: 69 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63  is no ORDER BY c
e490: 6c 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73  lause or if this
e4a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63   routine.** is c
e4b0: 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50  alled from an UP
e4c0: 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73  DATE or DELETE s
e4d0: 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70  tatement, then p
e4e0: 70 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c  pOrderBy is NULL
e4f0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  ..**.** If an in
e500: 64 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20  dex can be used 
e510: 73 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75  so that the natu
e520: 72 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72  ral output order
e530: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a   of the table.**
e540: 20 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74   scan is correct
e550: 20 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42   for the ORDER B
e560: 59 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74  Y clause, then t
e570: 68 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65  hat index is use
e580: 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65  d and.** *ppOrde
e590: 72 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55  rBy is set to NU
e5a0: 4c 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20  LL.  This is an 
e5b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61  optimization tha
e5c0: 74 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a  t prevents an.**
e5d0: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72   unnecessary sor
e5e0: 74 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  t of the result 
e5f0: 73 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20  set if an index 
e600: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
e610: 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20  the.** ORDER BY 
e620: 63 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65  clause already e
e630: 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  xists..**.** If 
e640: 74 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65  the where clause
e650: 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65   loops cannot be
e660: 20 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f   arranged to pro
e670: 76 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74  vide the correct
e680: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72  .** output order
e690: 2c 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72  , then the *ppOr
e6a0: 64 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67  derBy is unchang
e6b0: 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f  ed..*/.WhereInfo
e6c0: 20 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65   *sqlite3WhereBe
e6d0: 67 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  gin(.  Parse *pP
e6e0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
e6f0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
e700: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
e710: 2a 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a  *pTabList,    /*
e720: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74   A list of all t
e730: 61 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e  ables to be scan
e740: 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ned */.  Expr *p
e750: 57 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f  Where,         /
e760: 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75  * The WHERE clau
e770: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
e780: 20 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a   **ppOrderBy  /*
e790: 20 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   An ORDER BY cla
e7a0: 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  use, or NULL */.
e7b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
e7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e7d0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
e7e0: 2a 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a  */.  WhereInfo *
e7f0: 70 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20  pWInfo;         
e800: 2f 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74  /* Will become t
e810: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
e820: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
e830: 20 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20   */.  Vdbe *v = 
e840: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20  pParse->pVdbe;  
e850: 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20   /* The virtual 
e860: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20  database engine 
e870: 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f  */.  int brk, co
e880: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
e890: 2f 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65  /* Addresses use
e8a0: 64 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65  d during code ge
e8b0: 6e 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 42 69  neration */.  Bi
e8c0: 74 6d 61 73 6b 20 6e 6f 74 52 65 61 64 79 3b 20  tmask notReady; 
e8d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
e8e0: 6f 72 73 20 74 68 61 74 20 61 72 65 20 6e 6f 74  ors that are not
e8f0: 20 79 65 74 20 70 6f 73 69 74 69 6f 6e 65 64 20   yet positioned 
e900: 2a 2f 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  */.  WhereTerm *
e910: 70 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  pTerm;          
e920: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 74 65 72 6d  /* A single term
e930: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
e940: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4d 61  ause */.  ExprMa
e950: 73 6b 53 65 74 20 6d 61 73 6b 53 65 74 3b 20 20  skSet maskSet;  
e960: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
e970: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 20  ession mask set 
e980: 2a 2f 0a 20 20 57 68 65 72 65 43 6c 61 75 73 65  */.  WhereClause
e990: 20 77 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   wc;            
e9a0: 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63 6c 61  /* The WHERE cla
e9b0: 75 73 65 20 69 73 20 64 69 76 69 64 65 64 20 69  use is divided i
e9c0: 6e 74 6f 20 74 68 65 73 65 20 74 65 72 6d 73 20  nto these terms 
e9d0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c  */.  struct SrcL
e9e0: 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62 49 74  ist_item *pTabIt
e9f0: 65 6d 3b 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65  em;  /* A single
ea00: 20 65 6e 74 72 79 20 66 72 6f 6d 20 70 54 61 62   entry from pTab
ea10: 4c 69 73 74 20 2a 2f 0a 20 20 57 68 65 72 65 4c  List */.  WhereL
ea20: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 20 20 20  evel *pLevel;   
ea30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73            /* A s
ea40: 69 6e 67 6c 65 20 6c 65 76 65 6c 20 69 6e 20 74  ingle level in t
ea50: 68 65 20 70 57 49 6e 66 6f 20 6c 69 73 74 20 2a  he pWInfo list *
ea60: 2f 0a 20 20 69 6e 74 20 69 46 72 6f 6d 3b 20 20  /.  int iFrom;  
ea70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea80: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
ea90: 73 65 64 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  sed FROM clause 
eaa0: 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
eab0: 20 61 6e 64 46 6c 61 67 73 3b 20 20 20 20 20 20   andFlags;      
eac0: 20 20 20 20 20 20 20 20 2f 2a 20 41 4e 44 2d 65          /* AND-e
ead0: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66  d combination of
eae0: 20 61 6c 6c 20 77 63 2e 61 5b 5d 2e 66 6c 61 67   all wc.a[].flag
eaf0: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 6e  s */..  /* The n
eb00: 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 20  umber of tables 
eb10: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
eb20: 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62 79  se is limited by
eb30: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 20   the number of. 
eb40: 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42 69   ** bits in a Bi
eb50: 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69 66  tmask .  */.  if
eb60: 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  ( pTabList->nSrc
eb70: 3e 42 4d 53 20 29 7b 0a 20 20 20 20 73 71 6c 69  >BMS ){.    sqli
eb80: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
eb90: 73 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20  se, "at most %d 
eba0: 74 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e  tables in a join
ebb0: 22 2c 20 42 4d 53 29 3b 0a 20 20 20 20 72 65 74  ", BMS);.    ret
ebc0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
ebd0: 20 53 70 6c 69 74 20 74 68 65 20 57 48 45 52 45   Split the WHERE
ebe0: 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 73 65 70   clause into sep
ebf0: 61 72 61 74 65 20 73 75 62 65 78 70 72 65 73 73  arate subexpress
ec00: 69 6f 6e 73 20 77 68 65 72 65 20 65 61 63 68 0a  ions where each.
ec10: 20 20 2a 2a 20 73 75 62 65 78 70 72 65 73 73 69    ** subexpressi
ec20: 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 64 20  on is separated 
ec30: 62 79 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74  by an AND operat
ec40: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d  or..  */.  initM
ec50: 61 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74 29  askSet(&maskSet)
ec60: 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65 49  ;.  whereClauseI
ec70: 6e 69 74 28 26 77 63 2c 20 70 50 61 72 73 65 29  nit(&wc, pParse)
ec80: 3b 0a 20 20 77 68 65 72 65 53 70 6c 69 74 28 26  ;.  whereSplit(&
ec90: 77 63 2c 20 70 57 68 65 72 65 2c 20 54 4b 5f 41  wc, pWhere, TK_A
eca0: 4e 44 29 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41  ND);.    .  /* A
ecb0: 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
ecc0: 69 61 6c 69 7a 65 20 74 68 65 20 57 68 65 72 65  ialize the Where
ecd0: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 74  Info structure t
ece0: 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  hat will become 
ecf0: 74 68 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  the.  ** return 
ed00: 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57  value..  */.  pW
ed10: 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Info = sqliteMal
ed20: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 57 68 65 72  loc( sizeof(Wher
ed30: 65 49 6e 66 6f 29 20 2b 20 70 54 61 62 4c 69 73  eInfo) + pTabLis
ed40: 74 2d 3e 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57  t->nSrc*sizeof(W
ed50: 68 65 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69  hereLevel));.  i
ed60: 66 28 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  f( sqlite3Malloc
ed70: 46 61 69 6c 65 64 28 29 20 29 7b 0a 20 20 20 20  Failed() ){.    
ed80: 67 6f 74 6f 20 77 68 65 72 65 42 65 67 69 6e 4e  goto whereBeginN
ed90: 6f 4d 65 6d 3b 0a 20 20 7d 0a 20 20 70 57 49 6e  oMem;.  }.  pWIn
eda0: 66 6f 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 54 61  fo->nLevel = pTa
edb0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 0a 20 20 70  bList->nSrc;.  p
edc0: 57 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20  WInfo->pParse = 
edd0: 70 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f  pParse;.  pWInfo
ede0: 2d 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61  ->pTabList = pTa
edf0: 62 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d  bList;.  pWInfo-
ee00: 3e 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65  >iBreak = sqlite
ee10: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
ee20: 29 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c  );..  /* Special
ee30: 20 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63   case: a WHERE c
ee40: 6c 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f  lause that is co
ee50: 6e 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74  nstant.  Evaluat
ee60: 65 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65  e the.  ** expre
ee70: 73 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72  ssion and either
ee80: 20 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f   jump over all o
ee90: 66 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61  f the code or fa
eea0: 6c 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20  ll thru..  */.  
eeb0: 69 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70  if( pWhere && (p
eec0: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30  TabList->nSrc==0
eed0: 20 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49   || sqlite3ExprI
eee0: 73 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65  sConstant(pWhere
eef0: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
ef00: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
ef10: 72 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49  rse, pWhere, pWI
ef20: 6e 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b  nfo->iBreak, 1);
ef30: 0a 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b  .    pWhere = 0;
ef40: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79  .  }..  /* Analy
ef50: 7a 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75  ze all of the su
ef60: 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20 4e  bexpressions.  N
ef70: 6f 74 65 20 74 68 61 74 20 65 78 70 72 41 6e 61  ote that exprAna
ef80: 6c 79 7a 65 28 29 20 6d 69 67 68 74 0a 20 20 2a  lyze() might.  *
ef90: 2a 20 61 64 64 20 6e 65 77 20 76 69 72 74 75 61  * add new virtua
efa0: 6c 20 74 65 72 6d 73 20 6f 6e 74 6f 20 74 68 65  l terms onto the
efb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48 45 52   end of the WHER
efc0: 45 20 63 6c 61 75 73 65 2e 20 20 57 65 20 64 6f  E clause.  We do
efd0: 20 6e 6f 74 0a 20 20 2a 2a 20 77 61 6e 74 20 74   not.  ** want t
efe0: 6f 20 61 6e 61 6c 79 7a 65 20 74 68 65 73 65 20  o analyze these 
eff0: 76 69 72 74 75 61 6c 20 74 65 72 6d 73 2c 20 73  virtual terms, s
f000: 6f 20 73 74 61 72 74 20 61 6e 61 6c 79 7a 69 6e  o start analyzin
f010: 67 20 61 74 20 74 68 65 20 65 6e 64 0a 20 20 2a  g at the end.  *
f020: 2a 20 61 6e 64 20 77 6f 72 6b 20 66 6f 72 77 61  * and work forwa
f030: 72 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 61  rd so that the a
f040: 64 64 65 64 20 76 69 72 74 75 61 6c 20 74 65 72  dded virtual ter
f050: 6d 73 20 61 72 65 20 6e 65 76 65 72 20 70 72 6f  ms are never pro
f060: 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  cessed..  */.  f
f070: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
f080: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
f090: 20 20 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26      createMask(&
f0a0: 6d 61 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73  maskSet, pTabLis
f0b0: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29  t->a[i].iCursor)
f0c0: 3b 0a 20 20 7d 0a 20 20 65 78 70 72 41 6e 61 6c  ;.  }.  exprAnal
f0d0: 79 7a 65 41 6c 6c 28 70 54 61 62 4c 69 73 74 2c  yzeAll(pTabList,
f0e0: 20 26 6d 61 73 6b 53 65 74 2c 20 26 77 63 29 3b   &maskSet, &wc);
f0f0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61  .  if( sqlite3Ma
f100: 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b 0a  llocFailed() ){.
f110: 20 20 20 20 67 6f 74 6f 20 77 68 65 72 65 42 65      goto whereBe
f120: 67 69 6e 4e 6f 4d 65 6d 3b 0a 20 20 7d 0a 0a 20  ginNoMem;.  }.. 
f130: 20 2f 2a 20 43 68 6f 73 65 20 74 68 65 20 62 65   /* Chose the be
f140: 73 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20  st index to use 
f150: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
f160: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
f170: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
f180: 73 20 6c 6f 6f 70 20 66 69 6c 6c 73 20 69 6e 20  s loop fills in 
f190: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
f1a0: 65 6c 64 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  elds:.  **.  ** 
f1b0: 20 20 70 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 70 49    pWInfo->a[].pI
f1c0: 64 78 20 20 20 20 20 20 54 68 65 20 69 6e 64 65  dx      The inde
f1d0: 78 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  x to use for thi
f1e0: 73 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 6c  s level of the l
f1f0: 6f 6f 70 2e 0a 20 20 2a 2a 20 20 20 70 57 49 6e  oop..  **   pWIn
f200: 66 6f 2d 3e 61 5b 5d 2e 66 6c 61 67 73 20 20 20  fo->a[].flags   
f210: 20 20 57 48 45 52 45 5f 78 78 78 20 66 6c 61 67    WHERE_xxx flag
f220: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
f230: 68 20 70 49 64 78 0a 20 20 2a 2a 20 20 20 70 57  h pIdx.  **   pW
f240: 49 6e 66 6f 2d 3e 61 5b 5d 2e 6e 45 71 20 20 20  Info->a[].nEq   
f250: 20 20 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f      The number o
f260: 66 20 3d 3d 20 61 6e 64 20 49 4e 20 63 6f 6e 73  f == and IN cons
f270: 74 72 61 69 6e 74 73 0a 20 20 2a 2a 20 20 20 70  traints.  **   p
f280: 57 49 6e 66 6f 2d 3e 61 5b 5d 2e 69 46 72 6f 6d  WInfo->a[].iFrom
f290: 20 20 20 20 20 57 68 65 6e 20 74 65 72 6d 20 6f       When term o
f2a0: 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  f the FROM claus
f2b0: 65 20 69 73 20 62 65 69 6e 67 20 63 6f 64 65 64  e is being coded
f2c0: 0a 20 20 2a 2a 20 20 20 70 57 49 6e 66 6f 2d 3e  .  **   pWInfo->
f2d0: 61 5b 5d 2e 69 54 61 62 43 75 72 20 20 20 54 68  a[].iTabCur   Th
f2e0: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
f2f0: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  r the database t
f300: 61 62 6c 65 0a 20 20 2a 2a 20 20 20 70 57 49 6e  able.  **   pWIn
f310: 66 6f 2d 3e 61 5b 5d 2e 69 49 64 78 43 75 72 20  fo->a[].iIdxCur 
f320: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
f330: 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 0a  r for the index.
f340: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 6c    **.  ** This l
f350: 6f 6f 70 20 61 6c 73 6f 20 66 69 67 75 72 65 73  oop also figures
f360: 20 6f 75 74 20 74 68 65 20 6e 65 73 74 69 6e 67   out the nesting
f370: 20 6f 72 64 65 72 20 6f 66 20 74 61 62 6c 65 73   order of tables
f380: 20 69 6e 20 74 68 65 20 46 52 4f 4d 0a 20 20 2a   in the FROM.  *
f390: 2a 20 63 6c 61 75 73 65 2e 0a 20 20 2a 2f 0a 20  * clause..  */. 
f3a0: 20 6e 6f 74 52 65 61 64 79 20 3d 20 7e 28 42 69   notReady = ~(Bi
f3b0: 74 6d 61 73 6b 29 30 3b 0a 20 20 70 54 61 62 49  tmask)0;.  pTabI
f3c0: 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  tem = pTabList->
f3d0: 61 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57  a;.  pLevel = pW
f3e0: 49 6e 66 6f 2d 3e 61 3b 0a 20 20 61 6e 64 46 6c  Info->a;.  andFl
f3f0: 61 67 73 20 3d 20 7e 30 3b 0a 20 20 54 52 41 43  ags = ~0;.  TRAC
f400: 45 28 28 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65  E(("*** Optimize
f410: 72 20 53 74 61 72 74 20 2a 2a 2a 5c 6e 22 29 29  r Start ***\n"))
f420: 3b 0a 20 20 66 6f 72 28 69 3d 69 46 72 6f 6d 3d  ;.  for(i=iFrom=
f430: 30 2c 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f  0, pLevel=pWInfo
f440: 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d  ->a; i<pTabList-
f450: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76  >nSrc; i++, pLev
f460: 65 6c 2b 2b 29 7b 0a 20 20 20 20 49 6e 64 65 78  el++){.    Index
f470: 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
f480: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
f490: 66 6f 72 20 46 52 4f 4d 20 74 61 62 6c 65 20 61  for FROM table a
f4a0: 74 20 70 54 61 62 49 74 65 6d 20 2a 2f 0a 20 20  t pTabItem */.  
f4b0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f4d0: 20 46 6c 61 67 73 20 61 73 73 73 6f 63 69 61 74   Flags asssociat
f4e0: 65 64 20 77 69 74 68 20 70 49 64 78 20 2a 2f 0a  ed with pIdx */.
f4f0: 20 20 20 20 69 6e 74 20 6e 45 71 3b 20 20 20 20      int nEq;    
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f510: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  /* Number of == 
f520: 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e 74  or IN constraint
f530: 73 20 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20  s */.    double 
f540: 63 6f 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  cost;           
f550: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 73 74       /* The cost
f560: 20 66 6f 72 20 70 49 64 78 20 2a 2f 0a 20 20 20   for pIdx */.   
f570: 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20 20 20   int j;         
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f590: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
f5a0: 20 46 52 4f 4d 20 74 61 62 6c 65 73 20 2a 2f 0a   FROM tables */.
f5b0: 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65 73 74      Index *pBest
f5c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
f5d0: 2f 2a 20 54 68 65 20 62 65 73 74 20 69 6e 64 65  /* The best inde
f5e0: 78 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f  x seen so far */
f5f0: 0a 20 20 20 20 69 6e 74 20 62 65 73 74 46 6c 61  .    int bestFla
f600: 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
f610: 20 2f 2a 20 46 6c 61 67 73 20 61 73 73 6f 63 69   /* Flags associ
f620: 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
f630: 2a 2f 0a 20 20 20 20 69 6e 74 20 62 65 73 74 4e  */.    int bestN
f640: 45 71 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Eq = 0;         
f650: 20 20 20 2f 2a 20 6e 45 71 20 61 73 73 6f 63 69     /* nEq associ
f660: 61 74 65 64 20 77 69 74 68 20 70 42 65 73 74 20  ated with pBest 
f670: 2a 2f 0a 20 20 20 20 64 6f 75 62 6c 65 20 6c 6f  */.    double lo
f680: 77 65 73 74 43 6f 73 74 3b 20 20 20 20 20 20 20  westCost;       
f690: 20 20 20 2f 2a 20 43 6f 73 74 20 6f 66 20 74 68     /* Cost of th
f6a0: 65 20 70 42 65 73 74 20 2a 2f 0a 20 20 20 20 69  e pBest */.    i
f6b0: 6e 74 20 62 65 73 74 4a 20 3d 20 30 3b 20 20 20  nt bestJ = 0;   
f6c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
f6d0: 65 20 76 61 6c 75 65 20 6f 66 20 6a 20 2a 2f 0a  e value of j */.
f6e0: 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 20 20      Bitmask m;  
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f700: 2f 2a 20 42 69 74 6d 61 73 6b 20 76 61 6c 75 65  /* Bitmask value
f710: 20 66 6f 72 20 6a 20 6f 72 20 62 65 73 74 4a 20   for j or bestJ 
f720: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20  */.    int once 
f730: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f740: 20 20 20 2f 2a 20 54 72 75 65 20 77 68 65 6e 20     /* True when 
f750: 66 69 72 73 74 20 74 61 62 6c 65 20 69 73 20 73  first table is s
f760: 65 65 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  een */.    sqlit
f770: 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
f780: 42 65 73 74 49 6e 64 65 78 20 3d 20 30 3b 0a 20  BestIndex = 0;. 
f790: 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78     sqlite3_index
f7a0: 5f 69 6e 66 6f 20 2a 70 49 6e 64 65 78 20 3d 20  _info *pIndex = 
f7b0: 30 3b 0a 0a 20 20 20 20 6c 6f 77 65 73 74 43 6f  0;..    lowestCo
f7c0: 73 74 20 3d 20 53 51 4c 49 54 45 5f 42 49 47 5f  st = SQLITE_BIG_
f7d0: 44 42 4c 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69  DBL;.    for(j=i
f7e0: 46 72 6f 6d 2c 20 70 54 61 62 49 74 65 6d 3d 26  From, pTabItem=&
f7f0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 6a 5d 3b 20  pTabList->a[j]; 
f800: 6a 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  j<pTabList->nSrc
f810: 3b 20 6a 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b  ; j++, pTabItem+
f820: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 6f  +){.      int do
f830: 4e 6f 74 52 65 6f 72 64 65 72 3b 20 20 2f 2a 20  NotReorder;  /* 
f840: 54 72 75 65 20 69 66 20 74 68 69 73 20 74 61 62  True if this tab
f850: 6c 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  le should not be
f860: 20 72 65 6f 72 64 65 72 65 64 20 2a 2f 0a 0a 20   reordered */.. 
f870: 20 20 20 20 20 64 6f 4e 6f 74 52 65 6f 72 64 65       doNotReorde
f880: 72 20 3d 20 20 28 70 54 61 62 49 74 65 6d 2d 3e  r =  (pTabItem->
f890: 6a 6f 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c  jointype & (JT_L
f8a0: 45 46 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d  EFT|JT_CROSS))!=
f8b0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
f8c0: 20 20 20 20 20 7c 7c 20 28 6a 3e 30 20 26 26 20       || (j>0 && 
f8d0: 28 70 54 61 62 49 74 65 6d 5b 2d 31 5d 2e 6a 6f  (pTabItem[-1].jo
f8e0: 69 6e 74 79 70 65 20 26 20 28 4a 54 5f 4c 45 46  intype & (JT_LEF
f8f0: 54 7c 4a 54 5f 43 52 4f 53 53 29 29 21 3d 30 29  T|JT_CROSS))!=0)
f900: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65  ;.      if( once
f910: 20 26 26 20 64 6f 4e 6f 74 52 65 6f 72 64 65 72   && doNotReorder
f920: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
f930: 6d 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73  m = getMask(&mas
f940: 6b 53 65 74 2c 20 70 54 61 62 49 74 65 6d 2d 3e  kSet, pTabItem->
f950: 69 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  iCursor);.      
f960: 69 66 28 20 28 6d 20 26 20 6e 6f 74 52 65 61 64  if( (m & notRead
f970: 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  y)==0 ){.       
f980: 20 69 66 28 20 6a 3d 3d 69 46 72 6f 6d 20 29 20   if( j==iFrom ) 
f990: 69 46 72 6f 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  iFrom++;.       
f9a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
f9b0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
f9c0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 20   pTabItem->pTab 
f9d0: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
f9e0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
f9f0: 42 4c 45 0a 20 20 20 20 20 20 69 66 28 20 49 73  BLE.      if( Is
fa00: 56 69 72 74 75 61 6c 28 70 54 61 62 49 74 65 6d  Virtual(pTabItem
fa10: 2d 3e 70 54 61 62 29 20 29 7b 0a 20 20 20 20 20  ->pTab) ){.     
fa20: 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 56 69     cost = bestVi
fa30: 72 74 75 61 6c 49 6e 64 65 78 28 70 50 61 72 73  rtualIndex(pPars
fa40: 65 2c 20 26 77 63 2c 20 70 54 61 62 49 74 65 6d  e, &wc, pTabItem
fa50: 2c 20 6e 6f 74 52 65 61 64 79 2c 0a 20 20 20 20  , notReady,.    
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 70 70 4f 72              ppOr
fa80: 64 65 72 42 79 20 3f 20 2a 70 70 4f 72 64 65 72  derBy ? *ppOrder
fa90: 42 79 20 3a 20 30 2c 20 69 3d 3d 30 2c 0a 20 20  By : 0, i==0,.  
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
fac0: 49 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  Index);.        
fad0: 66 6c 61 67 73 20 3d 20 57 48 45 52 45 5f 56 49  flags = WHERE_VI
fae0: 52 54 55 41 4c 54 41 42 4c 45 3b 0a 20 20 20 20  RTUALTABLE;.    
faf0: 20 20 20 20 69 66 28 20 70 49 6e 64 65 78 20 26      if( pIndex &
fb00: 26 20 70 49 6e 64 65 78 2d 3e 6f 72 64 65 72 42  & pIndex->orderB
fb10: 79 43 6f 6e 73 75 6d 65 64 20 29 7b 0a 20 20 20  yConsumed ){.   
fb20: 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 57         flags = W
fb30: 48 45 52 45 5f 56 49 52 54 55 41 4c 54 41 42 4c  HERE_VIRTUALTABL
fb40: 45 20 7c 20 57 48 45 52 45 5f 4f 52 44 45 52 42  E | WHERE_ORDERB
fb50: 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  Y;.        }.   
fb60: 20 20 20 20 20 70 49 64 78 20 3d 20 30 3b 0a 20       pIdx = 0;. 
fb70: 20 20 20 20 20 20 20 6e 45 71 20 3d 20 30 3b 0a         nEq = 0;.
fb80: 20 20 20 20 20 20 7d 65 6c 73 65 20 0a 23 65 6e        }else .#en
fb90: 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  dif.      {.    
fba0: 20 20 20 20 63 6f 73 74 20 3d 20 62 65 73 74 49      cost = bestI
fbb0: 6e 64 65 78 28 70 50 61 72 73 65 2c 20 26 77 63  ndex(pParse, &wc
fbc0: 2c 20 70 54 61 62 49 74 65 6d 2c 20 6e 6f 74 52  , pTabItem, notR
fbd0: 65 61 64 79 2c 0a 20 20 20 20 20 20 20 20 20 20  eady,.          
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
fbf0: 69 3d 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42  i==0 && ppOrderB
fc00: 79 29 20 3f 20 2a 70 70 4f 72 64 65 72 42 79 20  y) ? *ppOrderBy 
fc10: 3a 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : 0,.           
fc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70                &p
fc30: 49 64 78 2c 20 26 66 6c 61 67 73 2c 20 26 6e 45  Idx, &flags, &nE
fc40: 71 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  q);.      }.    
fc50: 20 20 69 66 28 20 63 6f 73 74 3c 6c 6f 77 65 73    if( cost<lowes
fc60: 74 43 6f 73 74 20 29 7b 0a 20 20 20 20 20 20 20  tCost ){.       
fc70: 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 20   once = 1;.     
fc80: 20 20 20 6c 6f 77 65 73 74 43 6f 73 74 20 3d 20     lowestCost = 
fc90: 63 6f 73 74 3b 0a 20 20 20 20 20 20 20 20 70 42  cost;.        pB
fca0: 65 73 74 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  est = pIdx;.    
fcb0: 20 20 20 20 62 65 73 74 46 6c 61 67 73 20 3d 20      bestFlags = 
fcc0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 62  flags;.        b
fcd0: 65 73 74 4e 45 71 20 3d 20 6e 45 71 3b 0a 20 20  estNEq = nEq;.  
fce0: 20 20 20 20 20 20 62 65 73 74 4a 20 3d 20 6a 3b        bestJ = j;
fcf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fd00: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fd10: 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  E.        sqlite
fd20: 46 72 65 65 28 70 42 65 73 74 49 6e 64 65 78 29  Free(pBestIndex)
fd30: 3b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 49  ;.        pBestI
fd40: 6e 64 65 78 20 3d 20 70 49 6e 64 65 78 3b 0a 20  ndex = pIndex;. 
fd50: 20 20 20 20 20 20 20 70 49 6e 64 65 78 20 3d 20         pIndex = 
fd60: 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
fd70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
fd80: 65 65 28 70 49 6e 64 65 78 29 3b 0a 20 20 20 20  ee(pIndex);.    
fd90: 20 20 20 20 70 49 6e 64 65 78 20 3d 20 30 3b 0a      pIndex = 0;.
fda0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
fdb0: 20 20 20 20 20 69 66 28 20 64 6f 4e 6f 74 52 65       if( doNotRe
fdc0: 6f 72 64 65 72 20 29 20 62 72 65 61 6b 3b 0a 20  order ) break;. 
fdd0: 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45 28 28     }.    TRACE((
fde0: 22 2a 2a 2a 20 4f 70 74 69 6d 69 7a 65 72 20 63  "*** Optimizer c
fdf0: 68 6f 6f 73 65 20 74 61 62 6c 65 20 25 64 20 66  hoose table %d f
fe00: 6f 72 20 6c 6f 6f 70 20 25 64 5c 6e 22 2c 20 62  or loop %d\n", b
fe10: 65 73 74 4a 2c 0a 20 20 20 20 20 20 20 20 20 20  estJ,.          
fe20: 20 70 4c 65 76 65 6c 2d 70 57 49 6e 66 6f 2d 3e   pLevel-pWInfo->
fe30: 61 29 29 3b 0a 20 20 20 20 69 66 28 20 28 62 65  a));.    if( (be
fe40: 73 74 46 6c 61 67 73 20 26 20 57 48 45 52 45 5f  stFlags & WHERE_
fe50: 4f 52 44 45 52 42 59 29 21 3d 30 20 29 7b 0a 20  ORDERBY)!=0 ){. 
fe60: 20 20 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20       *ppOrderBy 
fe70: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  = 0;.    }.    a
fe80: 6e 64 46 6c 61 67 73 20 26 3d 20 62 65 73 74 46  ndFlags &= bestF
fe90: 6c 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c  lags;.    pLevel
fea0: 2d 3e 66 6c 61 67 73 20 3d 20 62 65 73 74 46 6c  ->flags = bestFl
feb0: 61 67 73 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d  ags;.    pLevel-
fec0: 3e 70 49 64 78 20 3d 20 70 42 65 73 74 3b 0a 20  >pIdx = pBest;. 
fed0: 20 20 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 20 3d     pLevel->nEq =
fee0: 20 62 65 73 74 4e 45 71 3b 0a 20 20 20 20 70 4c   bestNEq;.    pL
fef0: 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f 70 20 3d 20  evel->aInLoop = 
ff00: 30 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6e  0;.    pLevel->n
ff10: 49 6e 20 3d 20 30 3b 0a 20 20 20 20 70 4c 65 76  In = 0;.    pLev
ff20: 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 20 3d 20 70  el->pIdxInfo = p
ff30: 42 65 73 74 49 6e 64 65 78 3b 0a 20 20 20 20 69  BestIndex;.    i
ff40: 66 28 20 70 42 65 73 74 20 29 7b 0a 20 20 20 20  f( pBest ){.    
ff50: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
ff60: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
ff70: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
ff80: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
ff90: 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 7d  xCur = -1;.    }
ffa0: 0a 20 20 20 20 6e 6f 74 52 65 61 64 79 20 26 3d  .    notReady &=
ffb0: 20 7e 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53   ~getMask(&maskS
ffc0: 65 74 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b  et, pTabList->a[
ffd0: 62 65 73 74 4a 5d 2e 69 43 75 72 73 6f 72 29 3b  bestJ].iCursor);
ffe0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 46 72  .    pLevel->iFr
fff0: 6f 6d 20 3d 20 62 65 73 74 4a 3b 0a 20 20 7d 0a  om = bestJ;.  }.
10000 20 20 54 52 41 43 45 28 28 22 2a 2a 2a 20 4f 70    TRACE(("*** Op
10010 74 69 6d 69 7a 65 72 20 46 69 6e 69 73 68 65 64  timizer Finished
10020 20 2a 2a 2a 5c 6e 22 29 29 3b 0a 0a 20 20 2f 2a   ***\n"));..  /*
10030 20 49 66 20 74 68 65 20 74 6f 74 61 6c 20 71 75   If the total qu
10040 65 72 79 20 6f 6e 6c 79 20 73 65 6c 65 63 74 73  ery only selects
10050 20 61 20 73 69 6e 67 6c 65 20 72 6f 77 2c 20 74   a single row, t
10060 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
10070 0a 20 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20  .  ** clause is 
10080 69 72 72 65 6c 65 76 61 6e 74 2e 0a 20 20 2a 2f  irrelevant..  */
10090 0a 20 20 69 66 28 20 28 61 6e 64 46 6c 61 67 73  .  if( (andFlags
100a0 20 26 20 57 48 45 52 45 5f 55 4e 49 51 55 45 29   & WHERE_UNIQUE)
100b0 21 3d 30 20 26 26 20 70 70 4f 72 64 65 72 42 79  !=0 && ppOrderBy
100c0 20 29 7b 0a 20 20 20 20 2a 70 70 4f 72 64 65 72   ){.    *ppOrder
100d0 42 79 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  By = 0;.  }..  /
100e0 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65  * Open all table
100f0 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73  s in the pTabLis
10100 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65  t and any indice
10110 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20  s selected for. 
10120 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68   ** searching th
10130 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f  ose tables..  */
10140 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65  .  sqlite3CodeVe
10150 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
10160 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72  e, -1); /* Inser
10170 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72  t the cookie ver
10180 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20  ifier Goto */.  
10190 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
101a0 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  >a;.  for(i=0, p
101b0 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b  Level=pWInfo->a;
101c0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
101d0 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b  c; i++, pLevel++
101e0 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  ){.    Table *pT
101f0 61 62 3b 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  ab;     /* Table
10200 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
10210 49 6e 64 65 78 20 2a 70 49 78 3b 20 20 20 20 20  Index *pIx;     
10220 20 2f 2a 20 49 6e 64 65 78 20 75 73 65 64 20 74   /* Index used t
10230 6f 20 61 63 63 65 73 73 20 70 54 61 62 20 28 69  o access pTab (i
10240 66 20 61 6e 79 29 20 2a 2f 0a 20 20 20 20 69 6e  f any) */.    in
10250 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 2f  t iDb;         /
10260 2a 20 49 6e 64 65 78 20 6f 66 20 64 61 74 61 62  * Index of datab
10270 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
10280 61 62 6c 65 2f 69 6e 64 65 78 20 2a 2f 0a 20 20  able/index */.  
10290 20 20 69 6e 74 20 69 49 64 78 43 75 72 20 3d 20    int iIdxCur = 
102a0 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b  pLevel->iIdxCur;
102b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
102c0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 20 20  _OMIT_EXPLAIN.  
102d0 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78    if( pParse->ex
102e0 70 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20  plain==2 ){.    
102f0 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20    char *zMsg;.  
10300 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
10310 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
10320 20 26 70 54 61 62 4c 69 73 74 2d 3e 61 5b 70 4c   &pTabList->a[pL
10330 65 76 65 6c 2d 3e 69 46 72 6f 6d 5d 3b 0a 20 20  evel->iFrom];.  
10340 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74      zMsg = sqlit
10350 65 33 4d 50 72 69 6e 74 66 28 22 54 41 42 4c 45  e3MPrintf("TABLE
10360 20 25 73 22 2c 20 70 49 74 65 6d 2d 3e 7a 4e 61   %s", pItem->zNa
10370 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
10380 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
10390 20 20 20 20 20 20 20 20 7a 4d 73 67 20 3d 20 73          zMsg = s
103a0 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 22 25  qlite3MPrintf("%
103b0 7a 20 41 53 20 25 73 22 2c 20 7a 4d 73 67 2c 20  z AS %s", zMsg, 
103c0 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a  pItem->zAlias);.
103d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
103e0 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
103f0 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
10400 20 20 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69       zMsg = sqli
10410 74 65 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 57  te3MPrintf("%z W
10420 49 54 48 20 49 4e 44 45 58 20 25 73 22 2c 20 7a  ITH INDEX %s", z
10430 4d 73 67 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65 29  Msg, pIx->zName)
10440 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
10450 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20  ( pLevel->flags 
10460 26 20 28 57 48 45 52 45 5f 52 4f 57 49 44 5f 45  & (WHERE_ROWID_E
10470 51 7c 57 48 45 52 45 5f 52 4f 57 49 44 5f 52 41  Q|WHERE_ROWID_RA
10480 4e 47 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NGE) ){.        
10490 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  zMsg = sqlite3MP
104a0 72 69 6e 74 66 28 22 25 7a 20 55 53 49 4e 47 20  rintf("%z USING 
104b0 50 52 49 4d 41 52 59 20 4b 45 59 22 2c 20 7a 4d  PRIMARY KEY", zM
104c0 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  sg);.      }.#if
104d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
104e0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
104f0 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65      else if( pLe
10500 76 65 6c 2d 3e 70 49 64 78 49 6e 66 6f 20 29 7b  vel->pIdxInfo ){
10510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10520 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70 49 64  _index_info *pId
10530 78 49 6e 66 6f 20 3d 20 70 4c 65 76 65 6c 2d 3e  xInfo = pLevel->
10540 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pIdxInfo;.      
10550 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
10560 4d 50 72 69 6e 74 66 28 22 25 7a 20 56 49 52 54  MPrintf("%z VIRT
10570 55 41 4c 20 54 41 42 4c 45 20 49 4e 44 45 58 20  UAL TABLE INDEX 
10580 25 64 3a 25 73 22 2c 0a 20 20 20 20 20 20 20 20  %d:%s",.        
10590 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
105a0 49 6e 66 6f 2d 3e 69 64 78 4e 75 6d 2c 20 70 49  Info->idxNum, pI
105b0 64 78 49 6e 66 6f 2d 3e 69 64 78 53 74 72 29 3b  dxInfo->idxStr);
105c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
105d0 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c        if( pLevel
105e0 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f  ->flags & WHERE_
105f0 4f 52 44 45 52 42 59 20 29 7b 0a 20 20 20 20 20  ORDERBY ){.     
10600 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65     zMsg = sqlite
10610 33 4d 50 72 69 6e 74 66 28 22 25 7a 20 4f 52 44  3MPrintf("%z ORD
10620 45 52 20 42 59 22 2c 20 7a 4d 73 67 29 3b 0a 20  ER BY", zMsg);. 
10630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
10640 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
10650 50 5f 45 78 70 6c 61 69 6e 2c 20 69 2c 20 70 4c  P_Explain, i, pL
10660 65 76 65 6c 2d 3e 69 46 72 6f 6d 2c 20 7a 4d 73  evel->iFrom, zMs
10670 67 2c 20 50 33 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P3_DYNAMIC);.
10680 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
10690 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
106a0 41 49 4e 20 2a 2f 0a 20 20 20 20 70 54 61 62 49  AIN */.    pTabI
106b0 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73 74 2d  tem = &pTabList-
106c0 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72 6f 6d  >a[pLevel->iFrom
106d0 5d 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54  ];.    pTab = pT
106e0 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  abItem->pTab;.  
106f0 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53    iDb = sqlite3S
10700 63 68 65 6d 61 54 6f 49 6e 64 65 78 28 70 50 61  chemaToIndex(pPa
10710 72 73 65 2d 3e 64 62 2c 20 70 54 61 62 2d 3e 70  rse->db, pTab->p
10720 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
10730 20 70 54 61 62 2d 3e 69 73 45 70 68 65 6d 20 7c   pTab->isEphem |
10740 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
10750 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e  ) continue;.#ifn
10760 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10770 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
10780 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64   if( pLevel->pId
10790 78 49 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 69  xInfo ){.      i
107a0 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
107b0 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
107c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
107d0 33 28 76 2c 20 4f 50 5f 56 4f 70 65 6e 2c 20 69  3(v, OP_VOpen, i
107e0 43 75 72 2c 20 30 2c 20 28 63 6f 6e 73 74 20 63  Cur, 0, (const c
107f0 68 61 72 2a 29 70 54 61 62 2d 3e 70 56 74 61 62  har*)pTab->pVtab
10800 2c 20 50 33 5f 56 54 41 42 29 3b 0a 20 20 20 20  , P3_VTAB);.    
10810 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
10820 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c   if( (pLevel->fl
10830 61 67 73 20 26 20 57 48 45 52 45 5f 49 44 58 5f  ags & WHERE_IDX_
10840 4f 4e 4c 59 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ONLY)==0 ){.    
10850 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62    sqlite3OpenTab
10860 6c 65 28 70 50 61 72 73 65 2c 20 70 54 61 62 49  le(pParse, pTabI
10870 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 69 44  tem->iCursor, iD
10880 62 2c 20 70 54 61 62 2c 20 4f 50 5f 4f 70 65 6e  b, pTab, OP_Open
10890 52 65 61 64 29 3b 0a 20 20 20 20 20 20 69 66 28  Read);.      if(
108a0 20 70 54 61 62 2d 3e 6e 43 6f 6c 3c 28 73 69 7a   pTab->nCol<(siz
108b0 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 29 20  eof(Bitmask)*8) 
108c0 29 7b 0a 20 20 20 20 20 20 20 20 42 69 74 6d 61  ){.        Bitma
108d0 73 6b 20 62 20 3d 20 70 54 61 62 49 74 65 6d 2d  sk b = pTabItem-
108e0 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 20 20 20 20  >colUsed;.      
108f0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
10900 20 20 20 20 20 66 6f 72 28 3b 20 62 3b 20 62 3d       for(; b; b=
10910 62 3e 3e 31 2c 20 6e 2b 2b 29 7b 7d 0a 20 20 20  b>>1, n++){}.   
10920 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
10930 43 68 61 6e 67 65 50 32 28 76 2c 20 73 71 6c 69  ChangeP2(v, sqli
10940 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
10950 64 72 28 76 29 2d 31 2c 20 6e 29 3b 0a 20 20 20  dr(v)-1, n);.   
10960 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 3c 3d       assert( n<=
10970 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
10980 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
10990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 61  .      sqlite3Ta
109a0 62 6c 65 4c 6f 63 6b 28 70 50 61 72 73 65 2c 20  bleLock(pParse, 
109b0 69 44 62 2c 20 70 54 61 62 2d 3e 74 6e 75 6d 2c  iDb, pTab->tnum,
109c0 20 30 2c 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 29   0, pTab->zName)
109d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76  ;.    }.    pLev
109e0 65 6c 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54  el->iTabCur = pT
109f0 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b  abItem->iCursor;
10a00 0a 20 20 20 20 69 66 28 20 28 70 49 78 20 3d 20  .    if( (pIx = 
10a10 70 4c 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30  pLevel->pIdx)!=0
10a20 20 29 7b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   ){.      KeyInf
10a30 6f 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  o *pKey = sqlite
10a40 33 49 6e 64 65 78 4b 65 79 69 6e 66 6f 28 70 50  3IndexKeyinfo(pP
10a50 61 72 73 65 2c 20 70 49 78 29 3b 0a 20 20 20 20  arse, pIx);.    
10a60 20 20 61 73 73 65 72 74 28 20 70 49 78 2d 3e 70    assert( pIx->p
10a70 53 63 68 65 6d 61 3d 3d 70 54 61 62 2d 3e 70 53  Schema==pTab->pS
10a80 63 68 65 6d 61 20 29 3b 0a 20 20 20 20 20 20 73  chema );.      s
10a90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10aa0 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
10ab0 44 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64  Db, 0);.      Vd
10ac0 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
10ad0 20 25 73 22 2c 20 70 49 78 2d 3e 7a 4e 61 6d 65   %s", pIx->zName
10ae0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
10af0 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f  3VdbeOp3(v, OP_O
10b00 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43 75 72  penRead, iIdxCur
10b10 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20  , pIx->tnum,.   
10b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b30 20 20 28 63 68 61 72 2a 29 70 4b 65 79 2c 20 50    (char*)pKey, P
10b40 33 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46  3_KEYINFO_HANDOF
10b50 46 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  F);.    }.    if
10b60 28 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73  ( (pLevel->flags
10b70 20 26 20 57 48 45 52 45 5f 49 44 58 5f 4f 4e 4c   & WHERE_IDX_ONL
10b80 59 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  Y)!=0 ){.      s
10b90 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
10ba0 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
10bb0 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49  mns, iIdxCur, pI
10bc0 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20  x->nColumn+1);. 
10bd0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
10be0 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
10bf0 28 70 50 61 72 73 65 2c 20 69 44 62 29 3b 0a 20  (pParse, iDb);. 
10c00 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54 6f   }.  pWInfo->iTo
10c10 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  p = sqlite3VdbeC
10c20 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 0a  urrentAddr(v);..
10c30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
10c40 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68 65  e code to do the
10c50 20 73 65 61 72 63 68 2e 20 20 45 61 63 68 20 69   search.  Each i
10c60 74 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  teration of the 
10c70 66 6f 72 0a 20 20 2a 2a 20 6c 6f 6f 70 20 62 65  for.  ** loop be
10c80 6c 6f 77 20 67 65 6e 65 72 61 74 65 73 20 63 6f  low generates co
10c90 64 65 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  de for a single 
10ca0 6e 65 73 74 65 64 20 6c 6f 6f 70 20 6f 66 20 74  nested loop of t
10cb0 68 65 20 56 4d 0a 20 20 2a 2a 20 70 72 6f 67 72  he VM.  ** progr
10cc0 61 6d 2e 0a 20 20 2a 2f 0a 20 20 6e 6f 74 52 65  am..  */.  notRe
10cd0 61 64 79 20 3d 20 7e 28 42 69 74 6d 61 73 6b 29  ady = ~(Bitmask)
10ce0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4c  0;.  for(i=0, pL
10cf0 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e 61 3b 20  evel=pWInfo->a; 
10d00 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  i<pTabList->nSrc
10d10 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29  ; i++, pLevel++)
10d20 7b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20  {.    int j;.   
10d30 20 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62   int iCur = pTab
10d40 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20  Item->iCursor;  
10d50 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72 73  /* The VDBE curs
10d60 6f 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  or for the table
10d70 20 2a 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70   */.    Index *p
10d80 49 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Idx;       /* Th
10d90 65 20 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20  e index we will 
10da0 62 65 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20  be using */.    
10db0 69 6e 74 20 69 49 64 78 43 75 72 3b 20 20 20 20  int iIdxCur;    
10dc0 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63     /* The VDBE c
10dd0 75 72 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e  ursor for the in
10de0 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  dex */.    int o
10df0 6d 69 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a  mitTable;     /*
10e00 20 54 72 75 65 20 69 66 20 77 65 20 75 73 65 20   True if we use 
10e10 74 68 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a  the index only *
10e20 2f 0a 20 20 20 20 69 6e 74 20 62 52 65 76 3b 20  /.    int bRev; 
10e30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10e40 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 73   if we need to s
10e50 63 61 6e 20 69 6e 20 72 65 76 65 72 73 65 20 6f  can in reverse o
10e60 72 64 65 72 20 2a 2f 0a 0a 20 20 20 20 70 54 61  rder */..    pTa
10e70 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69 73  bItem = &pTabLis
10e80 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46 72  t->a[pLevel->iFr
10e90 6f 6d 5d 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  om];.    iCur = 
10ea0 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pTabItem->iCurso
10eb0 72 3b 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c  r;.    pIdx = pL
10ec0 65 76 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20  evel->pIdx;.    
10ed0 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c  iIdxCur = pLevel
10ee0 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20 62  ->iIdxCur;.    b
10ef0 52 65 76 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  Rev = (pLevel->f
10f00 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 45 56  lags & WHERE_REV
10f10 45 52 53 45 29 21 3d 30 3b 0a 20 20 20 20 6f 6d  ERSE)!=0;.    om
10f20 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
10f30 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
10f40 5f 49 44 58 5f 4f 4e 4c 59 29 21 3d 30 3b 0a 0a  _IDX_ONLY)!=0;..
10f50 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6c 61      /* Create la
10f60 62 65 6c 73 20 66 6f 72 20 74 68 65 20 22 62 72  bels for the "br
10f70 65 61 6b 22 20 61 6e 64 20 22 63 6f 6e 74 69 6e  eak" and "contin
10f80 75 65 22 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ue" instructions
10f90 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
10fa0 63 75 72 72 65 6e 74 20 6c 6f 6f 70 2e 20 20 4a  current loop.  J
10fb0 75 6d 70 20 74 6f 20 62 72 6b 20 74 6f 20 62 72  ump to brk to br
10fc0 65 61 6b 20 6f 75 74 20 6f 66 20 61 20 6c 6f 6f  eak out of a loo
10fd0 70 2e 0a 20 20 20 20 2a 2a 20 4a 75 6d 70 20 74  p..    ** Jump t
10fe0 6f 20 63 6f 6e 74 20 74 6f 20 67 6f 20 69 6d 6d  o cont to go imm
10ff0 65 64 69 61 74 65 6c 79 20 74 6f 20 74 68 65 20  ediately to the 
11000 6e 65 78 74 20 69 74 65 72 61 74 69 6f 6e 20 6f  next iteration o
11010 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f  f the.    ** loo
11020 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 62 72  p..    */.    br
11030 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20  k = pLevel->brk 
11040 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
11050 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 63  eLabel(v);.    c
11060 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
11070 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
11080 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
11090 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
110a0 20 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65   the right table
110b0 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
110c0 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20   JOIN, allocate 
110d0 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69  and.    ** initi
110e0 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63  alize a memory c
110f0 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73  ell that records
11100 20 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d   if this table m
11110 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a  atches any.    *
11120 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66  * row of the lef
11130 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a  t table of the j
11140 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  oin..    */.    
11150 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 46 72 6f  if( pLevel->iFro
11160 6d 3e 30 20 26 26 20 28 70 54 61 62 49 74 65 6d  m>0 && (pTabItem
11170 5b 2d 31 5d 2e 6a 6f 69 6e 74 79 70 65 20 26 20  [-1].jointype & 
11180 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a 20  JT_LEFT)!=0 ){. 
11190 20 20 20 20 20 69 66 28 20 21 70 50 61 72 73 65       if( !pParse
111a0 2d 3e 6e 4d 65 6d 20 29 20 70 50 61 72 73 65 2d  ->nMem ) pParse-
111b0 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  >nMem++;.      p
111c0 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
111d0 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
111e0 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  +;.      sqlite3
111f0 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11200 4d 65 6d 49 6e 74 2c 20 30 2c 20 70 4c 65 76 65  MemInt, 0, pLeve
11210 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29 3b 0a 20  l->iLeftJoin);. 
11220 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
11230 28 28 76 2c 20 22 23 20 69 6e 69 74 20 4c 45 46  ((v, "# init LEF
11240 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74 63 68 20  T JOIN no-match 
11250 66 6c 61 67 22 29 29 3b 0a 20 20 20 20 7d 0a 0a  flag"));.    }..
11260 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11270 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
11280 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
11290 3e 70 49 64 78 49 6e 66 6f 20 29 7b 0a 20 20 20  >pIdxInfo ){.   
112a0 20 20 20 2f 2a 20 43 61 73 65 20 30 3a 20 20 54     /* Case 0:  T
112b0 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 76 69  he table is a vi
112c0 72 74 75 61 6c 2d 74 61 62 6c 65 2e 20 20 55 73  rtual-table.  Us
112d0 65 20 74 68 65 20 56 46 69 6c 74 65 72 20 61 6e  e the VFilter an
112e0 64 20 56 4e 65 78 74 0a 20 20 20 20 20 20 2a 2a  d VNext.      **
112f0 20 20 20 20 20 20 20 20 20 20 74 6f 20 61 63 63            to acc
11300 65 73 73 20 74 68 65 20 64 61 74 61 2e 0a 20 20  ess the data..  
11310 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
11320 20 69 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ii;.      sqlit
11330 65 33 5f 69 6e 64 65 78 5f 69 6e 66 6f 20 2a 70  e3_index_info *p
11340 49 64 78 49 6e 66 6f 20 3d 20 70 4c 65 76 65 6c  IdxInfo = pLevel
11350 2d 3e 70 49 64 78 49 6e 66 6f 3b 0a 20 20 20 20  ->pIdxInfo;.    
11360 20 20 69 6e 74 20 6e 43 6f 6e 73 74 72 61 69 6e    int nConstrain
11370 74 20 3d 20 70 49 64 78 49 6e 66 6f 2d 3e 6e 43  t = pIdxInfo->nC
11380 6f 6e 73 74 72 61 69 6e 74 3b 0a 20 20 20 20 20  onstraint;.     
11390 20 73 74 72 75 63 74 20 73 71 6c 69 74 65 33 5f   struct sqlite3_
113a0 69 6e 64 65 78 5f 63 6f 6e 73 74 72 61 69 6e 74  index_constraint
113b0 5f 75 73 61 67 65 20 2a 61 55 73 61 67 65 20 3d  _usage *aUsage =
113c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113f0 20 20 20 70 49 64 78 49 6e 66 6f 2d 3e 61 43 6f     pIdxInfo->aCo
11400 6e 73 74 72 61 69 6e 74 55 73 61 67 65 3b 0a 20  nstraintUsage;. 
11410 20 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 63       const struc
11420 74 20 73 71 6c 69 74 65 33 5f 69 6e 64 65 78 5f  t sqlite3_index_
11430 63 6f 6e 73 74 72 61 69 6e 74 20 2a 61 43 6f 6e  constraint *aCon
11440 73 74 72 61 69 6e 74 20 3d 0a 20 20 20 20 20 20  straint =.      
11450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 20 20 20 20 20 20 20 70 49 64 78              pIdx
11480 49 6e 66 6f 2d 3e 61 43 6f 6e 73 74 72 61 69 6e  Info->aConstrain
11490 74 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 69  t;..      for(ii
114a0 3d 31 3b 20 69 69 3c 3d 6e 43 6f 6e 73 74 72 61  =1; ii<=nConstra
114b0 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  int; ii++){.    
114c0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
114d0 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43     for(j=0; j<nC
114e0 6f 6e 73 74 72 61 69 6e 74 3b 20 6a 2b 2b 29 7b  onstraint; j++){
114f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
11500 55 73 61 67 65 5b 6a 5d 2e 61 72 67 76 49 6e 64  Usage[j].argvInd
11510 65 78 3d 3d 69 69 20 29 7b 0a 20 20 20 20 20 20  ex==ii ){.      
11520 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 61 43        int k = aC
11530 6f 6e 73 74 72 61 69 6e 74 5b 6a 5d 2e 69 54 65  onstraint[j].iTe
11540 72 6d 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  rmOffset;.      
11550 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
11560 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 77 63  rCode(pParse, wc
11570 2e 61 5b 6b 5d 2e 70 45 78 70 72 2d 3e 70 52 69  .a[k].pExpr->pRi
11580 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
11590 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
115a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
115b0 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 43         if( j==nC
115c0 6f 6e 73 74 72 61 69 6e 74 20 29 20 62 72 65 61  onstraint ) brea
115d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
115e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
115f0 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
11600 20 69 69 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20   ii-1, 0);.     
11610 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11620 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
11630 20 70 49 64 78 49 6e 66 6f 2d 3e 69 64 78 4e 75   pIdxInfo->idxNu
11640 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  m, 0);.      sql
11650 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
11660 50 5f 56 46 69 6c 74 65 72 2c 20 69 43 75 72 2c  P_VFilter, iCur,
11670 20 62 72 6b 2c 20 70 49 64 78 49 6e 66 6f 2d 3e   brk, pIdxInfo->
11680 69 64 78 53 74 72 2c 0a 20 20 20 20 20 20 20 20  idxStr,.        
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
116a0 64 78 49 6e 66 6f 2d 3e 6e 65 65 64 54 6f 46 72  dxInfo->needToFr
116b0 65 65 49 64 78 53 74 72 20 3f 20 50 33 5f 4d 50  eeIdxStr ? P3_MP
116c0 52 49 4e 54 46 20 3a 20 50 33 5f 53 54 41 54 49  RINTF : P3_STATI
116d0 43 29 3b 0a 20 20 20 20 20 20 70 49 64 78 49 6e  C);.      pIdxIn
116e0 66 6f 2d 3e 6e 65 65 64 54 6f 46 72 65 65 49 64  fo->needToFreeId
116f0 78 53 74 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  xStr = 0;.      
11700 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 49 64  for(ii=0; ii<pId
11710 78 49 6e 66 6f 2d 3e 6e 43 6f 6e 73 74 72 61 69  xInfo->nConstrai
11720 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  nt; ii++){.     
11730 20 20 20 69 66 28 20 70 49 64 78 49 6e 66 6f 2d     if( pIdxInfo-
11740 3e 61 43 6f 6e 73 74 72 61 69 6e 74 55 73 61 67  >aConstraintUsag
11750 65 5b 69 69 5d 2e 6f 6d 69 74 20 29 7b 0a 20 20  e[ii].omit ){.  
11760 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
11770 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 77 63 2e  erm(pLevel, &wc.
11780 61 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  a[ii]);.        
11790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
117a0 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
117b0 56 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65  VNext;.      pLe
117c0 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a  vel->p1 = iCur;.
117d0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32        pLevel->p2
117e0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
117f0 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
11800 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
11810 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
11820 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 20  RTUALTABLE */.. 
11830 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66     if( pLevel->f
11840 6c 61 67 73 20 26 20 57 48 45 52 45 5f 52 4f 57  lags & WHERE_ROW
11850 49 44 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f  ID_EQ ){.      /
11860 2a 20 43 61 73 65 20 31 3a 20 20 57 65 20 63 61  * Case 1:  We ca
11870 6e 20 64 69 72 65 63 74 6c 79 20 72 65 66 65 72  n directly refer
11880 65 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 72 6f  ence a single ro
11890 77 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 20  w using an.     
118a0 20 2a 2a 20 20 20 20 20 20 20 20 20 20 65 71 75   **          equ
118b0 61 6c 69 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e  ality comparison
118c0 20 61 67 61 69 6e 73 74 20 74 68 65 20 52 4f 57   against the ROW
118d0 49 44 20 66 69 65 6c 64 2e 20 20 4f 72 0a 20 20  ID field.  Or.  
118e0 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
118f0 77 65 20 72 65 66 65 72 65 6e 63 65 20 6d 75 6c  we reference mul
11900 74 69 70 6c 65 20 72 6f 77 73 20 75 73 69 6e 67  tiple rows using
11910 20 61 20 22 72 6f 77 69 64 20 49 4e 20 28 2e 2e   a "rowid IN (..
11920 2e 29 22 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  .)".      **    
11930 20 20 20 20 20 20 63 6f 6e 73 74 72 75 63 74 2e        construct.
11940 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11950 70 54 65 72 6d 20 3d 20 66 69 6e 64 54 65 72 6d  pTerm = findTerm
11960 28 26 77 63 2c 20 69 43 75 72 2c 20 2d 31 2c 20  (&wc, iCur, -1, 
11970 6e 6f 74 52 65 61 64 79 2c 20 57 4f 5f 45 51 7c  notReady, WO_EQ|
11980 57 4f 5f 49 4e 2c 20 30 29 3b 0a 20 20 20 20 20  WO_IN, 0);.     
11990 20 61 73 73 65 72 74 28 20 70 54 65 72 6d 21 3d   assert( pTerm!=
119a0 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
119b0 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 21  t( pTerm->pExpr!
119c0 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
119d0 72 74 28 20 70 54 65 72 6d 2d 3e 6c 65 66 74 43  rt( pTerm->leftC
119e0 75 72 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20  ursor==iCur );. 
119f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69       assert( omi
11a00 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20  tTable==0 );.   
11a10 20 20 20 63 6f 64 65 45 71 75 61 6c 69 74 79 54     codeEqualityT
11a20 65 72 6d 28 70 50 61 72 73 65 2c 20 70 54 65 72  erm(pParse, pTer
11a30 6d 2c 20 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b  m, brk, pLevel);
11a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11a50 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75  beAddOp(v, OP_Mu
11a60 73 74 42 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29  stBeInt, 1, brk)
11a70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
11a80 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
11a90 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72 2c 20  otExists, iCur, 
11aa0 62 72 6b 29 3b 0a 20 20 20 20 20 20 56 64 62 65  brk);.      Vdbe
11ab0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22  Comment((v, "pk"
11ac0 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c  ));.      pLevel
11ad0 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  ->op = OP_Noop;.
11ae0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c      }else if( pL
11af0 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
11b00 45 52 45 5f 52 4f 57 49 44 5f 52 41 4e 47 45 20  ERE_ROWID_RANGE 
11b10 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65  ){.      /* Case
11b20 20 32 3a 20 20 57 65 20 68 61 76 65 20 61 6e 20   2:  We have an 
11b30 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61  inequality compa
11b40 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
11b50 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 0a 20  e ROWID field.. 
11b60 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
11b70 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f  t testOp = OP_No
11b80 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74  op;.      int st
11b90 61 72 74 3b 0a 20 20 20 20 20 20 57 68 65 72 65  art;.      Where
11ba0 54 65 72 6d 20 2a 70 53 74 61 72 74 2c 20 2a 70  Term *pStart, *p
11bb0 45 6e 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  End;..      asse
11bc0 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30  rt( omitTable==0
11bd0 20 29 3b 0a 20 20 20 20 20 20 70 53 74 61 72 74   );.      pStart
11be0 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
11bf0 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
11c00 61 64 79 2c 20 57 4f 5f 47 54 7c 57 4f 5f 47 45  ady, WO_GT|WO_GE
11c10 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 45 6e 64  , 0);.      pEnd
11c20 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
11c30 20 69 43 75 72 2c 20 2d 31 2c 20 6e 6f 74 52 65   iCur, -1, notRe
11c40 61 64 79 2c 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45  ady, WO_LT|WO_LE
11c50 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
11c60 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20  bRev ){.        
11c70 70 54 65 72 6d 20 3d 20 70 53 74 61 72 74 3b 0a  pTerm = pStart;.
11c80 20 20 20 20 20 20 20 20 70 53 74 61 72 74 20 3d          pStart =
11c90 20 70 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 70   pEnd;.        p
11ca0 45 6e 64 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20  End = pTerm;.   
11cb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
11cc0 53 74 61 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Start ){.       
11cd0 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20   Expr *pX;.     
11ce0 20 20 20 70 58 20 3d 20 70 53 74 61 72 74 2d 3e     pX = pStart->
11cf0 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 61  pExpr;.        a
11d00 73 73 65 72 74 28 20 70 58 21 3d 30 20 29 3b 0a  ssert( pX!=0 );.
11d10 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11d20 70 53 74 61 72 74 2d 3e 6c 65 66 74 43 75 72 73  pStart->leftCurs
11d30 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20  or==iCur );.    
11d40 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
11d50 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e  ode(pParse, pX->
11d60 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20  pRight);.       
11d70 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
11d80 70 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74  p(v, OP_ForceInt
11d90 2c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  , pX->op==TK_LE 
11da0 7c 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  || pX->op==TK_GT
11db0 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
11dc0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
11dd0 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f  (v, bRev ? OP_Mo
11de0 76 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65  veLt : OP_MoveGe
11df0 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
11e00 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
11e10 74 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20  t((v, "pk"));.  
11e20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
11e30 6d 28 70 4c 65 76 65 6c 2c 20 70 53 74 61 72 74  m(pLevel, pStart
11e40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11e50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
11e60 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76  dbeAddOp(v, bRev
11e70 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f 50 5f   ? OP_Last : OP_
11e80 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20 62 72  Rewind, iCur, br
11e90 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
11ea0 20 20 69 66 28 20 70 45 6e 64 20 29 7b 0a 20 20    if( pEnd ){.  
11eb0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
11ec0 20 20 20 20 20 20 20 20 70 58 20 3d 20 70 45 6e          pX = pEn
11ed0 64 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  d->pExpr;.      
11ee0 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
11ef0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
11f00 74 28 20 70 45 6e 64 2d 3e 6c 65 66 74 43 75 72  t( pEnd->leftCur
11f10 73 6f 72 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20  sor==iCur );.   
11f20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
11f30 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d  Code(pParse, pX-
11f40 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
11f50 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
11f60 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
11f70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11f80 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
11f90 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c  MemStore, pLevel
11fa0 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20  ->iMem, 1);.    
11fb0 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70 3d 3d      if( pX->op==
11fc0 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f 70 3d  TK_LT || pX->op=
11fd0 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20  =TK_GT ){.      
11fe0 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
11ff0 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50 5f 47  v ? OP_Le : OP_G
12000 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  e;.        }else
12010 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
12020 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
12030 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20 20 20  t : OP_Gt;.     
12040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 69 73     }.        dis
12050 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
12060 20 70 45 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a   pEnd);.      }.
12070 20 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71        start = sq
12080 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
12090 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70  Addr(v);.      p
120a0 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76  Level->op = bRev
120b0 20 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f   ? OP_Prev : OP_
120c0 4e 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76  Next;.      pLev
120d0 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
120e0 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
120f0 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  = start;.      i
12100 66 28 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f  f( testOp!=OP_No
12110 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  op ){.        sq
12120 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12130 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69 43 75 72  , OP_Rowid, iCur
12140 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
12150 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
12160 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c  , OP_MemLoad, pL
12170 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a  evel->iMem, 0);.
12180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12190 64 62 65 41 64 64 4f 70 28 76 2c 20 74 65 73 74  dbeAddOp(v, test
121a0 4f 70 2c 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  Op, SQLITE_AFF_N
121b0 55 4d 45 52 49 43 2c 20 62 72 6b 29 3b 0a 20 20  UMERIC, brk);.  
121c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
121d0 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
121e0 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
121f0 5f 52 41 4e 47 45 20 29 7b 0a 20 20 20 20 20 20  _RANGE ){.      
12200 2f 2a 20 43 61 73 65 20 33 3a 20 54 68 65 20 57  /* Case 3: The W
12210 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72 6d  HERE clause term
12220 20 74 68 61 74 20 72 65 66 65 72 73 20 74 6f 20   that refers to 
12230 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20  the right-most. 
12240 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
12250 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69 6e  column of the in
12260 64 65 78 20 69 73 20 61 6e 20 69 6e 65 71 75 61  dex is an inequa
12270 6c 69 74 79 2e 20 20 46 6f 72 20 65 78 61 6d 70  lity.  For examp
12280 6c 65 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a 20  le, if.      ** 
12290 20 20 20 20 20 20 20 20 74 68 65 20 69 6e 64 65          the inde
122a0 78 20 69 73 20 6f 6e 20 28 78 2c 79 2c 7a 29 20  x is on (x,y,z) 
122b0 61 6e 64 20 74 68 65 20 57 48 45 52 45 20 63 6c  and the WHERE cl
122c0 61 75 73 65 20 69 73 20 6f 66 20 74 68 65 0a 20  ause is of the. 
122d0 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
122e0 66 6f 72 6d 20 22 78 3d 35 20 41 4e 44 20 79 3c  form "x=5 AND y<
122f0 31 30 22 20 74 68 65 6e 20 74 68 69 73 20 63 61  10" then this ca
12300 73 65 20 69 73 20 75 73 65 64 2e 20 20 4f 6e 6c  se is used.  Onl
12310 79 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20  y the.      **  
12320 20 20 20 20 20 20 20 72 69 67 68 74 2d 6d 6f 73         right-mos
12330 74 20 63 6f 6c 75 6d 6e 20 63 61 6e 20 62 65 20  t column can be 
12340 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 2d 20  an inequality - 
12350 74 68 65 20 72 65 73 74 20 6d 75 73 74 0a 20 20  the rest must.  
12360 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 75      **         u
12370 73 65 20 74 68 65 20 22 3d 3d 22 20 61 6e 64 20  se the "==" and 
12380 22 49 4e 22 20 6f 70 65 72 61 74 6f 72 73 2e 0a  "IN" operators..
12390 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
123a0 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
123b0 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
123c0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
123d0 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
123e0 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
123f0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
12400 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
12410 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
12420 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
12430 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
12440 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
12450 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
12460 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
12470 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
12480 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
12490 20 6e 45 71 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e   nEq = pLevel->n
124a0 45 71 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f  Eq;.      int to
124b0 70 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a  pEq=0;        /*
124c0 20 54 72 75 65 20 69 66 20 74 6f 70 20 6c 69 6d   True if top lim
124d0 69 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73  it uses ==. Fals
124e0 65 20 69 73 20 73 74 72 69 63 74 6c 79 20 3c 20  e is strictly < 
124f0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62 74 6d  */.      int btm
12500 45 71 3d 30 3b 20 20 20 20 20 20 20 20 2f 2a 20  Eq=0;        /* 
12510 54 72 75 65 20 69 66 20 62 74 6d 20 6c 69 6d 69  True if btm limi
12520 74 20 75 73 65 73 20 3d 3d 2e 20 46 61 6c 73 65  t uses ==. False
12530 20 69 66 20 73 74 72 69 63 74 6c 79 20 3e 20 2a   if strictly > *
12540 2f 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4f  /.      int topO
12550 70 2c 20 62 74 6d 4f 70 3b 20 20 20 2f 2a 20 4f  p, btmOp;   /* O
12560 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
12570 20 74 6f 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20   top and bottom 
12580 73 65 61 72 63 68 20 62 6f 75 6e 64 73 20 2a 2f  search bounds */
12590 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f  .      int testO
125a0 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 6f  p;.      int nNo
125b0 74 4e 75 6c 6c 3b 20 20 20 20 20 20 20 2f 2a 20  tNull;       /* 
125c0 4e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 6f  Number of rows o
125d0 66 20 69 6e 64 65 78 20 74 68 61 74 20 6d 75 73  f index that mus
125e0 74 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 20 2a 2f  t be non-NULL */
125f0 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 70 4c 69  .      int topLi
12600 6d 69 74 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 66  mit = (pLevel->f
12610 6c 61 67 73 20 26 20 57 48 45 52 45 5f 54 4f 50  lags & WHERE_TOP
12620 5f 4c 49 4d 49 54 29 21 3d 30 3b 0a 20 20 20 20  _LIMIT)!=0;.    
12630 20 20 69 6e 74 20 62 74 6d 4c 69 6d 69 74 20 3d    int btmLimit =
12640 20 28 70 4c 65 76 65 6c 2d 3e 66 6c 61 67 73 20   (pLevel->flags 
12650 26 20 57 48 45 52 45 5f 42 54 4d 5f 4c 49 4d 49  & WHERE_BTM_LIMI
12660 54 29 21 3d 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  T)!=0;..      /*
12670 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
12680 6f 20 65 76 61 6c 75 61 74 65 20 61 6c 6c 20 63  o evaluate all c
12690 6f 6e 73 74 72 61 69 6e 74 20 74 65 72 6d 73 20  onstraint terms 
126a0 75 73 69 6e 67 20 3d 3d 20 6f 72 20 49 4e 0a 20  using == or IN. 
126b0 20 20 20 20 20 2a 2a 20 61 6e 64 20 6c 65 76 65       ** and leve
126c0 6c 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20  l the values of 
126d0 74 68 6f 73 65 20 74 65 72 6d 73 20 6f 6e 20 74  those terms on t
126e0 68 65 20 73 74 61 63 6b 2e 0a 20 20 20 20 20 20  he stack..      
126f0 2a 2f 0a 20 20 20 20 20 20 63 6f 64 65 41 6c 6c  */.      codeAll
12700 45 71 75 61 6c 69 74 79 54 65 72 6d 73 28 70 50  EqualityTerms(pP
12710 61 72 73 65 2c 20 70 4c 65 76 65 6c 2c 20 26 77  arse, pLevel, &w
12720 63 2c 20 6e 6f 74 52 65 61 64 79 2c 20 62 72 6b  c, notReady, brk
12730 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 44 75 70  );..      /* Dup
12740 6c 69 63 61 74 65 20 74 68 65 20 65 71 75 61 6c  licate the equal
12750 69 74 79 20 74 65 72 6d 20 76 61 6c 75 65 73 20  ity term values 
12760 62 65 63 61 75 73 65 20 74 68 65 79 20 77 69 6c  because they wil
12770 6c 20 61 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a  l all be.      *
12780 2a 20 75 73 65 64 20 74 77 69 63 65 3a 20 6f 6e  * used twice: on
12790 63 65 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74  ce to make the t
127a0 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 61  ermination key a
127b0 6e 64 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  nd once to make 
127c0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  the.      ** sta
127d0 72 74 20 6b 65 79 2e 0a 20 20 20 20 20 20 2a 2f  rt key..      */
127e0 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
127f0 6a 3c 6e 45 71 3b 20 6a 2b 2b 29 7b 0a 20 20 20  j<nEq; j++){.   
12800 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
12810 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
12820 20 6e 45 71 2d 31 2c 20 30 29 3b 0a 20 20 20 20   nEq-1, 0);.    
12830 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69    }..      /* Fi
12840 67 75 72 65 20 6f 75 74 20 77 68 61 74 20 63 6f  gure out what co
12850 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
12860 72 73 20 74 6f 20 75 73 65 20 66 6f 72 20 74 6f  rs to use for to
12870 70 20 61 6e 64 20 62 6f 74 74 6f 6d 20 0a 20 20  p and bottom .  
12880 20 20 20 20 2a 2a 20 73 65 61 72 63 68 20 62 6f      ** search bo
12890 75 6e 64 73 2e 20 46 6f 72 20 61 6e 20 61 73 63  unds. For an asc
128a0 65 6e 64 69 6e 67 20 69 6e 64 65 78 2c 20 74 68  ending index, th
128b0 65 20 62 6f 74 74 6f 6d 20 62 6f 75 6e 64 20 69  e bottom bound i
128c0 73 20 61 20 3e 20 6f 72 20 3e 3d 0a 20 20 20 20  s a > or >=.    
128d0 20 20 2a 2a 20 6f 70 65 72 61 74 6f 72 20 61 6e    ** operator an
128e0 64 20 74 68 65 20 74 6f 70 20 62 6f 75 6e 64 20  d the top bound 
128f0 69 73 20 61 20 3c 20 6f 72 20 3c 3d 20 6f 70 65  is a < or <= ope
12900 72 61 74 6f 72 2e 20 20 46 6f 72 20 61 20 64 65  rator.  For a de
12910 73 63 65 6e 64 69 6e 67 0a 20 20 20 20 20 20 2a  scending.      *
12920 2a 20 69 6e 64 65 78 20 74 68 65 20 6f 70 65 72  * index the oper
12930 61 74 6f 72 73 20 61 72 65 20 72 65 76 65 72 73  ators are revers
12940 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
12950 20 20 20 6e 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 45     nNotNull = nE
12960 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20  q + topLimit;.  
12970 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61 53      if( pIdx->aS
12980 6f 72 74 4f 72 64 65 72 5b 6e 45 71 5d 3d 3d 53  ortOrder[nEq]==S
12990 51 4c 49 54 45 5f 53 4f 5f 41 53 43 20 29 7b 0a  QLITE_SO_ASC ){.
129a0 20 20 20 20 20 20 20 20 74 6f 70 4f 70 20 3d 20          topOp = 
129b0 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b 0a 20 20 20  WO_LT|WO_LE;.   
129c0 20 20 20 20 20 62 74 6d 4f 70 20 3d 20 57 4f 5f       btmOp = WO_
129d0 47 54 7c 57 4f 5f 47 45 3b 0a 20 20 20 20 20 20  GT|WO_GE;.      
129e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74  }else{.        t
129f0 6f 70 4f 70 20 3d 20 57 4f 5f 47 54 7c 57 4f 5f  opOp = WO_GT|WO_
12a00 47 45 3b 0a 20 20 20 20 20 20 20 20 62 74 6d 4f  GE;.        btmO
12a10 70 20 3d 20 57 4f 5f 4c 54 7c 57 4f 5f 4c 45 3b  p = WO_LT|WO_LE;
12a20 0a 20 20 20 20 20 20 20 20 53 57 41 50 28 69 6e  .        SWAP(in
12a30 74 2c 20 74 6f 70 4c 69 6d 69 74 2c 20 62 74 6d  t, topLimit, btm
12a40 4c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Limit);.      }.
12a50 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
12a60 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69  te the terminati
12a70 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73  on key.  This is
12a80 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74   the key value t
12a90 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c  hat.      ** wil
12aa0 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63 68  l end the search
12ab0 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74  .  There is no t
12ac0 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69  ermination key i
12ad0 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a  f there.      **
12ae0 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79   are no equality
12af0 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58   terms and no "X
12b00 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20  <..." term..    
12b10 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30    **.      ** 20
12b20 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20  02-Dec-04: On a 
12b30 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63  reverse-order sc
12b40 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65  an, the so-calle
12b50 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a  d "termination".
12b60 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d        ** key com
12b70 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c  puted here reall
12b80 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  y ends up being 
12b90 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20  the start key.. 
12ba0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
12bb0 28 20 74 6f 70 4c 69 6d 69 74 20 29 7b 0a 20 20  ( topLimit ){.  
12bc0 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a        Expr *pX;.
12bd0 20 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20          int k = 
12be0 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a  pIdx->aiColumn[j
12bf0 5d 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d  ];.        pTerm
12c00 20 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c   = findTerm(&wc,
12c10 20 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61   iCur, k, notRea
12c20 64 79 2c 20 74 6f 70 4f 70 2c 20 70 49 64 78 29  dy, topOp, pIdx)
12c30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
12c40 28 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20  ( pTerm!=0 );.  
12c50 20 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d        pX = pTerm
12c60 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
12c70 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d   assert( (pTerm-
12c80 3e 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f  >flags & TERM_CO
12c90 44 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  DED)==0 );.     
12ca0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
12cb0 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
12cc0 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
12cd0 74 6f 70 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65  topEq = pTerm->e
12ce0 4f 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c  Operator & (WO_L
12cf0 45 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20  E|WO_GE);.      
12d00 20 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c    disableTerm(pL
12d10 65 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20  evel, pTerm);.  
12d20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
12d30 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d  P_IdxGE;.      }
12d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
12d50 73 74 4f 70 20 3d 20 6e 45 71 3e 30 20 3f 20 4f  stOp = nEq>0 ? O
12d60 50 5f 49 64 78 47 45 20 3a 20 4f 50 5f 4e 6f 6f  P_IdxGE : OP_Noo
12d70 70 3b 0a 20 20 20 20 20 20 20 20 74 6f 70 45 71  p;.        topEq
12d80 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
12d90 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
12da0 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
12db0 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 6e 45     int nCol = nE
12dc0 71 20 2b 20 74 6f 70 4c 69 6d 69 74 3b 0a 20 20  q + topLimit;.  
12dd0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d        pLevel->iM
12de0 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
12df0 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 75 69  m++;.        bui
12e00 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
12e10 6e 43 6f 6c 2c 20 6e 45 71 2c 20 62 72 6b 2c 20  nCol, nEq, brk, 
12e20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
12e30 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
12e40 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 74 6f       int op = to
12e50 70 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 4c 65 20  pEq ? OP_MoveLe 
12e60 3a 20 4f 50 5f 4d 6f 76 65 4c 74 3b 0a 20 20 20  : OP_MoveLt;.   
12e70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12e80 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 69  beAddOp(v, op, i
12e90 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  IdxCur, brk);.  
12ea0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
12eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12ec0 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
12ed0 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e  mStore, pLevel->
12ee0 69 4d 65 6d 2c 20 31 29 3b 0a 20 20 20 20 20 20  iMem, 1);.      
12ef0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
12f00 69 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20  if( bRev ){.    
12f10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
12f20 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74 2c  ddOp(v, OP_Last,
12f30 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
12f40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
12f50 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 73  * Generate the s
12f60 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73 20  tart key.  This 
12f70 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74 20  is the key that 
12f80 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77 65  defines the lowe
12f90 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e 64  r.      ** bound
12fa0 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e 20   on the search. 
12fb0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   There is no sta
12fc0 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65 20  rt key if there 
12fd0 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a 20  are no.      ** 
12fe0 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20 61  equality terms a
12ff0 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  nd if there is n
13000 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e 20  o "X>..." term. 
13010 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 61   In.      ** tha
13020 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74 65  t case, generate
13030 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73 74   a "Rewind" inst
13040 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63 65  ruction in place
13050 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   of the.      **
13060 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72 63   start key searc
13070 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  h..      **.    
13080 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30 34    ** 2002-Dec-04
13090 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f 66  : In the case of
130a0 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72   a reverse-order
130b0 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f 2d   search, the so-
130c0 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a 20  called.      ** 
130d0 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61 6c  "start" key real
130e0 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
130f0 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65 72   used as the ter
13100 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20 20  mination key..  
13110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13120 20 62 74 6d 4c 69 6d 69 74 20 29 7b 0a 20 20 20   btmLimit ){.   
13130 20 20 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20       Expr *pX;. 
13140 20 20 20 20 20 20 20 69 6e 74 20 6b 20 3d 20 70         int k = p
13150 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
13160 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
13170 3d 20 66 69 6e 64 54 65 72 6d 28 26 77 63 2c 20  = findTerm(&wc, 
13180 69 43 75 72 2c 20 6b 2c 20 6e 6f 74 52 65 61 64  iCur, k, notRead
13190 79 2c 20 62 74 6d 4f 70 2c 20 70 49 64 78 29 3b  y, btmOp, pIdx);
131a0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
131b0 20 70 54 65 72 6d 21 3d 30 20 29 3b 0a 20 20 20   pTerm!=0 );.   
131c0 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
131d0 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >pExpr;.        
131e0 61 73 73 65 72 74 28 20 28 70 54 65 72 6d 2d 3e  assert( (pTerm->
131f0 66 6c 61 67 73 20 26 20 54 45 52 4d 5f 43 4f 44  flags & TERM_COD
13200 45 44 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ED)==0 );.      
13210 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
13220 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
13230 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 62  ight);.        b
13240 74 6d 45 71 20 3d 20 70 54 65 72 6d 2d 3e 65 4f  tmEq = pTerm->eO
13250 70 65 72 61 74 6f 72 20 26 20 28 57 4f 5f 4c 45  perator & (WO_LE
13260 7c 57 4f 5f 47 45 29 3b 0a 20 20 20 20 20 20 20  |WO_GE);.       
13270 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
13280 76 65 6c 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  vel, pTerm);.   
13290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
132a0 20 20 62 74 6d 45 71 20 3d 20 31 3b 0a 20 20 20    btmEq = 1;.   
132b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
132c0 45 71 3e 30 20 7c 7c 20 62 74 6d 4c 69 6d 69 74  Eq>0 || btmLimit
132d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
132e0 6e 43 6f 6c 20 3d 20 6e 45 71 20 2b 20 62 74 6d  nCol = nEq + btm
132f0 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 62  Limit;.        b
13300 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76  uildIndexProbe(v
13310 2c 20 6e 43 6f 6c 2c 20 30 2c 20 62 72 6b 2c 20  , nCol, 0, brk, 
13320 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
13330 66 28 20 62 52 65 76 20 29 7b 0a 20 20 20 20 20  f( bRev ){.     
13340 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
13350 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
13360 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
13370 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
13380 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
13390 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
133a0 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f  .          testO
133b0 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20  p = OP_IdxLT;.  
133c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
133d0 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
133e0 62 74 6d 45 71 20 3f 20 4f 50 5f 4d 6f 76 65 47  btmEq ? OP_MoveG
133f0 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20  e : OP_MoveGt;. 
13400 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13410 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
13420 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
13430 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13440 7d 65 6c 73 65 20 69 66 28 20 62 52 65 76 20 29  }else if( bRev )
13450 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 4f 70  {.        testOp
13460 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
13470 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13480 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13490 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20  p(v, OP_Rewind, 
134a0 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
134b0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
134c0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 68   Generate the th
134d0 65 20 74 6f 70 20 6f 66 20 74 68 65 20 6c 6f 6f  e top of the loo
134e0 70 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20  p.  If there is 
134f0 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 0a 20 20  a termination.  
13500 20 20 20 20 2a 2a 20 6b 65 79 20 77 65 20 68 61      ** key we ha
13510 76 65 20 74 6f 20 74 65 73 74 20 66 6f 72 20 74  ve to test for t
13520 68 61 74 20 6b 65 79 20 61 6e 64 20 61 62 6f 72  hat key and abor
13530 74 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20  t at the top of 
13540 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f  the.      ** loo
13550 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  p..      */.    
13560 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65    start = sqlite
13570 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
13580 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74  (v);.      if( t
13590 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
135a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
135b0 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
135c0 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
135d0 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  ->iMem, 0);.    
135e0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
135f0 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c 20  ddOp(v, testOp, 
13600 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
13610 20 20 20 20 20 20 20 69 66 28 20 28 74 6f 70 45         if( (topE
13620 71 20 26 26 20 21 62 52 65 76 29 20 7c 7c 20 28  q && !bRev) || (
13630 21 62 74 6d 45 71 20 26 26 20 62 52 65 76 29 20  !btmEq && bRev) 
13640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
13650 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
13660 28 76 2c 20 2d 31 2c 20 22 2b 22 2c 20 50 33 5f  (v, -1, "+", P3_
13670 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
13680 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
13690 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
136a0 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c 20  p(v, OP_RowKey, 
136b0 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
136c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
136d0 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73 4e  dOp(v, OP_IdxIsN
136e0 75 6c 6c 2c 20 6e 4e 6f 74 4e 75 6c 6c 2c 20 63  ull, nNotNull, c
136f0 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ont);.      if( 
13700 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a 20 20  !omitTable ){.  
13710 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13720 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
13730 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72 2c 20  Rowid, iIdxCur, 
13740 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
13750 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
13760 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c  OP_MoveGe, iCur,
13770 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   0);.      }..  
13780 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68      /* Record th
13790 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 75 73  e instruction us
137a0 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
137b0 74 68 65 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20  the loop..      
137c0 2a 2f 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  */.      pLevel-
137d0 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f  >op = bRev ? OP_
137e0 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a  Prev : OP_Next;.
137f0 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31        pLevel->p1
13800 20 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20   = iIdxCur;.    
13810 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
13820 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tart;.    }else 
13830 69 66 28 20 70 4c 65 76 65 6c 2d 3e 66 6c 61 67  if( pLevel->flag
13840 73 20 26 20 57 48 45 52 45 5f 43 4f 4c 55 4d 4e  s & WHERE_COLUMN
13850 5f 45 51 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _EQ ){.      /* 
13860 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20 69  Case 4:  There i
13870 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 61  s an index and a
13880 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  ll terms of the 
13890 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
138a0 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  t.      **      
138b0 20 20 20 20 72 65 66 65 72 20 74 6f 20 74 68 65      refer to the
138c0 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74 68 65   index using the
138d0 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70   "==" or "IN" op
138e0 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a  erators..      *
138f0 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  /.      int star
13900 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  t;.      int nEq
13910 20 3d 20 70 4c 65 76 65 6c 2d 3e 6e 45 71 3b 0a   = pLevel->nEq;.
13920 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
13930 74 65 20 63 6f 64 65 20 74 6f 20 65 76 61 6c 75  te code to evalu
13940 61 74 65 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69  ate all constrai
13950 6e 74 20 74 65 72 6d 73 20 75 73 69 6e 67 20 3d  nt terms using =
13960 3d 20 6f 72 20 49 4e 0a 20 20 20 20 20 20 2a 2a  = or IN.      **
13970 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 76   and leave the v
13980 61 6c 75 65 73 20 6f 66 20 74 68 6f 73 65 20 74  alues of those t
13990 65 72 6d 73 20 6f 6e 20 74 68 65 20 73 74 61 63  erms on the stac
139a0 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  k..      */.    
139b0 20 20 63 6f 64 65 41 6c 6c 45 71 75 61 6c 69 74    codeAllEqualit
139c0 79 54 65 72 6d 73 28 70 50 61 72 73 65 2c 20 70  yTerms(pParse, p
139d0 4c 65 76 65 6c 2c 20 26 77 63 2c 20 6e 6f 74 52  Level, &wc, notR
139e0 65 61 64 79 2c 20 62 72 6b 29 3b 0a 0a 20 20 20  eady, brk);..   
139f0 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
13a00 20 73 69 6e 67 6c 65 20 6b 65 79 20 74 68 61 74   single key that
13a10 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
13a20 20 62 6f 74 68 20 73 74 61 72 74 20 61 6e 64 20   both start and 
13a30 74 65 72 6d 69 6e 61 74 65 0a 20 20 20 20 20 20  terminate.      
13a40 2a 2a 20 74 68 65 20 73 65 61 72 63 68 0a 20 20  ** the search.  
13a50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 62 75 69      */.      bui
13a60 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20  ldIndexProbe(v, 
13a70 6e 45 71 2c 20 30 2c 20 62 72 6b 2c 20 70 49 64  nEq, 0, brk, pId
13a80 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
13a90 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
13aa0 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
13ab0 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20  l->iMem, 0);..  
13ac0 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
13ad0 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65  code (1) to move
13ae0 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61   to the first ma
13af0 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  tching element o
13b00 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
13b10 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72     ** Then gener
13b20 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68 61  ate code (2) tha
13b30 74 20 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22  t jumps to "brk"
13b40 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73 6f   after the curso
13b50 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20 20  r is past.      
13b60 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63  ** the last matc
13b70 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
13b80 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
13b90 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65 63  code (1) is exec
13ba0 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  uted.      ** on
13bb0 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
13bc0 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68 65   the search, the
13bd0 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78 65   code (2) is exe
13be0 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61 63  cuted before eac
13bf0 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61  h.      ** itera
13c00 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e  tion of the scan
13c10 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
13c20 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64  can has finished
13c30 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  . */.      if( b
13c40 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Rev ){.        /
13c50 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65 72 73  * Scan in revers
13c60 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  e order */.     
13c70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13c80 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 4c 65  dOp(v, OP_MoveLe
13c90 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
13ca0 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d  .        start =
13cb0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13cc0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
13cd0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
13ce0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13cf0 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
13d00 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43 75 72  P_IdxLT, iIdxCur
13d10 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
13d20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
13d30 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Prev;.      }els
13d40 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 63  e{.        /* Sc
13d50 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77 61 72  an in the forwar
13d60 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  d order */.     
13d70 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
13d80 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47 65  dOp(v, OP_MoveGe
13d90 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
13da0 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d  .        start =
13db0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
13dc0 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
13dd0 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
13de0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
13df0 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
13e00 49 64 78 47 45 2c 20 69 49 64 78 43 75 72 2c 20  IdxGE, iIdxCur, 
13e10 62 72 6b 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41  brk, "+", P3_STA
13e20 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  TIC);.        pL
13e30 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65  evel->op = OP_Ne
13e40 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
13e50 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13e60 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65 79 2c  Op(v, OP_RowKey,
13e70 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20   iIdxCur, 0);.  
13e80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
13e90 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 49 73  ddOp(v, OP_IdxIs
13ea0 4e 75 6c 6c 2c 20 6e 45 71 2c 20 63 6f 6e 74 29  Null, nEq, cont)
13eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69  ;.      if( !omi
13ec0 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  tTable ){.      
13ed0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
13ee0 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77 69  Op(v, OP_IdxRowi
13ef0 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  d, iIdxCur, 0);.
13f00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
13f10 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
13f20 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b  oveGe, iCur, 0);
13f30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
13f40 4c 65 76 65 6c 2d 3e 70 31 20 3d 20 69 49 64 78  Level->p1 = iIdx
13f50 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  Cur;.      pLeve
13f60 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a 20  l->p2 = start;. 
13f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13f80 2f 2a 20 43 61 73 65 20 35 3a 20 20 54 68 65 72  /* Case 5:  Ther
13f90 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20 69  e is no usable i
13fa0 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20 64  ndex.  We must d
13fb0 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20  o a complete.   
13fc0 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 73     **          s
13fd0 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69 72  can of the entir
13fe0 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a  e table..      *
13ff0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
14000 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
14010 20 20 20 20 20 20 61 73 73 65 72 74 28 20 62 52        assert( bR
14020 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  ev==0 );.      p
14030 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
14040 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
14050 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20  l->p1 = iCur;.  
14060 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d      pLevel->p2 =
14070 20 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65   1 + sqlite3Vdbe
14080 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69  AddOp(v, OP_Rewi
14090 6e 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a  nd, iCur, brk);.
140a0 20 20 20 20 7d 0a 20 20 20 20 6e 6f 74 52 65 61      }.    notRea
140b0 64 79 20 26 3d 20 7e 67 65 74 4d 61 73 6b 28 26  dy &= ~getMask(&
140c0 6d 61 73 6b 53 65 74 2c 20 69 43 75 72 29 3b 0a  maskSet, iCur);.
140d0 0a 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 63  .    /* Insert c
140e0 6f 64 65 20 74 6f 20 74 65 73 74 20 65 76 65 72  ode to test ever
140f0 79 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  y subexpression 
14100 74 68 61 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  that can be comp
14110 6c 65 74 65 6c 79 0a 20 20 20 20 2a 2a 20 63 6f  letely.    ** co
14120 6d 70 75 74 65 64 20 75 73 69 6e 67 20 74 68 65  mputed using the
14130 20 63 75 72 72 65 6e 74 20 73 65 74 20 6f 66 20   current set of 
14140 74 61 62 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20  tables..    */. 
14150 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
14160 61 2c 20 6a 3d 77 63 2e 6e 54 65 72 6d 3b 20 6a  a, j=wc.nTerm; j
14170 3e 30 3b 20 6a 2d 2d 2c 20 70 54 65 72 6d 2b 2b  >0; j--, pTerm++
14180 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  ){.      Expr *p
14190 45 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65  E;.      if( pTe
141a0 72 6d 2d 3e 66 6c 61 67 73 20 26 20 28 54 45 52  rm->flags & (TER
141b0 4d 5f 56 49 52 54 55 41 4c 7c 54 45 52 4d 5f 43  M_VIRTUAL|TERM_C
141c0 4f 44 45 44 29 20 29 20 63 6f 6e 74 69 6e 75 65  ODED) ) continue
141d0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70 54 65  ;.      if( (pTe
141e0 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
141f0 6e 6f 74 52 65 61 64 79 29 21 3d 30 20 29 20 63  notReady)!=0 ) c
14200 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
14210 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  E = pTerm->pExpr
14220 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14230 70 45 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  pE!=0 );.      i
14240 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74  f( pLevel->iLeft
14250 4a 6f 69 6e 20 26 26 20 21 45 78 70 72 48 61 73  Join && !ExprHas
14260 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45 50 5f  Property(pE, EP_
14270 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20  FromJoin) ){.   
14280 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14290 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
142a0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
142b0 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74  pParse, pE, cont
142c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 54 65 72  , 1);.      pTer
142d0 6d 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 45 52 4d  m->flags |= TERM
142e0 5f 43 4f 44 45 44 3b 0a 20 20 20 20 7d 0a 0a 20  _CODED;.    }.. 
142f0 20 20 20 2f 2a 20 46 6f 72 20 61 20 4c 45 46 54     /* For a LEFT
14300 20 4f 55 54 45 52 20 4a 4f 49 4e 2c 20 67 65 6e   OUTER JOIN, gen
14310 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
14320 77 69 6c 6c 20 72 65 63 6f 72 64 20 74 68 65 20  will record the 
14330 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a  fact that.    **
14340 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 72 6f   at least one ro
14350 77 20 6f 66 20 74 68 65 20 72 69 67 68 74 20 74  w of the right t
14360 61 62 6c 65 20 68 61 73 20 6d 61 74 63 68 65 64  able has matched
14370 20 74 68 65 20 6c 65 66 74 20 74 61 62 6c 65 2e   the left table.
14380 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
14390 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
143a0 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  oin ){.      pLe
143b0 76 65 6c 2d 3e 74 6f 70 20 3d 20 73 71 6c 69 74  vel->top = sqlit
143c0 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
143d0 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
143e0 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
143f0 4f 50 5f 4d 65 6d 49 6e 74 2c 20 31 2c 20 70 4c  OP_MemInt, 1, pL
14400 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 29  evel->iLeftJoin)
14410 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
14420 65 6e 74 28 28 76 2c 20 22 23 20 72 65 63 6f 72  ent((v, "# recor
14430 64 20 4c 45 46 54 20 4a 4f 49 4e 20 68 69 74 22  d LEFT JOIN hit"
14440 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 54  ));.      for(pT
14450 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b 20 6a  erm=wc.a, j=0; j
14460 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b 2c 20  <wc.nTerm; j++, 
14470 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
14480 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 66 6c 61    if( pTerm->fla
14490 67 73 20 26 20 28 54 45 52 4d 5f 56 49 52 54 55  gs & (TERM_VIRTU
144a0 41 4c 7c 54 45 52 4d 5f 43 4f 44 45 44 29 20 29  AL|TERM_CODED) )
144b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
144c0 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
144d0 72 65 72 65 71 41 6c 6c 20 26 20 6e 6f 74 52 65  rereqAll & notRe
144e0 61 64 79 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ady)!=0 ) contin
144f0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ue;.        asse
14500 72 74 28 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  rt( pTerm->pExpr
14510 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
14520 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
14530 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 45  Parse, pTerm->pE
14540 78 70 72 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20  xpr, cont, 1);. 
14550 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 66 6c         pTerm->fl
14560 61 67 73 20 7c 3d 20 54 45 52 4d 5f 43 4f 44 45  ags |= TERM_CODE
14570 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  D;.      }.    }
14580 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
14590 49 54 45 5f 54 45 53 54 20 20 2f 2a 20 46 6f 72  ITE_TEST  /* For
145a0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62   testing and deb
145b0 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c 79 20  ugging use only 
145c0 2a 2f 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 69  */.  /* Record i
145d0 6e 20 74 68 65 20 71 75 65 72 79 20 70 6c 61 6e  n the query plan
145e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
145f0 75 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ut the current t
14600 61 62 6c 65 0a 20 20 2a 2a 20 61 6e 64 20 74 68  able.  ** and th
14610 65 20 69 6e 64 65 78 20 75 73 65 64 20 74 6f 20  e index used to 
14620 61 63 63 65 73 73 20 69 74 20 28 69 66 20 61 6e  access it (if an
14630 79 29 2e 20 20 49 66 20 74 68 65 20 74 61 62 6c  y).  If the tabl
14640 65 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 69 73  e itself.  ** is
14650 20 6e 6f 74 20 75 73 65 64 2c 20 69 74 73 20 6e   not used, its n
14660 61 6d 65 20 69 73 20 6a 75 73 74 20 27 7b 7d 27  ame is just '{}'
14670 2e 20 20 49 66 20 6e 6f 20 69 6e 64 65 78 20 69  .  If no index i
14680 73 20 75 73 65 64 0a 20 20 2a 2a 20 74 68 65 20  s used.  ** the 
14690 69 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20  index is listed 
146a0 61 73 20 22 7b 7d 22 2e 20 20 49 66 20 74 68 65  as "{}".  If the
146b0 20 70 72 69 6d 61 72 79 20 6b 65 79 20 69 73 20   primary key is 
146c0 75 73 65 64 20 74 68 65 0a 20 20 2a 2a 20 69 6e  used the.  ** in
146d0 64 65 78 20 6e 61 6d 65 20 69 73 20 27 2a 27 2e  dex name is '*'.
146e0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
146f0 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72   i<pTabList->nSr
14700 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  c; i++){.    cha
14710 72 20 2a 7a 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  r *z;.    int n;
14720 0a 20 20 20 20 70 4c 65 76 65 6c 20 3d 20 26 70  .    pLevel = &p
14730 57 49 6e 66 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20  WInfo->a[i];.   
14740 20 70 54 61 62 49 74 65 6d 20 3d 20 26 70 54 61   pTabItem = &pTa
14750 62 4c 69 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d  bList->a[pLevel-
14760 3e 69 46 72 6f 6d 5d 3b 0a 20 20 20 20 7a 20 3d  >iFrom];.    z =
14770 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41 6c 69 61   pTabItem->zAlia
14780 73 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  s;.    if( z==0 
14790 29 20 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e  ) z = pTabItem->
147a0 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
147b0 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
147c0 20 20 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e      if( n+nQPlan
147d0 20 3c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65   < sizeof(sqlite
147e0 33 5f 71 75 65 72 79 5f 70 6c 61 6e 29 2d 31 30  3_query_plan)-10
147f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   ){.      if( pL
14800 65 76 65 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48  evel->flags & WH
14810 45 52 45 5f 49 44 58 5f 4f 4e 4c 59 20 29 7b 0a  ERE_IDX_ONLY ){.
14820 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26          strcpy(&
14830 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
14840 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22 7b 7d 22  an[nQPlan], "{}"
14850 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
14860 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 65  n += 2;.      }e
14870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
14880 63 70 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65  cpy(&sqlite3_que
14890 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c  ry_plan[nQPlan],
148a0 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50   z);.        nQP
148b0 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
148c0 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
148d0 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
148e0 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  n++] = ' ';.    
148f0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
14900 2d 3e 66 6c 61 67 73 20 26 20 28 57 48 45 52 45  ->flags & (WHERE
14910 5f 52 4f 57 49 44 5f 45 51 7c 57 48 45 52 45 5f  _ROWID_EQ|WHERE_
14920 52 4f 57 49 44 5f 52 41 4e 47 45 29 20 29 7b 0a  ROWID_RANGE) ){.
14930 20 20 20 20 20 20 73 74 72 63 70 79 28 26 73 71        strcpy(&sq
14940 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e  lite3_query_plan
14950 5b 6e 51 50 6c 61 6e 5d 2c 20 22 2a 20 22 29 3b  [nQPlan], "* ");
14960 0a 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d  .      nQPlan +=
14970 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   2;.    }else if
14980 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3d 3d  ( pLevel->pIdx==
14990 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 63 70  0 ){.      strcp
149a0 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
149b0 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 22  _plan[nQPlan], "
149c0 7b 7d 20 22 29 3b 0a 20 20 20 20 20 20 6e 51 50  {} ");.      nQP
149d0 6c 61 6e 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65  lan += 3;.    }e
149e0 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  lse{.      n = s
149f0 74 72 6c 65 6e 28 70 4c 65 76 65 6c 2d 3e 70 49  trlen(pLevel->pI
14a00 64 78 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  dx->zName);.    
14a10 20 20 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c    if( n+nQPlan <
14a20 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f   sizeof(sqlite3_
14a30 71 75 65 72 79 5f 70 6c 61 6e 29 2d 32 20 29 7b  query_plan)-2 ){
14a40 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
14a50 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70  &sqlite3_query_p
14a60 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 70 4c 65  lan[nQPlan], pLe
14a70 76 65 6c 2d 3e 70 49 64 78 2d 3e 7a 4e 61 6d 65  vel->pIdx->zName
14a80 29 3b 0a 20 20 20 20 20 20 20 20 6e 51 50 6c 61  );.        nQPla
14a90 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  n += n;.        
14aa0 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
14ab0 61 6e 5b 6e 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27  an[nQPlan++] = '
14ac0 20 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   ';.      }.    
14ad0 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 6e  }.  }.  while( n
14ae0 51 50 6c 61 6e 3e 30 20 26 26 20 73 71 6c 69 74  QPlan>0 && sqlit
14af0 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
14b00 50 6c 61 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 0a  Plan-1]==' ' ){.
14b10 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65 72      sqlite3_quer
14b20 79 5f 70 6c 61 6e 5b 2d 2d 6e 51 50 6c 61 6e 5d  y_plan[--nQPlan]
14b30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
14b40 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
14b50 51 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 6e 51  QPlan] = 0;.  nQ
14b60 50 6c 61 6e 20 3d 20 30 3b 0a 23 65 6e 64 69 66  Plan = 0;.#endif
14b70 20 2f 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 20   /* SQLITE_TEST 
14b80 2f 2f 20 54 65 73 74 69 6e 67 20 61 6e 64 20 64  // Testing and d
14b90 65 62 75 67 67 69 6e 67 20 75 73 65 20 6f 6e 6c  ebugging use onl
14ba0 79 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 63 6f 72  y */..  /* Recor
14bb0 64 20 74 68 65 20 63 6f 6e 74 69 6e 75 61 74 69  d the continuati
14bc0 6f 6e 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  on address in th
14bd0 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72 75  e WhereInfo stru
14be0 63 74 75 72 65 2e 20 20 54 68 65 6e 0a 20 20 2a  cture.  Then.  *
14bf0 2a 20 63 6c 65 61 6e 20 75 70 20 61 6e 64 20 72  * clean up and r
14c00 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 70 57  eturn..  */.  pW
14c10 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20  Info->iContinue 
14c20 3d 20 63 6f 6e 74 3b 0a 20 20 77 68 65 72 65 43  = cont;.  whereC
14c30 6c 61 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b  lauseClear(&wc);
14c40 0a 20 20 72 65 74 75 72 6e 20 70 57 49 6e 66 6f  .  return pWInfo
14c50 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
14c60 65 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e if malloc fail
14c70 73 20 2a 2f 0a 77 68 65 72 65 42 65 67 69 6e 4e  s */.whereBeginN
14c80 6f 4d 65 6d 3a 0a 20 20 77 68 65 72 65 43 6c 61  oMem:.  whereCla
14c90 75 73 65 43 6c 65 61 72 28 26 77 63 29 3b 0a 20  useClear(&wc);. 
14ca0 20 77 68 65 72 65 49 6e 66 6f 46 72 65 65 28 70   whereInfoFree(p
14cb0 57 49 6e 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e  WInfo);.  return
14cc0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
14cd0 65 72 61 74 65 20 74 68 65 20 65 6e 64 20 6f 66  erate the end of
14ce0 20 74 68 65 20 57 48 45 52 45 20 6c 6f 6f 70 2e   the WHERE loop.
14cf0 20 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f    See comments o
14d00 6e 20 0a 2a 2a 20 73 71 6c 69 74 65 33 57 68 65  n .** sqlite3Whe
14d10 72 65 42 65 67 69 6e 28 29 20 66 6f 72 20 61 64  reBegin() for ad
14d20 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
14d30 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
14d40 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 57 68  lite3WhereEnd(Wh
14d50 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 29  ereInfo *pWInfo)
14d60 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 57  {.  Vdbe *v = pW
14d70 49 6e 66 6f 2d 3e 70 50 61 72 73 65 2d 3e 70 56  Info->pParse->pV
14d80 64 62 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  dbe;.  int i;.  
14d90 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
14da0 65 6c 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  el;.  SrcList *p
14db0 54 61 62 4c 69 73 74 20 3d 20 70 57 49 6e 66 6f  TabList = pWInfo
14dc0 2d 3e 70 54 61 62 4c 69 73 74 3b 0a 0a 20 20 2f  ->pTabList;..  /
14dd0 2a 20 47 65 6e 65 72 61 74 65 20 6c 6f 6f 70 20  * Generate loop 
14de0 74 65 72 6d 69 6e 61 74 69 6f 6e 20 63 6f 64 65  termination code
14df0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 70  ..  */.  for(i=p
14e00 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 3b  TabList->nSrc-1;
14e10 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
14e20 20 70 4c 65 76 65 6c 20 3d 20 26 70 57 49 6e 66   pLevel = &pWInf
14e30 6f 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 71 6c  o->a[i];.    sql
14e40 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
14e50 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e  abel(v, pLevel->
14e60 63 6f 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70  cont);.    if( p
14e70 4c 65 76 65 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f  Level->op!=OP_No
14e80 6f 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  op ){.      sqli
14e90 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
14ea0 70 4c 65 76 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76  pLevel->op, pLev
14eb0 65 6c 2d 3e 70 31 2c 20 70 4c 65 76 65 6c 2d 3e  el->p1, pLevel->
14ec0 70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  p2);.    }.    s
14ed0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
14ee0 65 4c 61 62 65 6c 28 76 2c 20 70 4c 65 76 65 6c  eLabel(v, pLevel
14ef0 2d 3e 62 72 6b 29 3b 0a 20 20 20 20 69 66 28 20  ->brk);.    if( 
14f00 70 4c 65 76 65 6c 2d 3e 6e 49 6e 20 29 7b 0a 20  pLevel->nIn ){. 
14f10 20 20 20 20 20 69 6e 74 20 2a 61 3b 0a 20 20 20       int *a;.   
14f20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
14f30 66 6f 72 28 6a 3d 70 4c 65 76 65 6c 2d 3e 6e 49  for(j=pLevel->nI
14f40 6e 2c 20 61 3d 26 70 4c 65 76 65 6c 2d 3e 61 49  n, a=&pLevel->aI
14f50 6e 4c 6f 6f 70 5b 6a 2a 32 2d 32 5d 3b 20 6a 3e  nLoop[j*2-2]; j>
14f60 30 3b 20 6a 2d 2d 2c 20 61 2d 3d 32 29 7b 0a 20  0; j--, a-=2){. 
14f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14f80 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 65  beAddOp(v, OP_Ne
14f90 78 74 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b  xt, a[0], a[1]);
14fa0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14fb0 56 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20  VdbeJumpHere(v, 
14fc0 61 5b 31 5d 2d 31 29 3b 0a 20 20 20 20 20 20 7d  a[1]-1);.      }
14fd0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
14fe0 65 28 70 4c 65 76 65 6c 2d 3e 61 49 6e 4c 6f 6f  e(pLevel->aInLoo
14ff0 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
15000 28 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a  ( pLevel->iLeftJ
15010 6f 69 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  oin ){.      int
15020 20 61 64 64 72 3b 0a 20 20 20 20 20 20 61 64 64   addr;.      add
15030 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
15040 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4d 65 6d  ddOp(v, OP_IfMem
15050 50 6f 73 2c 20 70 4c 65 76 65 6c 2d 3e 69 4c 65  Pos, pLevel->iLe
15060 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20 20 20 20  ftJoin, 0);.    
15070 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
15080 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
15090 2c 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d  , pTabList->a[i]
150a0 2e 69 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20  .iCursor, 0);.  
150b0 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
150c0 69 49 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20  iIdxCur>=0 ){.  
150d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
150e0 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
150f0 6c 52 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49  lRow, pLevel->iI
15100 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  dxCur, 0);.     
15110 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
15120 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
15130 47 6f 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d  Goto, 0, pLevel-
15140 3e 74 6f 70 29 3b 0a 20 20 20 20 20 20 73 71 6c  >top);.      sql
15150 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
15160 28 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 7d  (v, addr);.    }
15170 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 22  .  }..  /* The "
15180 62 72 65 61 6b 22 20 70 6f 69 6e 74 20 69 73 20  break" point is 
15190 68 65 72 65 2c 20 6a 75 73 74 20 70 61 73 74 20  here, just past 
151a0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f  the end of the o
151b0 75 74 65 72 20 6c 6f 6f 70 2e 0a 20 20 2a 2a 20  uter loop..  ** 
151c0 53 65 74 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 73  Set it..  */.  s
151d0 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
151e0 65 4c 61 62 65 6c 28 76 2c 20 70 57 49 6e 66 6f  eLabel(v, pWInfo
151f0 2d 3e 69 42 72 65 61 6b 29 3b 0a 0a 20 20 2f 2a  ->iBreak);..  /*
15200 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 66 20 74 68   Close all of th
15210 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 77  e cursors that w
15220 65 72 65 20 6f 70 65 6e 65 64 20 62 79 20 73 71  ere opened by sq
15230 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e 2e  lite3WhereBegin.
15240 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c  .  */.  for(i=0,
15250 20 70 4c 65 76 65 6c 3d 70 57 49 6e 66 6f 2d 3e   pLevel=pWInfo->
15260 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
15270 53 72 63 3b 20 69 2b 2b 2c 20 70 4c 65 76 65 6c  Src; i++, pLevel
15280 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
15290 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
152a0 61 62 49 74 65 6d 20 3d 20 26 70 54 61 62 4c 69  abItem = &pTabLi
152b0 73 74 2d 3e 61 5b 70 4c 65 76 65 6c 2d 3e 69 46  st->a[pLevel->iF
152c0 72 6f 6d 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  rom];.    Table 
152d0 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
152e0 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
152f0 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
15300 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 45     if( pTab->isE
15310 70 68 65 6d 20 7c 7c 20 70 54 61 62 2d 3e 70 53  phem || pTab->pS
15320 65 6c 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65  elect ) continue
15330 3b 0a 20 20 20 20 69 66 28 20 28 70 4c 65 76 65  ;.    if( (pLeve
15340 6c 2d 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45  l->flags & WHERE
15350 5f 49 44 58 5f 4f 4e 4c 59 29 3d 3d 30 20 29 7b  _IDX_ONLY)==0 ){
15360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
15370 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6c  beAddOp(v, OP_Cl
15380 6f 73 65 2c 20 70 54 61 62 49 74 65 6d 2d 3e 69  ose, pTabItem->i
15390 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
153a0 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  }.    if( pLevel
153b0 2d 3e 70 49 64 78 21 3d 30 20 29 7b 0a 20 20 20  ->pIdx!=0 ){.   
153c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
153d0 64 4f 70 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c  dOp(v, OP_Close,
153e0 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
153f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
15400 20 2f 2a 20 4d 61 6b 65 20 63 75 72 73 6f 72 20   /* Make cursor 
15410 73 75 62 73 74 69 74 75 74 69 6f 6e 73 20 66 6f  substitutions fo
15420 72 20 63 61 73 65 73 20 77 68 65 72 65 20 77 65  r cases where we
15430 20 77 61 6e 74 20 74 6f 20 75 73 65 0a 20 20 20   want to use.   
15440 20 2a 2a 20 6a 75 73 74 20 74 68 65 20 69 6e 64   ** just the ind
15450 65 78 20 61 6e 64 20 6e 65 76 65 72 20 72 65 66  ex and never ref
15460 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
15470 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a 2a  ..    ** .    **
15480 20 43 61 6c 6c 73 20 74 6f 20 74 68 65 20 63 6f   Calls to the co
15490 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  de generator in 
154a0 62 65 74 77 65 65 6e 20 73 71 6c 69 74 65 33 57  between sqlite3W
154b0 68 65 72 65 42 65 67 69 6e 20 61 6e 64 0a 20 20  hereBegin and.  
154c0 20 20 2a 2a 20 73 71 6c 69 74 65 33 57 68 65 72    ** sqlite3Wher
154d0 65 45 6e 64 20 77 69 6c 6c 20 68 61 76 65 20 63  eEnd will have c
154e0 72 65 61 74 65 64 20 63 6f 64 65 20 74 68 61 74  reated code that
154f0 20 72 65 66 65 72 65 6e 63 65 73 20 74 68 65 20   references the 
15500 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 64 69 72  table.    ** dir
15510 65 63 74 6c 79 2e 20 20 54 68 69 73 20 6c 6f 6f  ectly.  This loo
15520 70 20 73 63 61 6e 73 20 61 6c 6c 20 74 68 61 74  p scans all that
15530 20 63 6f 64 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f   code looking fo
15540 72 20 6f 70 63 6f 64 65 73 0a 20 20 20 20 2a 2a  r opcodes.    **
15550 20 74 68 61 74 20 72 65 66 65 72 65 6e 63 65 20   that reference 
15560 74 68 65 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  the table and co
15570 6e 76 65 72 74 73 20 74 68 65 6d 20 69 6e 74 6f  nverts them into
15580 20 6f 70 63 6f 64 65 73 20 74 68 61 74 0a 20 20   opcodes that.  
15590 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74    ** reference t
155a0 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
155b0 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
155c0 3e 66 6c 61 67 73 20 26 20 57 48 45 52 45 5f 49  >flags & WHERE_I
155d0 44 58 5f 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  DX_ONLY ){.     
155e0 20 69 6e 74 20 6b 2c 20 6a 2c 20 6c 61 73 74 3b   int k, j, last;
155f0 0a 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70  .      VdbeOp *p
15600 4f 70 3b 0a 20 20 20 20 20 20 49 6e 64 65 78 20  Op;.      Index 
15610 2a 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e  *pIdx = pLevel->
15620 70 49 64 78 3b 0a 0a 20 20 20 20 20 20 61 73 73  pIdx;..      ass
15630 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
15640 20 20 20 20 20 20 70 4f 70 20 3d 20 73 71 6c 69        pOp = sqli
15650 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 20  te3VdbeGetOp(v, 
15660 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20  pWInfo->iTop);. 
15670 20 20 20 20 20 6c 61 73 74 20 3d 20 73 71 6c 69       last = sqli
15680 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
15690 64 72 28 76 29 3b 0a 20 20 20 20 20 20 66 6f 72  dr(v);.      for
156a0 28 6b 3d 70 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b  (k=pWInfo->iTop;
156b0 20 6b 3c 6c 61 73 74 3b 20 6b 2b 2b 2c 20 70 4f   k<last; k++, pO
156c0 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  p++){.        if
156d0 28 20 70 4f 70 2d 3e 70 31 21 3d 70 4c 65 76 65  ( pOp->p1!=pLeve
156e0 6c 2d 3e 69 54 61 62 43 75 72 20 29 20 63 6f 6e  l->iTabCur ) con
156f0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
15700 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
15710 4f 50 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  OP_Column ){.   
15720 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d         pOp->p1 =
15730 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72   pLevel->iIdxCur
15740 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
15750 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f  j=0; j<pIdx->nCo
15760 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
15770 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
15780 3e 70 32 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  >p2==pIdx->aiCol
15790 75 6d 6e 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20  umn[j] ){.      
157a0 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20          pOp->p2 
157b0 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = j;.           
157c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
157d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
157e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
157f0 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64  e if( pOp->opcod
15800 65 3d 3d 4f 50 5f 52 6f 77 69 64 20 29 7b 0a 20  e==OP_Rowid ){. 
15810 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 31           pOp->p1
15820 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43   = pLevel->iIdxC
15830 75 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f  ur;.          pO
15840 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 49  p->opcode = OP_I
15850 64 78 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  dxRowid;.       
15860 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
15870 6f 70 63 6f 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52  opcode==OP_NullR
15880 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ow ){.          
15890 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50  pOp->opcode = OP
158a0 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20 20 7d  _Noop;.        }
158b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
158c0 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 20 63   }..  /* Final c
158d0 6c 65 61 6e 75 70 0a 20 20 2a 2f 0a 20 20 77 68  leanup.  */.  wh
158e0 65 72 65 49 6e 66 6f 46 72 65 65 28 70 57 49 6e  ereInfoFree(pWIn
158f0 66 6f 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fo);.  return;.}
15900 0a                                               .