System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 9666cae1bbe84689be8fc438c5dae3cc623a8a19:


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 35 20 32   where.c,v 1.5 2
0340: 30 30 35 2f 30 36 2f 31 33 20 32 32 3a 33 32 3a  005/06/13 22:32:
0350: 31 39 20 72 6d 73 69 6d 70 73 6f 6e 20 45 78 70  19 rmsimpson Exp
0360: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0370: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0380: 0a 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65  .** The query ge
0390: 6e 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20  nerator uses an 
03a0: 61 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63  array of instanc
03b0: 65 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  es of this struc
03c0: 74 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20  ture to.** help 
03d0: 69 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73  it analyze the s
03e0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66  ubexpressions of
03f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
0400: 65 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a  e.  Each WHERE.*
0410: 2a 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72  * clause subexpr
0420: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
0430: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68  ted from the oth
0440: 65 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ers by an AND op
0450: 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  erator..**.** Th
0460: 65 20 69 64 78 4c 65 66 74 20 61 6e 64 20 69 64  e idxLeft and id
0470: 78 52 69 67 68 74 20 66 69 65 6c 64 73 20 61 72  xRight fields ar
0480: 65 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  e the VDBE curso
0490: 72 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 68  r numbers for th
04a0: 65 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20  e.** table that 
04b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6c  contains the col
04c0: 75 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73  umn that appears
04d0: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e   on the left-han
04e0: 64 20 61 6e 64 0a 2a 2a 20 72 69 67 68 74 2d 68  d and.** right-h
04f0: 61 6e 64 20 73 69 64 65 20 6f 66 20 45 78 70 72  and side of Expr
0500: 49 6e 66 6f 2e 70 2e 20 20 49 66 20 65 69 74 68  Info.p.  If eith
0510: 65 72 20 73 69 64 65 20 6f 66 20 45 78 70 72 49  er side of ExprI
0520: 6e 66 6f 2e 70 20 69 73 0a 2a 2a 20 73 6f 6d 65  nfo.p is.** some
0530: 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e  thing other than
0540: 20 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d 6e   a simple column
0550: 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65 6e   reference, then
0560: 20 69 64 78 4c 65 66 74 20 6f 72 0a 2a 2a 20 69   idxLeft or.** i
0570: 64 78 52 69 67 68 74 20 61 72 65 20 2d 31 2e 20  dxRight are -1. 
0580: 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74 68   .**.** It is th
0590: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  e VDBE cursor nu
05a0: 6d 62 65 72 20 69 73 20 74 68 65 20 76 61 6c 75  mber is the valu
05b0: 65 20 73 74 6f 72 65 64 20 69 6e 20 45 78 70 72  e stored in Expr
05c0: 2e 69 54 61 62 6c 65 0a 2a 2a 20 77 68 65 6e 20  .iTable.** when 
05d0: 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55  Expr.op==TK_COLU
05e0: 4d 4e 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  MN and the value
05f0: 20 73 74 6f 72 65 64 20 69 6e 20 53 72 63 4c 69   stored in SrcLi
0600: 73 74 2e 61 5b 5d 2e 69 43 75 72 73 6f 72 2e 0a  st.a[].iCursor..
0610: 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 4c 65 66 74  **.** prereqLeft
0620: 2c 20 70 72 65 72 65 71 52 69 67 68 74 2c 20 61  , prereqRight, a
0630: 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65 63  nd prereqAll rec
0640: 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72 73  ord sets of curs
0650: 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20 62  or numbers,.** b
0660: 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69 6e  ut they do so in
0670: 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69 6e  directly.  A sin
0680: 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74 20  gle ExprMaskSet 
0690: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 6c  structure transl
06a0: 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20 6e  ates.** cursor n
06b0: 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73 20  umber into bits 
06c0: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61 74  and the translat
06d0: 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65 64  ed bit is stored
06e0: 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a 2a   in the prereq.*
06f0: 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 74  * fields.  The t
0700: 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75 73  ranslation is us
0710: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ed in order to m
0720: 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d 62  aximize the numb
0730: 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74 68  er of.** bits th
0740: 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20 61  at will fit in a
0750: 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20 56   Bitmask.  The V
0760: 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  DBE cursor numbe
0770: 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20 73  rs might be.** s
0780: 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20 74  pread out over t
0790: 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 20  he non-negative 
07a0: 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20 65  integers.  For e
07b0: 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72 73  xample, the curs
07c0: 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d 69  or.** numbers mi
07d0: 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c 20  ght be 3, 8, 9, 
07e0: 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c 20  10, 20, 23, 41, 
07f0: 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78 70  and 45.  The Exp
0800: 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61 6e  rMaskSet.** tran
0810: 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70 61  slates these spa
0820: 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  rse cursor numbe
0830: 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74  rs into consecut
0840: 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  ive integers.** 
0850: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
0860: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
0870: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73 69  e the best possi
0880: 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20 61  ble use of the a
0890: 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74 73  vailable.** bits
08a0: 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b 2e   in the Bitmask.
08b0: 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78 61    So, in the exa
08c0: 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65 20  mple above, the 
08d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a 2a  cursor numbers.*
08e0: 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70 65  * would be mappe
08f0: 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73 20  d into integers 
0900: 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a 0a  0 through 7..**.
0910: 2a 2a 20 70 72 65 72 65 71 4c 65 66 74 20 74 65  ** prereqLeft te
0920: 6c 6c 73 20 75 73 20 65 76 65 72 79 20 56 44 42  lls us every VDB
0930: 45 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  E cursor that is
0940: 20 72 65 66 65 72 65 6e 63 65 64 20 6f 6e 20 74   referenced on t
0950: 68 65 0a 2a 2a 20 6c 65 66 74 2d 68 61 6e 64 20  he.** left-hand 
0960: 73 69 64 65 20 6f 66 20 45 78 70 72 49 6e 66 6f  side of ExprInfo
0970: 2e 70 2e 20 20 70 72 65 72 65 71 52 69 67 68 74  .p.  prereqRight
0980: 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 66   does the same f
0990: 6f 72 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d  or the.** right-
09a0: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
09b0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
09c0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64 65 6e  e following iden
09d0: 74 69 74 79 20 61 6c 77 61 79 73 0a 2a 2a 20 68  tity always.** h
09e0: 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  olds:.**.**     
09f0: 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20 70 72    prereqAll = pr
0a00: 65 72 65 71 4c 65 66 74 20 7c 20 70 72 65 72 65  ereqLeft | prere
0a10: 71 52 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65  qRight.**.** The
0a20: 20 45 78 70 72 49 6e 66 6f 2e 69 6e 64 65 78 61   ExprInfo.indexa
0a30: 62 6c 65 20 66 69 65 6c 64 20 69 73 20 74 72 75  ble field is tru
0a40: 65 20 69 66 20 74 68 65 20 45 78 70 72 49 6e 66  e if the ExprInf
0a50: 6f 2e 70 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  o.p expression.*
0a60: 2a 20 69 73 20 6f 66 20 61 20 66 6f 72 6d 20 74  * is of a form t
0a70: 68 61 74 20 6d 69 67 68 74 20 63 6f 6e 74 72 6f  hat might contro
0a80: 6c 20 61 6e 20 69 6e 64 65 78 2e 20 20 49 6e 64  l an index.  Ind
0a90: 65 78 61 62 6c 65 20 65 78 70 72 65 73 73 69 6f  exable expressio
0aa0: 6e 73 0a 2a 2a 20 6c 6f 6f 6b 20 6c 69 6b 65 20  ns.** look like 
0ab0: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
0ac0: 20 20 20 20 20 20 20 20 20 3c 63 6f 6c 75 6d 6e           <column
0ad0: 3e 20 3c 6f 70 3e 20 3c 65 78 70 72 3e 0a 2a 2a  > <op> <expr>.**
0ae0: 0a 2a 2a 20 57 68 65 72 65 20 3c 63 6f 6c 75 6d  .** Where <colum
0af0: 6e 3e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 63  n> is a simple c
0b00: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61 6e 64 20 3c  olumn name and <
0b10: 6f 70 3e 20 69 73 20 6f 6e 20 6f 66 20 74 68 65  op> is on of the
0b20: 20 6f 70 65 72 61 74 6f 72 73 0a 2a 2a 20 74 68   operators.** th
0b30: 61 74 20 61 6c 6c 6f 77 65 64 4f 70 28 29 20 72  at allowedOp() r
0b40: 65 63 6f 67 6e 69 7a 65 73 2e 20 20 0a 2a 2f 0a  ecognizes.  .*/.
0b50: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
0b60: 78 70 72 49 6e 66 6f 20 45 78 70 72 49 6e 66 6f  xprInfo ExprInfo
0b70: 3b 0a 73 74 72 75 63 74 20 45 78 70 72 49 6e 66  ;.struct ExprInf
0b80: 6f 20 7b 0a 20 20 45 78 70 72 20 2a 70 3b 20 20  o {.  Expr *p;  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0ba0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
0bb0: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f  subexpression */
0bc0: 0a 20 20 75 38 20 69 6e 64 65 78 61 62 6c 65 3b  .  u8 indexable;
0bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
0be0: 75 65 20 69 66 20 74 68 69 73 20 73 75 62 65 78  ue if this subex
0bf0: 70 72 73 73 69 6f 6e 20 69 73 20 75 73 61 62 6c  prssion is usabl
0c00: 65 20 62 79 20 61 6e 20 69 6e 64 65 78 20 2a 2f  e by an index */
0c10: 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 69 64 78  .  short int idx
0c20: 4c 65 66 74 3b 20 20 20 20 20 20 2f 2a 20 70 2d  Left;      /* p-
0c30: 3e 70 4c 65 66 74 20 69 73 20 61 20 63 6f 6c 75  >pLeft is a colu
0c40: 6d 6e 20 69 6e 20 74 68 69 73 20 74 61 62 6c 65  mn in this table
0c50: 20 6e 75 6d 62 65 72 2e 20 2d 31 20 69 66 0a 20   number. -1 if. 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 2a 2a 20 70 2d 3e 70           ** p->p
0c80: 4c 65 66 74 20 69 73 20 6e 6f 74 20 74 68 65 20  Left is not the 
0c90: 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 79 20 74 61  column of any ta
0ca0: 62 6c 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69  ble */.  short i
0cb0: 6e 74 20 69 64 78 52 69 67 68 74 3b 20 20 20 20  nt idxRight;    
0cc0: 20 2f 2a 20 70 2d 3e 70 52 69 67 68 74 20 69 73   /* p->pRight is
0cd0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 69   a column in thi
0ce0: 73 20 74 61 62 6c 65 20 6e 75 6d 62 65 72 2e 20  s table number. 
0cf0: 2d 31 20 69 66 0a 20 20 20 20 20 20 20 20 20 20  -1 if.          
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 2a 2a 20 70 2d 3e 70 52 69 67 68 74 20 69 73 20  ** p->pRight is 
0d20: 6e 6f 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6f  not the column o
0d30: 66 20 61 6e 79 20 74 61 62 6c 65 20 2a 2f 0a 20  f any table */. 
0d40: 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65 71 4c   Bitmask prereqL
0d50: 65 66 74 3b 20 20 20 20 20 2f 2a 20 42 69 74 6d  eft;     /* Bitm
0d60: 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20 72 65  ask of tables re
0d70: 66 65 72 65 6e 63 65 64 20 62 79 20 70 2d 3e 70  ferenced by p->p
0d80: 4c 65 66 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73  Left */.  Bitmas
0d90: 6b 20 70 72 65 72 65 71 52 69 67 68 74 3b 20 20  k prereqRight;  
0da0: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0db0: 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
0dc0: 64 20 62 79 20 70 2d 3e 70 52 69 67 68 74 20 2a  d by p->pRight *
0dd0: 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72  /.  Bitmask prer
0de0: 65 71 41 6c 6c 3b 20 20 20 20 20 20 2f 2a 20 42  eqAll;      /* B
0df0: 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73  itmask of tables
0e00: 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70   referenced by p
0e10: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e   */.};../*.** An
0e20: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
0e30: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
0e40: 74 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b  ture keeps track
0e50: 20 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a   of a mapping.**
0e60: 20 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75   between VDBE cu
0e70: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64  rsor numbers and
0e80: 20 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74   bits of the bit
0e90: 6d 61 73 6b 73 20 69 6e 20 45 78 70 72 49 6e 66  masks in ExprInf
0ea0: 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  o..**.** The VDB
0eb0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
0ec0: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
0ed0: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
0ee0: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
0ef0: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
0f00: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
0f10: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
0f20: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
0f30: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
0f40: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
0f50: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
0f60: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
0f70: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
0f80: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
0f90: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
0fa0: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
0fb0: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
0fc0: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
0fd0: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
0fe0: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
0ff0: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
1000: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
1010: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
1020: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
1030: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
1040: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
1050: 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74  * If ExprMaskSet
1060: 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61  .ix[A]==B it mea
1070: 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68  ns that The A-th
1080: 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73   bit of a Bitmas
1090: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  k.** corresponds
10a0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
10b0: 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68  ber B.  The A-th
10c0: 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73   bit of a bitmas
10d0: 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a  k is 1<<A..**.**
10e0: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
10f0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1100: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  e expression use
1110: 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20  d these VDBE.** 
1120: 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20  cursors:  4, 5, 
1130: 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20  8, 29, 57, 73.  
1140: 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61  Then the  ExprMa
1150: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a  skSet structure.
1160: 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f  ** would map tho
1170: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1180: 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68  s into bits 0 th
1190: 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e  rough 5..**.** N
11a0: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70  ote that the map
11b0: 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ping is not nece
11c0: 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e  ssarily ordered.
11d0: 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65    In the example
11e0: 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d  .** above, the m
11f0: 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20  apping might go 
1200: 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33  like this:  4->3
1210: 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39  , 5->1, 8->2, 29
1220: 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37  ->0,.** 57->5, 7
1230: 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66  3->4.  Or one of
1240: 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69   719 other combi
1250: 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65  nations might be
1260: 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65   used. It.** doe
1270: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74  s not really mat
1280: 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d  ter.  What is im
1290: 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20  portant is that 
12a0: 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a  sparse cursor.**
12b0: 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74   numbers all get
12c0: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74   mapped into bit
12d0: 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65   numbers that be
12e0: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63  gin with 0 and c
12f0: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70  ontain.** no gap
1300: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
1310: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1320: 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73 74   ExprMaskSet;.st
1330: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
1340: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1370: 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20  assigned cursor 
1380: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1390: 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  ix[sizeof(Bitmas
13a0: 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75 72  k)*8];    /* Cur
13b0: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
13c0: 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a  each bit */.};..
13d0: 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20  /*.** Determine 
13e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
13f0: 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72  ements in an arr
1400: 61 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41  ay..*/.#define A
1410: 52 52 41 59 53 49 5a 45 28 58 29 20 20 28 73 69  RRAYSIZE(X)  (si
1420: 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58  zeof(X)/sizeof(X
1430: 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  [0]))../*.** Thi
1440: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
1450: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
1460: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
1470: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
1480: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
1490: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 20  ion is separate 
14a0: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
14b0: 74 6f 72 2e 20 20 61 53 6c 6f 74 20 69 73 20 0a  tor.  aSlot is .
14c0: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  ** filled with p
14d0: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 73  ointers to the s
14e0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
14f0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1500: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1510: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1520: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1530: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1540: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1550: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1560: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1570: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1580: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1590: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
15a0: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
15b0: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
15c0: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
15d0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
15e0: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
15f0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1600: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1610: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1620: 65 20 61 53 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  e aSlot[] entrie
1630: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
1640: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
1650: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 61 53 6c 6f  Expr..**.** aSlo
1660: 74 5b 5d 20 69 73 20 61 6e 20 61 72 72 61 79 20  t[] is an array 
1670: 6f 66 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  of subexpression
1680: 73 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 54  s structures.  T
1690: 68 65 72 65 20 61 72 65 20 6e 53 6c 6f 74 0a 2a  here are nSlot.*
16a0: 2a 20 73 70 61 63 65 73 20 6c 65 66 74 20 69 6e  * spaces left in
16b0: 20 74 68 69 73 20 61 72 72 61 79 2e 20 20 54 68   this array.  Th
16c0: 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 73  is routine finds
16d0: 20 61 73 20 6d 61 6e 79 20 41 4e 44 2d 73 65 70   as many AND-sep
16e0: 61 72 61 74 65 64 0a 2a 2a 20 73 75 62 65 78 70  arated.** subexp
16f0: 72 65 73 73 69 6f 6e 73 20 61 73 20 69 74 20 63  ressions as it c
1700: 61 6e 20 61 6e 64 20 70 75 74 73 20 70 6f 69 6e  an and puts poin
1710: 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20 73 75  ters to those su
1720: 62 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20  bexpressions.** 
1730: 69 6e 74 6f 20 61 53 6c 6f 74 5b 5d 20 65 6e 74  into aSlot[] ent
1740: 72 69 65 73 2e 20 20 54 68 65 20 72 65 74 75 72  ries.  The retur
1750: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
1760: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 66  umber of slots f
1770: 69 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  illed..*/.static
1780: 20 69 6e 74 20 65 78 70 72 53 70 6c 69 74 28 69   int exprSplit(i
1790: 6e 74 20 6e 53 6c 6f 74 2c 20 45 78 70 72 49 6e  nt nSlot, ExprIn
17a0: 66 6f 20 2a 61 53 6c 6f 74 2c 20 45 78 70 72 20  fo *aSlot, Expr 
17b0: 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 63  *pExpr){.  int c
17c0: 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  nt = 0;.  if( pE
17d0: 78 70 72 3d 3d 30 20 7c 7c 20 6e 53 6c 6f 74 3c  xpr==0 || nSlot<
17e0: 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  1 ) return 0;.  
17f0: 69 66 28 20 6e 53 6c 6f 74 3d 3d 31 20 7c 7c 20  if( nSlot==1 || 
1800: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pExpr->op!=TK_AN
1810: 44 20 29 7b 0a 20 20 20 20 61 53 6c 6f 74 5b 30  D ){.    aSlot[0
1820: 5d 2e 70 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ].p = pExpr;.   
1830: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
1840: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
1850: 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4e 44 20 29 7b  t->op!=TK_AND ){
1860: 0a 20 20 20 20 61 53 6c 6f 74 5b 30 5d 2e 70 20  .    aSlot[0].p 
1870: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
1880: 20 20 20 20 63 6e 74 20 3d 20 31 20 2b 20 65 78      cnt = 1 + ex
1890: 70 72 53 70 6c 69 74 28 6e 53 6c 6f 74 2d 31 2c  prSplit(nSlot-1,
18a0: 20 26 61 53 6c 6f 74 5b 31 5d 2c 20 70 45 78 70   &aSlot[1], pExp
18b0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 65  r->pRight);.  }e
18c0: 6c 73 65 7b 0a 20 20 20 20 63 6e 74 20 3d 20 65  lse{.    cnt = e
18d0: 78 70 72 53 70 6c 69 74 28 6e 53 6c 6f 74 2c 20  xprSplit(nSlot, 
18e0: 61 53 6c 6f 74 2c 20 70 45 78 70 72 2d 3e 70 4c  aSlot, pExpr->pL
18f0: 65 66 74 29 3b 0a 20 20 20 20 63 6e 74 20 2b 3d  eft);.    cnt +=
1900: 20 65 78 70 72 53 70 6c 69 74 28 6e 53 6c 6f 74   exprSplit(nSlot
1910: 2d 63 6e 74 2c 20 26 61 53 6c 6f 74 5b 63 6e 74  -cnt, &aSlot[cnt
1920: 5d 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ], pExpr->pRight
1930: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1940: 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  cnt;.}../*.** In
1950: 69 74 69 61 6c 69 7a 65 20 61 6e 20 65 78 70 72  itialize an expr
1960: 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65 74 0a  ession mask set.
1970: 2a 2f 0a 23 64 65 66 69 6e 65 20 69 6e 69 74 4d  */.#define initM
1980: 61 73 6b 53 65 74 28 50 29 20 20 6d 65 6d 73 65  askSet(P)  memse
1990: 74 28 50 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(P, 0, sizeof(*
19a0: 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  P))../*.** Retur
19b0: 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 20 66 6f  n the bitmask fo
19c0: 72 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73  r the given curs
19d0: 6f 72 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  or number.  Retu
19e0: 72 6e 20 30 20 69 66 0a 2a 2a 20 69 43 75 72 73  rn 0 if.** iCurs
19f0: 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  or is not in the
1a00: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
1a10: 42 69 74 6d 61 73 6b 20 67 65 74 4d 61 73 6b 28  Bitmask getMask(
1a20: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
1a30: 73 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73  skSet, int iCurs
1a40: 6f 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  or){.  int i;.  
1a50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4d 61 73 6b  for(i=0; i<pMask
1a60: 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29 7b 0a 20 20  Set->n; i++){.  
1a70: 20 20 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e    if( pMaskSet->
1a80: 69 78 5b 69 5d 3d 3d 69 43 75 72 73 6f 72 20 29  ix[i]==iCursor )
1a90: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  {.      return (
1aa0: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 69 3b 0a  (Bitmask)1)<<i;.
1ab0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ac0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
1ad0: 72 65 61 74 65 20 61 20 6e 65 77 20 6d 61 73 6b  reate a new mask
1ae0: 20 66 6f 72 20 63 75 72 73 6f 72 20 69 43 75 72   for cursor iCur
1af0: 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sor..*/.static v
1b00: 6f 69 64 20 63 72 65 61 74 65 4d 61 73 6b 28 45  oid createMask(E
1b10: 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73  xprMaskSet *pMas
1b20: 6b 53 65 74 2c 20 69 6e 74 20 69 43 75 72 73 6f  kSet, int iCurso
1b30: 72 29 7b 0a 20 20 69 66 28 20 70 4d 61 73 6b 53  r){.  if( pMaskS
1b40: 65 74 2d 3e 6e 3c 41 52 52 41 59 53 49 5a 45 28  et->n<ARRAYSIZE(
1b50: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 29 20 29 7b  pMaskSet->ix) ){
1b60: 0a 20 20 20 20 70 4d 61 73 6b 53 65 74 2d 3e 69  .    pMaskSet->i
1b70: 78 5b 70 4d 61 73 6b 53 65 74 2d 3e 6e 2b 2b 5d  x[pMaskSet->n++]
1b80: 20 3d 20 69 43 75 72 73 6f 72 3b 0a 20 20 7d 0a   = iCursor;.  }.
1b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 74 72 6f 79  }../*.** Destroy
1ba0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6d   an expression m
1bb0: 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65 66 69  ask set.*/.#defi
1bc0: 6e 65 20 66 72 65 65 4d 61 73 6b 53 65 74 28 50  ne freeMaskSet(P
1bd0: 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  )   /* NO-OP */.
1be0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bf0: 69 6e 65 20 77 61 6c 6b 73 20 28 72 65 63 75 72  ine walks (recur
1c00: 73 69 76 65 6c 79 29 20 61 6e 20 65 78 70 72 65  sively) an expre
1c10: 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 67  ssion tree and g
1c20: 65 6e 65 72 61 74 65 73 0a 2a 2a 20 61 20 62 69  enerates.** a bi
1c30: 74 6d 61 73 6b 20 69 6e 64 69 63 61 74 69 6e 67  tmask indicating
1c40: 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 61 72   which tables ar
1c50: 65 20 75 73 65 64 20 69 6e 20 74 68 61 74 20 65  e used in that e
1c60: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65  xpression.** tre
1c70: 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65  e..**.** In orde
1c80: 72 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69  r for this routi
1c90: 6e 65 20 74 6f 20 77 6f 72 6b 2c 20 74 68 65 20  ne to work, the 
1ca0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
1cb0: 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 70 72   must have.** pr
1cc0: 65 76 69 6f 75 73 6c 79 20 69 6e 76 6f 6b 65 64  eviously invoked
1cd0: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
1ce0: 6c 76 65 4e 61 6d 65 73 28 29 20 6f 6e 20 74 68  lveNames() on th
1cf0: 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 53  e expression.  S
1d00: 65 65 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72  ee.** the header
1d10: 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 61 74   comment on that
1d20: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
1d30: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
1d40: 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ion..** The sqli
1d50: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61  te3ExprResolveNa
1d60: 6d 65 73 28 29 20 72 6f 75 74 69 6e 65 73 20 6c  mes() routines l
1d70: 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ooks for column 
1d80: 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a 20 73 65 74  names and.** set
1d90: 73 20 74 68 65 69 72 20 6f 70 63 6f 64 65 73 20  s their opcodes 
1da0: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 61 6e 64  to TK_COLUMN and
1db0: 20 74 68 65 69 72 20 45 78 70 72 2e 69 54 61 62   their Expr.iTab
1dc0: 6c 65 20 66 69 65 6c 64 73 20 74 6f 0a 2a 2a 20  le fields to.** 
1dd0: 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20  the VDBE cursor 
1de0: 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 61  number of the ta
1df0: 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 42  ble..*/.static B
1e00: 69 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54  itmask exprListT
1e10: 61 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61  ableUsage(ExprMa
1e20: 73 6b 53 65 74 20 2a 2c 20 45 78 70 72 4c 69 73  skSet *, ExprLis
1e30: 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 42 69 74  t *);.static Bit
1e40: 6d 61 73 6b 20 65 78 70 72 54 61 62 6c 65 55 73  mask exprTableUs
1e50: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
1e60: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 20  *pMaskSet, Expr 
1e70: 2a 70 29 7b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  *p){.  Bitmask m
1e80: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
1e90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1ea0: 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f    if( p->op==TK_
1eb0: 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 6d 61  COLUMN ){.    ma
1ec0: 73 6b 20 3d 20 67 65 74 4d 61 73 6b 28 70 4d 61  sk = getMask(pMa
1ed0: 73 6b 53 65 74 2c 20 70 2d 3e 69 54 61 62 6c 65  skSet, p->iTable
1ee0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6d 61  );.    return ma
1ef0: 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61 73 6b 20 3d  sk;.  }.  mask =
1f00: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
1f10: 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 52 69  pMaskSet, p->pRi
1f20: 67 68 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20  ght);.  mask |= 
1f30: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
1f40: 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c 65 66  MaskSet, p->pLef
1f50: 74 29 3b 0a 20 20 6d 61 73 6b 20 7c 3d 20 65 78  t);.  mask |= ex
1f60: 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65  prListTableUsage
1f70: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 70 4c  (pMaskSet, p->pL
1f80: 69 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ist);.  if( p->p
1f90: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 53 65  Select ){.    Se
1fa0: 6c 65 63 74 20 2a 70 53 20 3d 20 70 2d 3e 70 53  lect *pS = p->pS
1fb0: 65 6c 65 63 74 3b 0a 20 20 20 20 6d 61 73 6b 20  elect;.    mask 
1fc0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
1fd0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
1fe0: 70 53 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20  pS->pEList);.   
1ff0: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73   mask |= exprLis
2000: 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  tTableUsage(pMas
2010: 6b 53 65 74 2c 20 70 53 2d 3e 70 47 72 6f 75 70  kSet, pS->pGroup
2020: 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d  By);.    mask |=
2030: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
2040: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2050: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20  ->pOrderBy);.   
2060: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2070: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2080: 2c 20 70 53 2d 3e 70 57 68 65 72 65 29 3b 0a 20  , pS->pWhere);. 
2090: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54     mask |= exprT
20a0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
20b0: 65 74 2c 20 70 53 2d 3e 70 48 61 76 69 6e 67 29  et, pS->pHaving)
20c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  ;.  }.  return m
20d0: 61 73 6b 3b 0a 7d 0a 73 74 61 74 69 63 20 42 69  ask;.}.static Bi
20e0: 74 6d 61 73 6b 20 65 78 70 72 4c 69 73 74 54 61  tmask exprListTa
20f0: 62 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73  bleUsage(ExprMas
2100: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
2110: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
2120: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42 69 74  {.  int i;.  Bit
2130: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20  mask mask = 0;. 
2140: 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
2150: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
2160: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
2170: 0a 20 20 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  .      mask |= e
2180: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
2190: 61 73 6b 53 65 74 2c 20 70 4c 69 73 74 2d 3e 61  askSet, pList->a
21a0: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
21b0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6d  }.  }.  return m
21c0: 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ask;.}../*.** Re
21d0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
21e0: 20 67 69 76 65 6e 20 6f 70 65 72 61 74 6f 72 20   given operator 
21f0: 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 6f 70  is one of the op
2200: 65 72 61 74 6f 72 73 20 74 68 61 74 20 69 73 0a  erators that is.
2210: 2a 2a 20 61 6c 6c 6f 77 65 64 20 66 6f 72 20 61  ** allowed for a
2220: 6e 20 69 6e 64 65 78 61 62 6c 65 20 57 48 45 52  n indexable WHER
2230: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 2e 20 20  E clause term.  
2240: 54 68 65 20 61 6c 6c 6f 77 65 64 20 6f 70 65 72  The allowed oper
2250: 61 74 6f 72 73 20 61 72 65 0a 2a 2a 20 22 3d 22  ators are.** "="
2260: 2c 20 22 3c 22 2c 20 22 3e 22 2c 20 22 3c 3d 22  , "<", ">", "<="
2270: 2c 20 22 3e 3d 22 2c 20 61 6e 64 20 22 49 4e 22  , ">=", and "IN"
2280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2290: 61 6c 6c 6f 77 65 64 4f 70 28 69 6e 74 20 6f 70  allowedOp(int op
22a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 54 4b 5f  ){.  assert( TK_
22b0: 47 54 3d 3d 54 4b 5f 4c 45 2d 31 20 26 26 20 54  GT==TK_LE-1 && T
22c0: 4b 5f 4c 45 3d 3d 54 4b 5f 4c 54 2d 31 20 26 26  K_LE==TK_LT-1 &&
22d0: 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 45 2d 31 20   TK_LT==TK_GE-1 
22e0: 26 26 20 54 4b 5f 45 51 3d 3d 54 4b 5f 47 54 2d  && TK_EQ==TK_GT-
22f0: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f 70 3d  1);.  return op=
2300: 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f 70 3e 3d 54  =TK_IN || (op>=T
2310: 4b 5f 45 51 20 26 26 20 6f 70 3c 3d 54 4b 5f 47  K_EQ && op<=TK_G
2320: 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61  E);.}../*.** Swa
2330: 70 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 6f 66  p two objects of
2340: 20 74 79 70 65 20 54 2e 0a 2a 2f 0a 23 64 65 66   type T..*/.#def
2350: 69 6e 65 20 53 57 41 50 28 54 59 50 45 2c 41 2c  ine SWAP(TYPE,A,
2360: 42 29 20 7b 54 59 50 45 20 74 3d 41 3b 20 41 3d  B) {TYPE t=A; A=
2370: 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a 0a 2a 2a 20  B; B=t;}../*.** 
2380: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
2390: 20 69 6e 20 74 68 65 20 53 72 63 4c 69 73 74 20   in the SrcList 
23a0: 74 68 61 74 20 75 73 65 73 20 63 75 72 73 6f 72  that uses cursor
23b0: 20 69 43 75 72 2e 20 20 49 66 20 69 43 75 72 20   iCur.  If iCur 
23c0: 69 73 0a 2a 2a 20 75 73 65 64 20 62 79 20 74 68  is.** used by th
23d0: 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e  e first entry in
23e0: 20 53 72 63 4c 69 73 74 20 72 65 74 75 72 6e 20   SrcList return 
23f0: 30 2e 20 20 49 66 20 69 43 75 72 20 69 73 20 75  0.  If iCur is u
2400: 73 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 73 65  sed by.** the se
2410: 63 6f 6e 64 20 65 6e 74 72 79 20 72 65 74 75 72  cond entry retur
2420: 6e 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  n 1.  And so for
2430: 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 72 63 4c 69 73  th..**.** SrcLis
2440: 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20  t is the set of 
2450: 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46 52  tables in the FR
2460: 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  OM clause in the
2470: 20 6f 72 64 65 72 20 74 68 61 74 0a 2a 2a 20 74   order that.** t
2480: 68 65 79 20 77 69 6c 6c 20 62 65 20 70 72 6f 63  hey will be proc
2490: 65 73 73 65 64 2e 20 20 54 68 65 20 76 61 6c 75  essed.  The valu
24a0: 65 20 72 65 74 75 72 6e 65 64 20 68 65 72 65 20  e returned here 
24b0: 67 69 76 65 73 20 75 73 20 61 6e 20 69 6e 64 65  gives us an inde
24c0: 78 0a 2a 2a 20 6f 66 20 77 68 69 63 68 20 74 61  x.** of which ta
24d0: 62 6c 65 73 20 77 69 6c 6c 20 62 65 20 70 72 6f  bles will be pro
24e0: 63 65 73 73 65 64 20 66 69 72 73 74 2e 0a 2a 2f  cessed first..*/
24f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 61 62 6c  .static int tabl
2500: 65 4f 72 64 65 72 28 53 72 63 4c 69 73 74 20 2a  eOrder(SrcList *
2510: 70 4c 69 73 74 2c 20 69 6e 74 20 69 43 75 72 29  pList, int iCur)
2520: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
2530: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2540: 20 2a 70 49 74 65 6d 3b 0a 20 20 66 6f 72 28 69   *pItem;.  for(i
2550: 3d 30 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d  =0, pItem=pList-
2560: 3e 61 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 53 72  >a; i<pList->nSr
2570: 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  c; i++, pItem++)
2580: 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d  {.    if( pItem-
2590: 3e 69 43 75 72 73 6f 72 3d 3d 69 43 75 72 20 29  >iCursor==iCur )
25a0: 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 7d 0a 20   return i;.  }. 
25b0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
25c0: 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20 74  *.** The input t
25d0: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
25e0: 73 20 61 6e 20 45 78 70 72 49 6e 66 6f 20 73 74  s an ExprInfo st
25f0: 72 75 63 74 75 72 65 20 77 69 74 68 20 6f 6e 6c  ructure with onl
2600: 79 20 74 68 65 0a 2a 2a 20 22 70 22 20 66 69 65  y the.** "p" fie
2610: 6c 64 20 66 69 6c 6c 65 64 20 69 6e 2e 20 20 54  ld filled in.  T
2620: 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20 72  he job of this r
2630: 6f 75 74 69 6e 65 20 69 73 20 74 6f 20 61 6e 61  outine is to ana
2640: 6c 79 7a 65 20 74 68 65 0a 2a 2a 20 73 75 62 65  lyze the.** sube
2650: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 6f  xpression and po
2660: 70 75 6c 61 74 65 20 61 6c 6c 20 74 68 65 20 6f  pulate all the o
2670: 74 68 65 72 20 66 69 65 6c 64 73 20 6f 66 20 74  ther fields of t
2680: 68 65 20 45 78 70 72 49 6e 66 6f 0a 2a 2a 20 73  he ExprInfo.** s
2690: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61  tructure..*/.sta
26a0: 74 69 63 20 76 6f 69 64 20 65 78 70 72 41 6e 61  tic void exprAna
26b0: 6c 79 7a 65 28 53 72 63 4c 69 73 74 20 2a 70 53  lyze(SrcList *pS
26c0: 72 63 2c 20 45 78 70 72 4d 61 73 6b 53 65 74 20  rc, ExprMaskSet 
26d0: 2a 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 49  *pMaskSet, ExprI
26e0: 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 45  nfo *pInfo){.  E
26f0: 78 70 72 20 2a 70 45 78 70 72 20 3d 20 70 49 6e  xpr *pExpr = pIn
2700: 66 6f 2d 3e 70 3b 0a 20 20 70 49 6e 66 6f 2d 3e  fo->p;.  pInfo->
2710: 70 72 65 72 65 71 4c 65 66 74 20 3d 20 65 78 70  prereqLeft = exp
2720: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2730: 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  kSet, pExpr->pLe
2740: 66 74 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 72  ft);.  pInfo->pr
2750: 65 72 65 71 52 69 67 68 74 20 3d 20 65 78 70 72  ereqRight = expr
2760: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2770: 53 65 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  Set, pExpr->pRig
2780: 68 74 29 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 72  ht);.  pInfo->pr
2790: 65 72 65 71 41 6c 6c 20 3d 20 65 78 70 72 54 61  ereqAll = exprTa
27a0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
27b0: 74 2c 20 70 45 78 70 72 29 3b 0a 20 20 70 49 6e  t, pExpr);.  pIn
27c0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
27d0: 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4c  0;.  pInfo->idxL
27e0: 65 66 74 20 3d 20 2d 31 3b 0a 20 20 70 49 6e 66  eft = -1;.  pInf
27f0: 6f 2d 3e 69 64 78 52 69 67 68 74 20 3d 20 2d 31  o->idxRight = -1
2800: 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f  ;.  if( allowedO
2810: 70 28 70 45 78 70 72 2d 3e 6f 70 29 20 26 26 20  p(pExpr->op) && 
2820: 28 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71 52 69  (pInfo->prereqRi
2830: 67 68 74 20 26 20 70 49 6e 66 6f 2d 3e 70 72 65  ght & pInfo->pre
2840: 72 65 71 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20  reqLeft)==0 ){. 
2850: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
2860: 69 67 68 74 20 26 26 20 70 45 78 70 72 2d 3e 70  ight && pExpr->p
2870: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  Right->op==TK_CO
2880: 4c 55 4d 4e 20 29 7b 0a 20 20 20 20 20 20 70 49  LUMN ){.      pI
2890: 6e 66 6f 2d 3e 69 64 78 52 69 67 68 74 20 3d 20  nfo->idxRight = 
28a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e 69  pExpr->pRight->i
28b0: 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 70 49 6e  Table;.      pIn
28c0: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20  fo->indexable = 
28d0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
28e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f   pExpr->pLeft->o
28f0: 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a  p==TK_COLUMN ){.
2900: 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78        pInfo->idx
2910: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
2920: 65 66 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  eft->iTable;.   
2930: 20 20 20 70 49 6e 66 6f 2d 3e 69 6e 64 65 78 61     pInfo->indexa
2940: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ble = 1;.    }. 
2950: 20 7d 0a 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e   }.  if( pInfo->
2960: 69 6e 64 65 78 61 62 6c 65 20 29 7b 0a 20 20 20  indexable ){.   
2970: 20 61 73 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e   assert( pInfo->
2980: 69 64 78 4c 65 66 74 21 3d 70 49 6e 66 6f 2d 3e  idxLeft!=pInfo->
2990: 69 64 78 52 69 67 68 74 20 29 3b 0a 0a 20 20 20  idxRight );..   
29a0: 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 68 65 20   /* We want the 
29b0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
29c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 58 20   of the form "X 
29d0: 3d 20 65 78 70 72 22 2c 20 6e 6f 74 20 22 65 78  = expr", not "ex
29e0: 70 72 20 3d 20 58 22 2e 0a 20 20 20 20 2a 2a 20  pr = X"..    ** 
29f0: 53 6f 20 66 6c 69 70 20 69 74 20 6f 76 65 72 20  So flip it over 
2a00: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 49  if necessary.  I
2a10: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
2a20: 20 69 73 20 22 58 20 3d 20 59 22 2c 20 74 68 65   is "X = Y", the
2a30: 6e 0a 20 20 20 20 2a 2a 20 77 65 20 77 61 6e 74  n.    ** we want
2a40: 20 59 20 74 6f 20 63 6f 6d 65 20 66 72 6f 6d 20   Y to come from 
2a50: 61 6e 20 65 61 72 6c 69 65 72 20 74 61 62 6c 65  an earlier table
2a60: 20 74 68 61 6e 20 58 2e 0a 20 20 20 20 2a 2a 0a   than X..    **.
2a70: 20 20 20 20 2a 2a 20 54 68 65 20 63 6f 6c 6c 61      ** The colla
2a80: 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 72 75  ting sequence ru
2a90: 6c 65 20 69 73 20 74 6f 20 61 6c 77 61 79 73 20  le is to always 
2aa0: 63 68 6f 6f 73 65 20 74 68 65 20 6c 65 66 74 20  choose the left 
2ab0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20  expression..    
2ac0: 2a 2a 20 53 6f 20 69 66 20 77 65 20 64 6f 20 61  ** So if we do a
2ad0: 20 66 6c 69 70 2c 20 77 65 20 61 6c 73 6f 20 68   flip, we also h
2ae0: 61 76 65 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  ave to move the 
2af0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
2b00: 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ce..    */.    i
2b10: 66 28 20 74 61 62 6c 65 4f 72 64 65 72 28 70 53  f( tableOrder(pS
2b20: 72 63 2c 70 49 6e 66 6f 2d 3e 69 64 78 4c 65 66  rc,pInfo->idxLef
2b30: 74 29 3c 74 61 62 6c 65 4f 72 64 65 72 28 70 53  t)<tableOrder(pS
2b40: 72 63 2c 70 49 6e 66 6f 2d 3e 69 64 78 52 69 67  rc,pInfo->idxRig
2b50: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ht) ){.      ass
2b60: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
2b70: 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 53  TK_IN );.      S
2b80: 57 41 50 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78  WAP(CollSeq*,pEx
2b90: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c  pr->pRight->pCol
2ba0: 6c 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e  l,pExpr->pLeft->
2bb0: 70 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 53 57  pColl);.      SW
2bc0: 41 50 28 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e  AP(Expr*,pExpr->
2bd0: 70 52 69 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c  pRight,pExpr->pL
2be0: 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eft);.      if( 
2bf0: 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54  pExpr->op>=TK_GT
2c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
2c10: 72 74 28 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54  rt( TK_LT==TK_GT
2c20: 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  +2 );.        as
2c30: 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f  sert( TK_GE==TK_
2c40: 4c 45 2b 32 20 29 3b 0a 20 20 20 20 20 20 20 20  LE+2 );.        
2c50: 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b  assert( TK_GT>TK
2c60: 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20 61  _EQ );.        a
2c70: 73 73 65 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f  ssert( TK_GT<TK_
2c80: 4c 45 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  LE );.        as
2c90: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e  sert( pExpr->op>
2ca0: 3d 54 4b 5f 47 54 20 26 26 20 70 45 78 70 72 2d  =TK_GT && pExpr-
2cb0: 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20  >op<=TK_GE );.  
2cc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
2cd0: 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b  = ((pExpr->op-TK
2ce0: 5f 47 54 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20  _GT)^2)+TK_GT;. 
2cf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 53 57 41       }.      SWA
2d00: 50 28 75 6e 73 69 67 6e 65 64 2c 20 70 49 6e 66  P(unsigned, pInf
2d10: 6f 2d 3e 70 72 65 72 65 71 4c 65 66 74 2c 20 70  o->prereqLeft, p
2d20: 49 6e 66 6f 2d 3e 70 72 65 72 65 71 52 69 67 68  Info->prereqRigh
2d30: 74 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28 73  t);.      SWAP(s
2d40: 68 6f 72 74 20 69 6e 74 2c 20 70 49 6e 66 6f 2d  hort int, pInfo-
2d50: 3e 69 64 78 4c 65 66 74 2c 20 70 49 6e 66 6f 2d  >idxLeft, pInfo-
2d60: 3e 69 64 78 52 69 67 68 74 29 3b 0a 20 20 20 20  >idxRight);.    
2d70: 7d 0a 20 20 7d 20 20 20 20 20 20 0a 0a 7d 0a 0a  }.  }      ..}..
2d80: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2d90: 6e 65 20 64 65 63 69 64 65 73 20 69 66 20 70 49  ne decides if pI
2da0: 64 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  dx can be used t
2db0: 6f 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  o satisfy the OR
2dc0: 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65  DER BY.** clause
2dd0: 2e 20 20 49 66 20 69 74 20 63 61 6e 2c 20 69 74  .  If it can, it
2de0: 20 72 65 74 75 72 6e 73 20 31 2e 20 20 49 66 20   returns 1.  If 
2df0: 70 49 64 78 20 63 61 6e 6e 6f 74 20 73 61 74 69  pIdx cannot sati
2e00: 73 66 79 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52  sfy the.** ORDER
2e10: 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 69 73   BY clause, this
2e20: 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2e30: 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72   0..**.** pOrder
2e40: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
2e50: 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 61 20  Y clause from a 
2e60: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
2e70: 2e 20 20 70 54 61 62 20 69 73 20 74 68 65 0a 2a  .  pTab is the.*
2e80: 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c  * left-most tabl
2e90: 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c  e in the FROM cl
2ea0: 61 75 73 65 20 6f 66 20 74 68 61 74 20 73 61 6d  ause of that sam
2eb0: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
2ec0: 6e 74 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61  nt and.** the ta
2ed0: 62 6c 65 20 68 61 73 20 61 20 63 75 72 73 6f 72  ble has a cursor
2ee0: 20 6e 75 6d 62 65 72 20 6f 66 20 22 62 61 73 65   number of "base
2ef0: 22 2e 20 20 70 49 64 78 20 69 73 20 61 6e 20 69  ".  pIdx is an i
2f00: 6e 64 65 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a  ndex on pTab..**
2f10: 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69 73 20 74 68  .** nEqCol is th
2f20: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
2f30: 6d 6e 73 20 6f 66 20 70 49 64 78 20 74 68 61 74  mns of pIdx that
2f40: 20 61 72 65 20 75 73 65 64 20 61 73 20 65 71 75   are used as equ
2f50: 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61  ality.** constra
2f60: 69 6e 74 73 2e 20 20 41 6e 79 20 6f 66 20 74 68  ints.  Any of th
2f70: 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20  ese columns may 
2f80: 62 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  be missing from 
2f90: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20  the ORDER BY.** 
2fa0: 63 6c 61 75 73 65 20 61 6e 64 20 74 68 65 20 6d  clause and the m
2fb0: 61 74 63 68 20 63 61 6e 20 73 74 69 6c 6c 20 62  atch can still b
2fc0: 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a  e a success..**.
2fd0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 64 65 78 20  ** If the index 
2fe0: 69 73 20 55 4e 49 51 55 45 2c 20 74 68 65 6e 20  is UNIQUE, then 
2ff0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
3000: 75 73 65 20 69 73 20 61 6c 6c 6f 77 65 64 20 74  use is allowed t
3010: 6f 20 68 61 76 65 0a 2a 2a 20 61 64 64 69 74 69  o have.** additi
3020: 6f 6e 61 6c 20 74 65 72 6d 73 20 70 61 73 74 20  onal terms past 
3030: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
3040: 6e 64 65 78 20 61 6e 64 20 74 68 65 20 6d 61 74  ndex and the mat
3050: 63 68 20 77 69 6c 6c 20 73 74 69 6c 6c 0a 2a 2a  ch will still.**
3060: 20 62 65 20 61 20 73 75 63 63 65 73 73 2e 0a 2a   be a success..*
3070: 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f  *.** All terms o
3080: 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  f the ORDER BY t
3090: 68 61 74 20 6d 61 74 63 68 20 61 67 61 69 6e 73  hat match agains
30a0: 74 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  t the index must
30b0: 20 62 65 20 65 69 74 68 65 72 0a 2a 2a 20 41 53   be either.** AS
30c0: 43 20 6f 72 20 44 45 53 43 2e 20 20 28 54 65 72  C or DESC.  (Ter
30d0: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
30e0: 42 59 20 63 6c 61 75 73 65 20 70 61 73 74 20 74  BY clause past t
30f0: 68 65 20 65 6e 64 20 6f 66 20 61 20 55 4e 49 51  he end of a UNIQ
3100: 55 45 0a 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e  UE.** index do n
3110: 6f 74 20 6e 65 65 64 20 74 6f 20 73 61 74 69 73  ot need to satis
3120: 66 79 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69  fy this constrai
3130: 6e 74 2e 29 20 20 54 68 65 20 2a 70 62 52 65 76  nt.)  The *pbRev
3140: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74   value is.** set
3150: 20 74 6f 20 31 20 69 66 20 74 68 65 20 4f 52 44   to 1 if the ORD
3160: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
3170: 61 6c 6c 20 44 45 53 43 20 61 6e 64 20 69 74 20  all DESC and it 
3180: 69 73 20 73 65 74 20 74 6f 20 30 20 69 66 0a 2a  is set to 0 if.*
3190: 2a 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  * the ORDER BY c
31a0: 6c 61 75 73 65 20 69 73 20 61 6c 6c 20 41 53 43  lause is all ASC
31b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31c0: 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a  isSortingIndex(.
31d0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
31f0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3200: 20 20 49 6e 64 65 78 20 2a 70 49 64 78 2c 20 20    Index *pIdx,  
3210: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
3220: 20 69 6e 64 65 78 20 77 65 20 61 72 65 20 74 65   index we are te
3230: 73 74 69 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65  sting */.  Table
3240: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 20   *pTab,         
3250: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
3260: 74 6f 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a  to be sorted */.
3270: 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20 20 20    int base,     
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3290: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  sor number for p
32a0: 54 61 62 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  Tab */.  ExprLis
32b0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
32c0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
32d0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
32e0: 20 6e 45 71 43 6f 6c 2c 20 20 20 20 20 20 20 20   nEqCol,        
32f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3300: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
3310: 77 69 74 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69  with == constrai
3320: 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nts */.  int *pb
3330: 52 65 76 20 20 20 20 20 20 20 20 20 20 20 20 20  Rev             
3340: 20 2f 2a 20 53 65 74 20 74 6f 20 31 20 69 66 20   /* Set to 1 if 
3350: 4f 52 44 45 52 20 42 59 20 69 73 20 44 45 53 43  ORDER BY is DESC
3360: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
3370: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
3380: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
3390: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
33a0: 73 6f 72 74 4f 72 64 65 72 3b 20 20 20 20 20 20  sortOrder;      
33b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63           /* Whic
33c0: 68 20 64 69 72 65 63 74 69 6f 6e 20 77 65 20 61  h direction we a
33d0: 72 65 20 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20  re sorting */.  
33e0: 69 6e 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20  int nTerm;      
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3400: 4e 75 6d 62 65 72 20 6f 66 20 4f 52 44 45 52 20  Number of ORDER 
3410: 42 59 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74  BY terms */.  st
3420: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
3430: 65 6d 20 2a 70 54 65 72 6d 3b 20 2f 2a 20 41 20  em *pTerm; /* A 
3440: 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45  term of the ORDE
3450: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
3460: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
3470: 50 61 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73  Parse->db;..  as
3480: 73 65 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d  sert( pOrderBy!=
3490: 30 20 29 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70  0 );.  nTerm = p
34a0: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a  OrderBy->nExpr;.
34b0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 72 6d 3e    assert( nTerm>
34c0: 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68  0 );..  /* Match
34d0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
34e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 61 67  DER BY clause ag
34f0: 61 69 6e 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  ainst columns of
3500: 0a 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e  .  ** the index.
3510: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d  .  */.  for(i=j=
3520: 30 2c 20 70 54 65 72 6d 3d 70 4f 72 64 65 72 42  0, pTerm=pOrderB
3530: 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26  y->a; j<nTerm &&
3540: 20 69 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   i<pIdx->nColumn
3550: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  ; i++){.    Expr
3560: 20 2a 70 45 78 70 72 3b 20 20 20 20 20 20 20 2f   *pExpr;       /
3570: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
3580: 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   of the ORDER BY
3590: 20 70 54 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f   pTerm */.    Co
35a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20  llSeq *pColl;   
35b0: 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e   /* The collatin
35c0: 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 70 45  g sequence of pE
35d0: 78 70 72 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70  xpr */..    pExp
35e0: 72 20 3d 20 70 54 65 72 6d 2d 3e 70 45 78 70 72  r = pTerm->pExpr
35f0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
3600: 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c  >op!=TK_COLUMN |
3610: 7c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 21  | pExpr->iTable!
3620: 3d 62 61 73 65 20 29 7b 0a 20 20 20 20 20 20 2f  =base ){.      /
3630: 2a 20 43 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e  * Can not use an
3640: 20 69 6e 64 65 78 20 73 6f 72 74 20 6f 6e 20 61   index sort on a
3650: 6e 79 74 68 69 6e 67 20 74 68 61 74 20 69 73 20  nything that is 
3660: 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20  not a column in 
3670: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66  the.      ** lef
3680: 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 6f 66 20  t-most table of 
3690: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20  the FROM clause 
36a0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
36b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 6f  0;.    }.    pCo
36c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
36d0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
36e0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
36f0: 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d  !pColl ) pColl =
3700: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a   db->pDfltColl;.
3710: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
3720: 43 6f 6c 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69  Column!=pIdx->ai
3730: 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f  Column[i] || pCo
3740: 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66  ll!=pIdx->keyInf
3750: 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20  o.aColl[i] ){.  
3760: 20 20 20 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66      /* Term j of
3770: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
3780: 61 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ause does not ma
3790: 74 63 68 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20  tch column i of 
37a0: 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20  the index */.   
37b0: 20 20 20 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20     if( i<nEqCol 
37c0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
37d0: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
37e0: 20 74 68 61 74 20 69 73 20 63 6f 6e 73 74 72 61   that is constra
37f0: 69 6e 65 64 20 62 79 20 3d 3d 20 66 61 69 6c 73  ined by == fails
3800: 20 74 6f 20 6d 61 74 63 68 20 61 6e 0a 20 20 20   to match an.   
3810: 20 20 20 20 20 2a 2a 20 4f 52 44 45 52 20 42 59       ** ORDER BY
3820: 20 74 65 72 6d 2c 20 74 68 61 74 20 69 73 20 4f   term, that is O
3830: 4b 2e 20 20 4a 75 73 74 20 69 67 6e 6f 72 65 20  K.  Just ignore 
3840: 74 68 61 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  that column of t
3850: 68 65 20 69 6e 64 65 78 0a 20 20 20 20 20 20 20  he index.       
3860: 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   */.        cont
3870: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
3880: 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  e{.        /* If
3890: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e   an index column
38a0: 20 66 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20   fails to match 
38b0: 61 6e 64 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74  and is not const
38c0: 72 61 69 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20  rained by ==.   
38d0: 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
38e0: 20 69 6e 64 65 78 20 63 61 6e 6e 6f 74 20 73 61   index cannot sa
38f0: 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52 20  tisfy the ORDER 
3900: 42 59 20 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20  BY constraint.. 
3910: 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
3920: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
3940: 28 20 69 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20  ( i>nEqCol ){.  
3950: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 73      if( pTerm->s
3960: 6f 72 74 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72  ortOrder!=sortOr
3970: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  der ){.        /
3980: 2a 20 49 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e  * Indices can on
3990: 6c 79 20 62 65 20 75 73 65 64 20 69 66 20 61 6c  ly be used if al
39a0: 6c 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73  l ORDER BY terms
39b0: 20 70 61 73 74 20 74 68 65 0a 20 20 20 20 20 20   past the.      
39c0: 20 20 2a 2a 20 65 71 75 61 6c 69 74 79 20 63 6f    ** equality co
39d0: 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 61 6c  nstraints are al
39e0: 6c 20 65 69 74 68 65 72 20 44 45 53 43 20 6f 72  l either DESC or
39f0: 20 41 53 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20   ASC. */.       
3a00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3a10: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
3a20: 20 20 20 20 73 6f 72 74 4f 72 64 65 72 20 3d 20      sortOrder = 
3a30: 70 54 65 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pTerm->sortOrder
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b  ;.    }.    j++;
3a50: 0a 20 20 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20  .    pTerm++;.  
3a60: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65  }..  /* The inde
3a70: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
3a80: 72 20 73 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c  r sorting if all
3a90: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52   terms of the OR
3aa0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
3ab0: 2a 2a 20 6f 72 20 63 6f 76 65 72 65 64 20 6f 72  ** or covered or
3ac0: 20 69 66 20 77 65 20 72 61 6e 20 6f 75 74 20 6f   if we ran out o
3ad0: 66 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  f index columns 
3ae0: 61 6e 64 20 74 68 65 20 69 74 20 69 73 20 61 20  and the it is a 
3af0: 55 4e 49 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65  UNIQUE.  ** inde
3b00: 78 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e  x..  */.  if( j>
3b10: 3d 6e 54 65 72 6d 20 7c 7c 20 28 69 3e 3d 70 49  =nTerm || (i>=pI
3b20: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70  dx->nColumn && p
3b30: 49 64 78 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45  Idx->onError!=OE
3b40: 5f 4e 6f 6e 65 29 20 29 7b 0a 20 20 20 20 2a 70  _None) ){.    *p
3b50: 62 52 65 76 20 3d 20 73 6f 72 74 4f 72 64 65 72  bRev = sortOrder
3b60: 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43  ==SQLITE_SO_DESC
3b70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
3b80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
3ba0: 61 62 6c 65 20 74 6f 20 73 65 65 20 69 66 20 74  able to see if t
3bb0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3bc0: 73 65 20 69 6e 20 70 4f 72 64 65 72 42 79 20 63  se in pOrderBy c
3bd0: 61 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 0a  an be satisfied.
3be0: 2a 2a 20 62 79 20 73 6f 72 74 69 6e 67 20 69 6e  ** by sorting in
3bf0: 20 6f 72 64 65 72 20 6f 66 20 52 4f 57 49 44 2e   order of ROWID.
3c00: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
3c10: 20 73 6f 20 61 6e 64 20 73 65 74 20 2a 70 62 52   so and set *pbR
3c20: 65 76 20 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65  ev to be.** true
3c30: 20 66 6f 72 20 72 65 76 65 72 73 65 20 52 4f 57   for reverse ROW
3c40: 49 44 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  ID and false for
3c50: 20 66 6f 72 77 61 72 64 20 52 4f 57 49 44 20 6f   forward ROWID o
3c60: 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rder..*/.static 
3c70: 69 6e 74 20 73 6f 72 74 61 62 6c 65 42 79 52 6f  int sortableByRo
3c80: 77 69 64 28 0a 20 20 69 6e 74 20 62 61 73 65 2c  wid(.  int base,
3c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3ca0: 2a 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  * Cursor number 
3cb0: 66 6f 72 20 74 61 62 6c 65 20 74 6f 20 62 65 20  for table to be 
3cc0: 73 6f 72 74 65 64 20 2a 2f 0a 20 20 45 78 70 72  sorted */.  Expr
3cd0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
3ce0: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
3cf0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
3d00: 69 6e 74 20 2a 70 62 52 65 76 20 20 20 20 20 20  int *pbRev      
3d10: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
3d20: 6f 20 31 20 69 66 20 4f 52 44 45 52 20 42 59 20  o 1 if ORDER BY 
3d30: 69 73 20 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20  is DESC */.){.  
3d40: 45 78 70 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65  Expr *p;..  asse
3d50: 72 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20  rt( pOrderBy!=0 
3d60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 72  );.  assert( pOr
3d70: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29  derBy->nExpr>0 )
3d80: 3b 0a 20 20 70 20 3d 20 70 4f 72 64 65 72 42 79  ;.  p = pOrderBy
3d90: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[0].pExpr;.  
3da0: 69 66 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  if( p->op==TK_CO
3db0: 4c 55 4d 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c  LUMN && p->iTabl
3dc0: 65 3d 3d 62 61 73 65 20 26 26 20 70 2d 3e 69 43  e==base && p->iC
3dd0: 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20  olumn==-1 ){.   
3de0: 20 2a 70 62 52 65 76 20 3d 20 70 4f 72 64 65 72   *pbRev = pOrder
3df0: 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64  By->a[0].sortOrd
3e00: 65 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  er;.    return 1
3e10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3e20: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61  ;.}.../*.** Disa
3e30: 62 6c 65 20 61 20 74 65 72 6d 20 69 6e 20 74 68  ble a term in th
3e40: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
3e50: 20 45 78 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20   Except, do not 
3e60: 64 69 73 61 62 6c 65 20 74 68 65 20 74 65 72 6d  disable the term
3e70: 0a 2a 2a 20 69 66 20 69 74 20 63 6f 6e 74 72 6f  .** if it contro
3e80: 6c 73 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  ls a LEFT OUTER 
3e90: 4a 4f 49 4e 20 61 6e 64 20 69 74 20 64 69 64 20  JOIN and it did 
3ea0: 6e 6f 74 20 6f 72 69 67 69 6e 61 74 65 20 69 6e  not originate in
3eb0: 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53   the ON.** or US
3ec0: 49 4e 47 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ING clause of th
3ed0: 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43  at join..**.** C
3ee0: 6f 6e 73 69 64 65 72 20 74 68 65 20 74 65 72 6d  onsider the term
3ef0: 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68   t2.z='ok' in th
3f00: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72  e following quer
3f10: 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29  ies:.**.**   (1)
3f20: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
3f30: 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20  t1 LEFT JOIN t2 
3f40: 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 57 48 45  ON t1.a=t2.x WHE
3f50: 52 45 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  RE t2.z='ok'.** 
3f60: 20 20 28 32 29 20 20 53 45 4c 45 43 54 20 2a 20    (2)  SELECT * 
3f70: 46 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49  FROM t1 LEFT JOI
3f80: 4e 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e  N t2 ON t1.a=t2.
3f90: 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a  x AND t2.z='ok'.
3fa0: 2a 2a 20 20 20 28 33 29 20 20 53 45 4c 45 43 54  **   (3)  SELECT
3fb0: 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32 20 57   * FROM t1, t2 W
3fc0: 48 45 52 45 20 74 31 2e 61 3d 74 32 2e 78 20 41  HERE t1.a=t2.x A
3fd0: 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a  ND t2.z='ok'.**.
3fe0: 2a 2a 20 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27  ** The t2.z='ok'
3ff0: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20   is disabled in 
4000: 74 68 65 20 69 6e 20 28 32 29 20 62 65 63 61 75  the in (2) becau
4010: 73 65 20 69 74 20 6f 72 69 67 69 6e 61 74 65 73  se it originates
4020: 0a 2a 2a 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c  .** in the ON cl
4030: 61 75 73 65 2e 20 20 54 68 65 20 74 65 72 6d 20  ause.  The term 
4040: 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28  is disabled in (
4050: 33 29 20 62 65 63 61 75 73 65 20 69 74 20 69 73  3) because it is
4060: 20 6e 6f 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20   not part.** of 
4070: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
4080: 4e 2e 20 20 49 6e 20 28 31 29 2c 20 74 68 65 20  N.  In (1), the 
4090: 74 65 72 6d 20 69 73 20 6e 6f 74 20 64 69 73 61  term is not disa
40a0: 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61  bled..**.** Disa
40b0: 62 6c 69 6e 67 20 61 20 74 65 72 6d 20 63 61 75  bling a term cau
40c0: 73 65 73 20 74 68 61 74 20 74 65 72 6d 20 74 6f  ses that term to
40d0: 20 6e 6f 74 20 62 65 20 74 65 73 74 65 64 20 69   not be tested i
40e0: 6e 20 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70  n the inner loop
40f0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  .** of the join.
4100: 20 20 44 69 73 61 62 6c 69 6e 67 20 69 73 20 61    Disabling is a
4110: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4120: 20 57 65 20 77 6f 75 6c 64 20 67 65 74 20 74 68   We would get th
4130: 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 72 65 73  e correct.** res
4140: 75 6c 74 73 20 69 66 20 6e 6f 74 68 69 6e 67 20  ults if nothing 
4150: 77 65 72 65 20 65 76 65 72 20 64 69 73 61 62 6c  were ever disabl
4160: 65 64 2c 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69  ed, but joins mi
4170: 67 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65  ght run a little
4180: 0a 2a 2a 20 73 6c 6f 77 65 72 2e 20 20 54 68 65  .** slower.  The
4190: 20 74 72 69 63 6b 20 69 73 20 74 6f 20 64 69 73   trick is to dis
41a0: 61 62 6c 65 20 61 73 20 6d 75 63 68 20 61 73 20  able as much as 
41b0: 77 65 20 63 61 6e 20 77 69 74 68 6f 75 74 20 64  we can without d
41c0: 69 73 61 62 6c 69 6e 67 0a 2a 2a 20 74 6f 6f 20  isabling.** too 
41d0: 6d 75 63 68 2e 20 20 49 66 20 77 65 20 64 69 73  much.  If we dis
41e0: 61 62 6c 65 64 20 69 6e 20 28 31 29 2c 20 77 65  abled in (1), we
41f0: 27 64 20 67 65 74 20 74 68 65 20 77 72 6f 6e 67  'd get the wrong
4200: 20 61 6e 73 77 65 72 2e 0a 2a 2a 20 53 65 65 20   answer..** See 
4210: 74 69 63 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a  ticket #813..*/.
4220: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 61  static void disa
4230: 62 6c 65 54 65 72 6d 28 57 68 65 72 65 4c 65 76  bleTerm(WhereLev
4240: 65 6c 20 2a 70 4c 65 76 65 6c 2c 20 45 78 70 72  el *pLevel, Expr
4250: 20 2a 2a 70 70 45 78 70 72 29 7b 0a 20 20 45 78   **ppExpr){.  Ex
4260: 70 72 20 2a 70 45 78 70 72 20 3d 20 2a 70 70 45  pr *pExpr = *ppE
4270: 78 70 72 3b 0a 20 20 69 66 28 20 70 4c 65 76 65  xpr;.  if( pLeve
4280: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20  l->iLeftJoin==0 
4290: 7c 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  || ExprHasProper
42a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 46 72 6f  ty(pExpr, EP_Fro
42b0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70  mJoin) ){.    *p
42c0: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d  pExpr = 0;.  }.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
42e0: 20 63 6f 64 65 20 74 68 61 74 20 62 75 69 6c 64   code that build
42f0: 73 20 61 20 70 72 6f 62 65 20 66 6f 72 20 61 6e  s a probe for an
4300: 20 69 6e 64 65 78 2e 20 20 44 65 74 61 69 6c 73   index.  Details
4310: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68  :.**.**    *  Ch
4320: 65 63 6b 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c  eck the top nCol
4330: 75 6d 6e 20 65 6e 74 72 69 65 73 20 6f 6e 20 74  umn entries on t
4340: 68 65 20 73 74 61 63 6b 2e 20 20 49 66 20 61 6e  he stack.  If an
4350: 79 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68  y.**       of th
4360: 6f 73 65 20 65 6e 74 72 69 65 73 20 61 72 65 20  ose entries are 
4370: 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64  NULL, jump immed
4380: 69 61 74 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a  iately to brk,.*
4390: 2a 20 20 20 20 20 20 20 77 68 69 63 68 20 69 73  *       which is
43a0: 20 74 68 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20   the loop exit, 
43b0: 73 69 6e 63 65 20 6e 6f 20 69 6e 64 65 78 20 65  since no index e
43c0: 6e 74 72 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a  ntry will match.
43d0: 2a 2a 20 20 20 20 20 20 20 69 66 20 61 6e 79 20  **       if any 
43e0: 70 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20  part of the key 
43f0: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20  is NULL..**.**  
4400: 20 20 2a 20 20 43 6f 6e 73 74 72 75 63 74 20 61    *  Construct a
4410: 20 70 72 6f 62 65 20 65 6e 74 72 79 20 66 72 6f   probe entry fro
4420: 6d 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d  m the top nColum
4430: 6e 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20  n entries in.** 
4440: 20 20 20 20 20 20 74 68 65 20 73 74 61 63 6b 20        the stack 
4450: 77 69 74 68 20 61 66 66 69 6e 69 74 69 65 73 20  with affinities 
4460: 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
4470: 69 6e 64 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73  index pIdx..*/.s
4480: 74 61 74 69 63 20 76 6f 69 64 20 62 75 69 6c 64  tatic void build
4490: 49 6e 64 65 78 50 72 6f 62 65 28 56 64 62 65 20  IndexProbe(Vdbe 
44a0: 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c  *v, int nColumn,
44b0: 20 69 6e 74 20 62 72 6b 2c 20 49 6e 64 65 78 20   int brk, Index 
44c0: 2a 70 49 64 78 29 7b 0a 20 20 73 71 6c 69 74 65  *pIdx){.  sqlite
44d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
44e0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75  _NotNull, -nColu
44f0: 6d 6e 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  mn, sqlite3VdbeC
4500: 75 72 72 65 6e 74 41 64 64 72 28 76 29 2b 33 29  urrentAddr(v)+3)
4510: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4520: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
4530: 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73  nColumn, 0);.  s
4540: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
4550: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62  v, OP_Goto, 0, b
4560: 72 6b 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  rk);.  sqlite3Vd
4570: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61  beAddOp(v, OP_Ma
4580: 6b 65 52 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d  keRecord, nColum
4590: 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
45a0: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 53 74 72  IndexAffinityStr
45b0: 28 76 2c 20 70 49 64 78 29 3b 0a 7d 0a 0a 2f 2a  (v, pIdx);.}../*
45c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
45d0: 65 20 66 6f 72 20 61 6e 20 65 71 75 61 6c 69 74  e for an equalit
45e0: 79 20 74 65 72 6d 20 6f 66 20 74 68 65 20 57 48  y term of the WH
45f0: 45 52 45 20 63 6c 61 75 73 65 2e 20 20 41 6e 20  ERE clause.  An 
4600: 65 71 75 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d  equality.** term
4610: 20 63 61 6e 20 62 65 20 65 69 74 68 65 72 20 58   can be either X
4620: 3d 65 78 70 72 20 20 6f 72 20 58 20 49 4e 20 28  =expr  or X IN (
4630: 2e 2e 2e 29 2e 20 20 20 70 54 65 72 6d 20 69 73  ...).   pTerm is
4640: 20 74 68 65 20 58 2e 20 20 0a 2a 2f 0a 73 74 61   the X.  .*/.sta
4650: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 45 71 75  tic void codeEqu
4660: 61 6c 69 74 79 54 65 72 6d 28 0a 20 20 50 61 72  alityTerm(.  Par
4670: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
4680: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
4690: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
46a0: 72 49 6e 66 6f 20 2a 70 54 65 72 6d 2c 20 20 20  rInfo *pTerm,   
46b0: 20 2f 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20   /* The term of 
46c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
46d0: 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a   to be coded */.
46e0: 20 20 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20    int brk,      
46f0: 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65        /* Jump he
4700: 72 65 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68  re to abandon th
4710: 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72  e loop */.  Wher
4720: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20  eLevel *pLevel  
4730: 2f 2a 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66  /* When level of
4740: 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65   the FROM clause
4750: 20 77 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20   we are working 
4760: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20  on */.){.  Expr 
4770: 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a  *pX = pTerm->p;.
4780: 20 20 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b    if( pX->op!=TK
4790: 5f 49 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _IN ){.    asser
47a0: 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  t( pX->op==TK_EQ
47b0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
47c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
47d0: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66  pX->pRight);.#if
47e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
47f0: 5f 53 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73  _SUBQUERY.  }els
4800: 65 7b 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b  e{.    int iTab;
4810: 0a 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70  .    Vdbe *v = p
4820: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20  Parse->pVdbe;.. 
4830: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75     sqlite3CodeSu
4840: 62 73 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  bselect(pParse, 
4850: 70 58 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20  pX);.    iTab = 
4860: 70 58 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20  pX->iTable;.    
4870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4880: 28 76 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69  (v, OP_Rewind, i
4890: 54 61 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56  Tab, brk);.    V
48a0: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
48b0: 23 20 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61  # %.*s", pX->spa
48c0: 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29  n.n, pX->span.z)
48d0: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  );.    pLevel->i
48e0: 6e 50 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nP2 = sqlite3Vdb
48f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
4900: 75 6d 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20  umn, iTab, 0);. 
4910: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 6e 4f 70 20     pLevel->inOp 
4920: 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70  = OP_Next;.    p
4930: 4c 65 76 65 6c 2d 3e 69 6e 50 31 20 3d 20 69 54  Level->inP1 = iT
4940: 61 62 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  ab;.#endif.  }. 
4950: 20 64 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65   disableTerm(pLe
4960: 76 65 6c 2c 20 26 70 54 65 72 6d 2d 3e 70 29 3b  vel, &pTerm->p);
4970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6e 75  .}../*.** The nu
4980: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
4990: 61 20 42 69 74 6d 61 73 6b 0a 2a 2f 0a 23 64 65  a Bitmask.*/.#de
49a0: 66 69 6e 65 20 42 4d 53 20 20 28 73 69 7a 65 6f  fine BMS  (sizeo
49b0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 29 0a  f(Bitmask)*8-1).
49c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
49d0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
49e0: 66 20 74 68 65 20 6c 6f 6f 70 20 75 73 65 64 20  f the loop used 
49f0: 66 6f 72 20 57 48 45 52 45 20 63 6c 61 75 73 65  for WHERE clause
4a00: 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 20   processing..** 
4a10: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
4a20: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4a30: 20 61 6e 20 6f 70 61 71 75 65 20 73 74 72 75 63   an opaque struc
4a40: 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61 69  ture that contai
4a50: 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f  ns.** informatio
4a60: 6e 20 6e 65 65 64 65 64 20 74 6f 20 74 65 72 6d  n needed to term
4a70: 69 6e 61 74 65 20 74 68 65 20 6c 6f 6f 70 2e 20  inate the loop. 
4a80: 20 4c 61 74 65 72 2c 20 74 68 65 20 63 61 6c 6c   Later, the call
4a90: 69 6e 67 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73  ing routine.** s
4aa0: 68 6f 75 6c 64 20 69 6e 76 6f 6b 65 20 73 71 6c  hould invoke sql
4ab0: 69 74 65 33 57 68 65 72 65 45 6e 64 28 29 20 77  ite3WhereEnd() w
4ac0: 69 74 68 20 74 68 65 20 72 65 74 75 72 6e 20 76  ith the return v
4ad0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e  alue of this fun
4ae0: 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20 6f 72 64 65  ction.** in orde
4af0: 72 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 74 68  r to complete th
4b00: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 70  e WHERE clause p
4b10: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a  rocessing..**.**
4b20: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
4b30: 75 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  urs, this routin
4b40: 65 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 0a  e returns NULL..
4b50: 2a 2a 0a 2a 2a 20 54 68 65 20 62 61 73 69 63 20  **.** The basic 
4b60: 69 64 65 61 20 69 73 20 74 6f 20 64 6f 20 61 20  idea is to do a 
4b70: 6e 65 73 74 65 64 20 6c 6f 6f 70 2c 20 6f 6e 65  nested loop, one
4b80: 20 6c 6f 6f 70 20 66 6f 72 20 65 61 63 68 20 74   loop for each t
4b90: 61 62 6c 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  able in.** the F
4ba0: 52 4f 4d 20 63 6c 61 75 73 65 20 6f 66 20 61 20  ROM clause of a 
4bb0: 73 65 6c 65 63 74 2e 20 20 28 49 4e 53 45 52 54  select.  (INSERT
4bc0: 20 61 6e 64 20 55 50 44 41 54 45 20 73 74 61 74   and UPDATE stat
4bd0: 65 6d 65 6e 74 73 20 61 72 65 20 74 68 65 0a 2a  ements are the.*
4be0: 2a 20 73 61 6d 65 20 61 73 20 61 20 53 45 4c 45  * same as a SELE
4bf0: 43 54 20 77 69 74 68 20 6f 6e 6c 79 20 61 20 73  CT with only a s
4c00: 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74  ingle table in t
4c10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 29  he FROM clause.)
4c20: 20 20 46 6f 72 0a 2a 2a 20 65 78 61 6d 70 6c 65    For.** example
4c30: 2c 20 69 66 20 74 68 65 20 53 51 4c 20 69 73 20  , if the SQL is 
4c40: 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
4c50: 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20    SELECT * FROM 
4c60: 74 31 2c 20 74 32 2c 20 74 33 20 57 48 45 52 45  t1, t2, t3 WHERE
4c70: 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 6e   ...;.**.** Then
4c80: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
4c90: 74 65 64 20 69 73 20 63 6f 6e 63 65 70 74 75 61  ted is conceptua
4ca0: 6c 6c 79 20 6c 69 6b 65 20 74 68 65 20 66 6f 6c  lly like the fol
4cb0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
4cc0: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20     foreach row1 
4cd0: 69 6e 20 74 31 20 64 6f 20 20 20 20 20 20 20 5c  in t1 do       \
4ce0: 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
4cf0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 66 6f 72  ed.**        for
4d00: 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
4d10: 64 6f 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73  do      |-- by s
4d20: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
4d30: 28 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 66  ().**          f
4d40: 6f 72 65 61 63 68 20 72 6f 77 33 20 69 6e 20 74  oreach row3 in t
4d50: 33 20 64 6f 20 20 20 2f 0a 2a 2a 20 20 20 20 20  3 do   /.**     
4d60: 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20         ....**   
4d70: 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
4d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
4d90: 20 20 20 20 43 6f 64 65 20 67 65 6e 65 72 61 74      Code generat
4da0: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 65 6e 64  ed.**        end
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 20 20 20 20 20 7c 2d 2d 20 62 79 20 73          |-- by s
4dd0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
4de0: 0a 2a 2a 20 20 20 20 20 20 65 6e 64 20 20 20 20  .**      end    
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e00: 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a 20 54 68 65       /.**.** The
4e10: 72 65 20 61 72 65 20 42 74 72 65 65 20 63 75 72  re are Btree cur
4e20: 73 6f 72 73 20 61 73 73 6f 63 69 61 74 65 64 20  sors associated 
4e30: 77 69 74 68 20 65 61 63 68 20 74 61 62 6c 65 2e  with each table.
4e40: 20 20 74 31 20 75 73 65 73 20 63 75 72 73 6f 72    t1 uses cursor
4e50: 0a 2a 2a 20 6e 75 6d 62 65 72 20 70 54 61 62 4c  .** number pTabL
4e60: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
4e70: 72 2e 20 20 74 32 20 75 73 65 73 20 74 68 65 20  r.  t2 uses the 
4e80: 63 75 72 73 6f 72 20 70 54 61 62 4c 69 73 74 2d  cursor pTabList-
4e90: 3e 61 5b 31 5d 2e 69 43 75 72 73 6f 72 2e 0a 2a  >a[1].iCursor..*
4ea0: 2a 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20  * And so forth. 
4eb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
4ec0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
4ed0: 6f 70 65 6e 20 74 68 6f 73 65 20 56 44 42 45 20  open those VDBE 
4ee0: 63 75 72 73 6f 72 73 0a 2a 2a 20 61 6e 64 20 73  cursors.** and s
4ef0: 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64 28 29  qlite3WhereEnd()
4f00: 20 67 65 6e 65 72 61 74 65 73 20 74 68 65 20 63   generates the c
4f10: 6f 64 65 20 74 6f 20 63 6c 6f 73 65 20 74 68 65  ode to close the
4f20: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  m..**.** The cod
4f30: 65 20 74 68 61 74 20 73 71 6c 69 74 65 33 57 68  e that sqlite3Wh
4f40: 65 72 65 42 65 67 69 6e 28 29 20 67 65 6e 65 72  ereBegin() gener
4f50: 61 74 65 73 20 6c 65 61 76 65 73 20 74 68 65 20  ates leaves the 
4f60: 63 75 72 73 6f 72 73 20 6e 61 6d 65 64 0a 2a 2a  cursors named.**
4f70: 20 69 6e 20 70 54 61 62 4c 69 73 74 20 70 6f 69   in pTabList poi
4f80: 6e 74 69 6e 67 20 61 74 20 74 68 65 69 72 20 61  nting at their a
4f90: 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72 69  ppropriate entri
4fa0: 65 73 2e 20 20 54 68 65 20 5b 2e 2e 2e 5d 20 63  es.  The [...] c
4fb0: 6f 64 65 0a 2a 2a 20 63 61 6e 20 75 73 65 20 4f  ode.** can use O
4fc0: 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64 20 4f 50 5f  P_Column and OP_
4fd0: 52 6f 77 69 64 20 6f 70 63 6f 64 65 73 20 6f 6e  Rowid opcodes on
4fe0: 20 74 68 65 73 65 20 63 75 72 73 6f 72 73 20 74   these cursors t
4ff0: 6f 20 65 78 74 72 61 63 74 0a 2a 2a 20 64 61 74  o extract.** dat
5000: 61 20 66 72 6f 6d 20 74 68 65 20 76 61 72 69 6f  a from the vario
5010: 75 73 20 74 61 62 6c 65 73 20 6f 66 20 74 68 65  us tables of the
5020: 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   loop..**.** If 
5030: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5040: 20 69 73 20 65 6d 70 74 79 2c 20 74 68 65 20 66   is empty, the f
5050: 6f 72 65 61 63 68 20 6c 6f 6f 70 73 20 6d 75 73  oreach loops mus
5060: 74 20 65 61 63 68 20 73 63 61 6e 20 74 68 65 69  t each scan thei
5070: 72 0a 2a 2a 20 65 6e 74 69 72 65 20 74 61 62 6c  r.** entire tabl
5080: 65 73 2e 20 20 54 68 75 73 20 61 20 74 68 72 65  es.  Thus a thre
5090: 65 2d 77 61 79 20 6a 6f 69 6e 20 69 73 20 61 6e  e-way join is an
50a0: 20 4f 28 4e 5e 33 29 20 6f 70 65 72 61 74 69 6f   O(N^3) operatio
50b0: 6e 2e 20 20 42 75 74 20 69 66 0a 2a 2a 20 74 68  n.  But if.** th
50c0: 65 20 74 61 62 6c 65 73 20 68 61 76 65 20 69 6e  e tables have in
50d0: 64 69 63 65 73 20 61 6e 64 20 74 68 65 72 65 20  dices and there 
50e0: 61 72 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65  are terms in the
50f0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
5100: 61 74 0a 2a 2a 20 72 65 66 65 72 20 74 6f 20 74  at.** refer to t
5110: 68 6f 73 65 20 69 6e 64 69 63 65 73 2c 20 61 20  hose indices, a 
5120: 63 6f 6d 70 6c 65 74 65 20 74 61 62 6c 65 20 73  complete table s
5130: 63 61 6e 20 63 61 6e 20 62 65 20 61 76 6f 69 64  can can be avoid
5140: 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f  ed and the.** co
5150: 64 65 20 77 69 6c 6c 20 72 75 6e 20 6d 75 63 68  de will run much
5160: 20 66 61 73 74 65 72 2e 20 20 4d 6f 73 74 20 6f   faster.  Most o
5170: 66 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 74 68  f the work of th
5180: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 68  is routine is ch
5190: 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f 20 73 65 65  ecking.** to see
51a0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 69 6e   if there are in
51b0: 64 69 63 65 73 20 74 68 61 74 20 63 61 6e 20 62  dices that can b
51c0: 65 20 75 73 65 64 20 74 6f 20 73 70 65 65 64 20  e used to speed 
51d0: 75 70 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a  up the loop..**.
51e0: 2a 2a 20 54 65 72 6d 73 20 6f 66 20 74 68 65 20  ** Terms of the 
51f0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 61 72 65  WHERE clause are
5200: 20 61 6c 73 6f 20 75 73 65 64 20 74 6f 20 6c 69   also used to li
5210: 6d 69 74 20 77 68 69 63 68 20 72 6f 77 73 20 61  mit which rows a
5220: 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 20  ctually.** make 
5230: 69 74 20 74 6f 20 74 68 65 20 22 2e 2e 2e 22 20  it to the "..." 
5240: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f 66  in the middle of
5250: 20 74 68 65 20 6c 6f 6f 70 2e 20 20 41 66 74 65   the loop.  Afte
5260: 72 20 65 61 63 68 20 22 66 6f 72 65 61 63 68 22  r each "foreach"
5270: 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f 66 20 74 68  ,.** terms of th
5280: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
5290: 68 61 74 20 75 73 65 20 6f 6e 6c 79 20 74 65 72  hat use only ter
52a0: 6d 73 20 69 6e 20 74 68 61 74 20 6c 6f 6f 70 20  ms in that loop 
52b0: 61 6e 64 20 6f 75 74 65 72 0a 2a 2a 20 6c 6f 6f  and outer.** loo
52c0: 70 73 20 61 72 65 20 65 76 61 6c 75 61 74 65 64  ps are evaluated
52d0: 20 61 6e 64 20 69 66 20 66 61 6c 73 65 20 61 20   and if false a 
52e0: 6a 75 6d 70 20 69 73 20 6d 61 64 65 20 61 72 6f  jump is made aro
52f0: 75 6e 64 20 61 6c 6c 20 73 75 62 73 65 71 75 65  und all subseque
5300: 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20 6c 6f 6f 70  nt.** inner loop
5310: 73 20 28 6f 72 20 61 72 6f 75 6e 64 20 74 68 65  s (or around the
5320: 20 22 2e 2e 2e 22 20 69 66 20 74 68 65 20 74 65   "..." if the te
5330: 73 74 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  st occurs within
5340: 20 74 68 65 20 69 6e 6e 65 72 2d 0a 2a 2a 20 6d   the inner-.** m
5350: 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a 0a 2a 2a 20  ost loop).**.** 
5360: 4f 55 54 45 52 20 4a 4f 49 4e 53 0a 2a 2a 0a 2a  OUTER JOINS.**.*
5370: 2a 20 41 6e 20 6f 75 74 65 72 20 6a 6f 69 6e 20  * An outer join 
5380: 6f 66 20 74 61 62 6c 65 73 20 74 31 20 61 6e 64  of tables t1 and
5390: 20 74 32 20 69 73 20 63 6f 6e 63 65 70 74 61 6c   t2 is conceptal
53a0: 6c 79 20 63 6f 64 65 64 20 61 73 20 66 6f 6c 6c  ly coded as foll
53b0: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 66 6f  ows:.**.**    fo
53c0: 72 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31  reach row1 in t1
53d0: 20 64 6f 0a 2a 2a 20 20 20 20 20 20 66 6c 61 67   do.**      flag
53e0: 20 3d 20 30 0a 2a 2a 20 20 20 20 20 20 66 6f 72   = 0.**      for
53f0: 65 61 63 68 20 72 6f 77 32 20 69 6e 20 74 32 20  each row2 in t2 
5400: 64 6f 0a 2a 2a 20 20 20 20 20 20 20 20 73 74 61  do.**        sta
5410: 72 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  rt:.**          
5420: 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ....**          
5430: 66 6c 61 67 20 3d 20 31 0a 2a 2a 20 20 20 20 20  flag = 1.**     
5440: 20 65 6e 64 0a 2a 2a 20 20 20 20 20 20 69 66 20   end.**      if 
5450: 66 6c 61 67 3d 3d 30 20 74 68 65 6e 0a 2a 2a 20  flag==0 then.** 
5460: 20 20 20 20 20 20 20 6d 6f 76 65 20 74 68 65 20         move the 
5470: 72 6f 77 32 20 63 75 72 73 6f 72 20 74 6f 20 61  row2 cursor to a
5480: 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a 20 20 20 20   null row.**    
5490: 20 20 20 20 67 6f 74 6f 20 73 74 61 72 74 0a 2a      goto start.*
54a0: 2a 20 20 20 20 20 20 66 69 0a 2a 2a 20 20 20 20  *      fi.**    
54b0: 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52 20  end.**.** ORDER 
54c0: 42 59 20 43 4c 41 55 53 45 20 50 52 4f 43 45 53  BY CLAUSE PROCES
54d0: 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a 70 70 4f 72  SING.**.** *ppOr
54e0: 64 65 72 42 79 20 69 73 20 61 20 70 6f 69 6e 74  derBy is a point
54f0: 65 72 20 74 6f 20 74 68 65 20 4f 52 44 45 52 20  er to the ORDER 
5500: 42 59 20 63 6c 61 75 73 65 20 6f 66 20 61 20 53  BY clause of a S
5510: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2c  ELECT statement,
5520: 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20  .** if there is 
5530: 6f 6e 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  one.  If there i
5540: 73 20 6e 6f 20 4f 52 44 45 52 20 42 59 20 63 6c  s no ORDER BY cl
5550: 61 75 73 65 20 6f 72 20 69 66 20 74 68 69 73 20  ause or if this 
5560: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
5570: 6c 6c 65 64 20 66 72 6f 6d 20 61 6e 20 55 50 44  lled from an UPD
5580: 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 73 74  ATE or DELETE st
5590: 61 74 65 6d 65 6e 74 2c 20 74 68 65 6e 20 70 70  atement, then pp
55a0: 4f 72 64 65 72 42 79 20 69 73 20 4e 55 4c 4c 2e  OrderBy is NULL.
55b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 64  .**.** If an ind
55c0: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 73  ex can be used s
55d0: 6f 20 74 68 61 74 20 74 68 65 20 6e 61 74 75 72  o that the natur
55e0: 61 6c 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20  al output order 
55f0: 6f 66 20 74 68 65 20 74 61 62 6c 65 0a 2a 2a 20  of the table.** 
5600: 73 63 61 6e 20 69 73 20 63 6f 72 72 65 63 74 20  scan is correct 
5610: 66 6f 72 20 74 68 65 20 4f 52 44 45 52 20 42 59  for the ORDER BY
5620: 20 63 6c 61 75 73 65 2c 20 74 68 65 6e 20 74 68   clause, then th
5630: 61 74 20 69 6e 64 65 78 20 69 73 20 75 73 65 64  at index is used
5640: 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f 72 64 65 72   and.** *ppOrder
5650: 42 79 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  By is set to NUL
5660: 4c 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  L.  This is an o
5670: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
5680: 20 70 72 65 76 65 6e 74 73 20 61 6e 0a 2a 2a 20   prevents an.** 
5690: 75 6e 6e 65 63 65 73 73 61 72 79 20 73 6f 72 74  unnecessary sort
56a0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73   of the result s
56b0: 65 74 20 69 66 20 61 6e 20 69 6e 64 65 78 20 61  et if an index a
56c0: 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 74  ppropriate for t
56d0: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 63  he.** ORDER BY c
56e0: 6c 61 75 73 65 20 61 6c 72 65 61 64 79 20 65 78  lause already ex
56f0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ists..**.** If t
5700: 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 20  he where clause 
5710: 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74 20 62 65 20  loops cannot be 
5720: 61 72 72 61 6e 67 65 64 20 74 6f 20 70 72 6f 76  arranged to prov
5730: 69 64 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a  ide the correct.
5740: 2a 2a 20 6f 75 74 70 75 74 20 6f 72 64 65 72 2c  ** output order,
5750: 20 74 68 65 6e 20 74 68 65 20 2a 70 70 4f 72 64   then the *ppOrd
5760: 65 72 42 79 20 69 73 20 75 6e 63 68 61 6e 67 65  erBy is unchange
5770: 64 2e 0a 2a 2f 0a 57 68 65 72 65 49 6e 66 6f 20  d..*/.WhereInfo 
5780: 2a 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67  *sqlite3WhereBeg
5790: 69 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  in(.  Parse *pPa
57a0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  rse,        /* T
57b0: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78  he parser contex
57c0: 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a  t */.  SrcList *
57d0: 70 54 61 62 4c 69 73 74 2c 20 20 20 20 2f 2a 20  pTabList,    /* 
57e0: 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 74 61  A list of all ta
57f0: 62 6c 65 73 20 74 6f 20 62 65 20 73 63 61 6e 6e  bles to be scann
5800: 65 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 57  ed */.  Expr *pW
5810: 68 65 72 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  here,         /*
5820: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
5830: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
5840: 2a 2a 70 70 4f 72 64 65 72 42 79 20 20 2f 2a 20  **ppOrderBy  /* 
5850: 41 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  An ORDER BY clau
5860: 73 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 29  se, or NULL */.)
5870: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
5880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5890: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
58a0: 2f 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70  /.  WhereInfo *p
58b0: 57 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f  WInfo;         /
58c0: 2a 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68  * Will become th
58d0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
58e0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
58f0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  */.  Vdbe *v = p
5900: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20  Parse->pVdbe;   
5910: 2f 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64  /* The virtual d
5920: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a  atabase engine *
5930: 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e  /.  int brk, con
5940: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
5950: 2a 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64  * Addresses used
5960: 20 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e   during code gen
5970: 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  eration */.  int
5980: 20 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20   nExpr;         
5990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
59a0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  ubexpressions in
59b0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
59c0: 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6c  e */.  Bitmask l
59d0: 6f 6f 70 4d 61 73 6b 3b 20 20 20 20 2f 2a 20 4f  oopMask;    /* O
59e0: 6e 65 20 62 69 74 20 73 65 74 20 66 6f 72 20 65  ne bit set for e
59f0: 61 63 68 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a  ach outer loop *
5a00: 2f 0a 20 20 45 78 70 72 49 6e 66 6f 20 2a 70 54  /.  ExprInfo *pT
5a10: 65 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69  erm;     /* A si
5a20: 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65  ngle term in the
5a30: 20 57 48 45 52 45 20 63 6c 61 75 73 65 3b 20 70   WHERE clause; p
5a40: 74 72 20 74 6f 20 61 45 78 70 72 5b 5d 20 2a 2f  tr to aExpr[] */
5a50: 0a 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d  .  ExprMaskSet m
5a60: 61 73 6b 53 65 74 3b 20 2f 2a 20 54 68 65 20 65  askSet; /* The e
5a70: 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73  xpression mask s
5a80: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 72  et */.  int iDir
5a90: 65 63 74 45 71 5b 42 4d 53 5d 3b 20 20 2f 2a 20  ectEq[BMS];  /* 
5aa0: 54 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  Term of the form
5ab0: 20 52 4f 57 49 44 3d 3d 58 20 66 6f 72 20 74 68   ROWID==X for th
5ac0: 65 20 4e 2d 74 68 20 74 61 62 6c 65 20 2a 2f 0a  e N-th table */.
5ad0: 20 20 69 6e 74 20 69 44 69 72 65 63 74 4c 74 5b    int iDirectLt[
5ae0: 42 4d 53 5d 3b 20 20 2f 2a 20 54 65 72 6d 20 6f  BMS];  /* Term o
5af0: 66 20 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44  f the form ROWID
5b00: 3c 58 20 6f 72 20 52 4f 57 49 44 3c 3d 58 20 2a  <X or ROWID<=X *
5b10: 2f 0a 20 20 69 6e 74 20 69 44 69 72 65 63 74 47  /.  int iDirectG
5b20: 74 5b 42 4d 53 5d 3b 20 20 2f 2a 20 54 65 72 6d  t[BMS];  /* Term
5b30: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 52 4f 57   of the form ROW
5b40: 49 44 3e 58 20 6f 72 20 52 4f 57 49 44 3e 3d 58  ID>X or ROWID>=X
5b50: 20 2a 2f 0a 20 20 45 78 70 72 49 6e 66 6f 20 61   */.  ExprInfo a
5b60: 45 78 70 72 5b 31 30 31 5d 3b 20 2f 2a 20 54 68  Expr[101]; /* Th
5b70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
5b80: 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74  s divided into t
5b90: 68 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20  hese terms */.  
5ba0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
5bb0: 74 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20  tem *pTabItem;  
5bc0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72  /* A single entr
5bd0: 79 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20  y from pTabList 
5be0: 2a 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20  */.  WhereLevel 
5bf0: 2a 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20  *pLevel;        
5c00: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
5c10: 20 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57   level in the pW
5c20: 49 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 0a 20 20  Info list */..  
5c30: 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
5c40: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 46 52   terms in the FR
5c50: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d  OM clause is lim
5c60: 69 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62  ited by the numb
5c70: 65 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20  er of.  ** bits 
5c80: 69 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20  in a Bitmask .  
5c90: 2a 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73  */.  if( pTabLis
5ca0: 74 2d 3e 6e 53 72 63 3e 73 69 7a 65 6f 66 28 42  t->nSrc>sizeof(B
5cb0: 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20  itmask)*8 ){.   
5cc0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
5cd0: 28 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73  (pParse, "at mos
5ce0: 74 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61  t %d tables in a
5cf0: 20 6a 6f 69 6e 22 2c 0a 20 20 20 20 20 20 20 73   join",.       s
5d00: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
5d10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
5d20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74  .  }..  /* Split
5d30: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5d40: 65 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20  e into separate 
5d50: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77  subexpressions w
5d60: 68 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73  here each.  ** s
5d70: 75 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  ubexpression is 
5d80: 73 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20  separated by an 
5d90: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
5da0: 66 20 74 68 65 20 61 45 78 70 72 5b 5d 0a 20 20  f the aExpr[].  
5db0: 2a 2a 20 61 72 72 61 79 20 66 69 6c 6c 73 20 75  ** array fills u
5dc0: 70 2c 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  p, the last entr
5dd0: 79 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  y might point to
5de0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77   an expression w
5df0: 68 69 63 68 0a 20 20 2a 2a 20 63 6f 6e 74 61 69  hich.  ** contai
5e00: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 75 6e  ns additional un
5e10: 66 61 63 74 6f 72 65 64 20 41 4e 44 20 6f 70 65  factored AND ope
5e20: 72 61 74 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  rators..  */.  i
5e30: 6e 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b  nitMaskSet(&mask
5e40: 53 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61  Set);.  memset(a
5e50: 45 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Expr, 0, sizeof(
5e60: 61 45 78 70 72 29 29 3b 0a 20 20 6e 45 78 70 72  aExpr));.  nExpr
5e70: 20 3d 20 65 78 70 72 53 70 6c 69 74 28 41 52 52   = exprSplit(ARR
5e80: 41 59 53 49 5a 45 28 61 45 78 70 72 29 2c 20 61  AYSIZE(aExpr), a
5e90: 45 78 70 72 2c 20 70 57 68 65 72 65 29 3b 0a 20  Expr, pWhere);. 
5ea0: 20 69 66 28 20 6e 45 78 70 72 3d 3d 41 52 52 41   if( nExpr==ARRA
5eb0: 59 53 49 5a 45 28 61 45 78 70 72 29 20 29 7b 0a  YSIZE(aExpr) ){.
5ec0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5ed0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 57 48 45  Msg(pParse, "WHE
5ee0: 52 45 20 63 6c 61 75 73 65 20 74 6f 6f 20 63 6f  RE clause too co
5ef0: 6d 70 6c 65 78 20 2d 20 6e 6f 20 6d 6f 72 65 20  mplex - no more 
5f00: 22 0a 20 20 20 20 20 20 20 22 74 68 61 6e 20 25  ".       "than %
5f10: 64 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65 64 22  d terms allowed"
5f20: 2c 20 28 69 6e 74 29 41 52 52 41 59 53 49 5a 45  , (int)ARRAYSIZE
5f30: 28 61 45 78 70 72 29 2d 31 29 3b 0a 20 20 20 20  (aExpr)-1);.    
5f40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5f50: 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65    .  /* Allocate
5f60: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
5f70: 74 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74  the WhereInfo st
5f80: 72 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c  ructure that wil
5f90: 6c 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a  l become the.  *
5fa0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a  * return value..
5fb0: 20 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20    */.  pWInfo = 
5fc0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5fd0: 7a 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20  zeof(WhereInfo) 
5fe0: 2b 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63  + pTabList->nSrc
5ff0: 2a 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76  *sizeof(WhereLev
6000: 65 6c 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  el));.  if( sqli
6010: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
6020: 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  d ){.    sqliteF
6030: 72 65 65 28 70 57 49 6e 66 6f 29 3b 20 2f 2a 20  ree(pWInfo); /* 
6040: 41 76 6f 69 64 20 6c 65 61 6b 69 6e 67 20 6d 65  Avoid leaking me
6050: 6d 6f 72 79 20 77 68 65 6e 20 6d 61 6c 6c 6f 63  mory when malloc
6060: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65   fails */.    re
6070: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 57  turn 0;.  }.  pW
6080: 49 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70  Info->pParse = p
6090: 50 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d  Parse;.  pWInfo-
60a0: 3e 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62  >pTabList = pTab
60b0: 4c 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  List;.  pWInfo->
60c0: 69 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33  iBreak = sqlite3
60d0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
60e0: 3b 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20  ;..  /* Special 
60f0: 63 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c  case: a WHERE cl
6100: 61 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e  ause that is con
6110: 73 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65  stant.  Evaluate
6120: 20 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73   the.  ** expres
6130: 73 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20  sion and either 
6140: 6a 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66  jump over all of
6150: 20 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c   the code or fal
6160: 6c 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69  l thru..  */.  i
6170: 66 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54  f( pWhere && (pT
6180: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20  abList->nSrc==0 
6190: 7c 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  || sqlite3ExprIs
61a0: 43 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29  Constant(pWhere)
61b0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
61c0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
61d0: 73 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e  se, pWhere, pWIn
61e0: 66 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a  fo->iBreak, 1);.
61f0: 20 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a      pWhere = 0;.
6200: 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a    }..  /* Analyz
6210: 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62  e all of the sub
6220: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a  expressions..  *
6230: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
6240: 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  TabList->nSrc; i
6250: 2b 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d  ++){.    createM
6260: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54  ask(&maskSet, pT
6270: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
6280: 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  rsor);.  }.  for
6290: 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 69 3d  (pTerm=aExpr, i=
62a0: 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 2b 2b 2c  0; i<nExpr; i++,
62b0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 65   pTerm++){.    e
62c0: 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62 4c  xprAnalyze(pTabL
62d0: 69 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20 70  ist, &maskSet, p
62e0: 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Term);.  }..  /*
62f0: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61 74   Figure out what
6300: 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 28 69   index to use (i
6310: 66 20 61 6e 79 29 20 66 6f 72 20 65 61 63 68 20  f any) for each 
6320: 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 0a 20 20 2a  nested loop..  *
6330: 2a 20 4d 61 6b 65 20 70 57 49 6e 66 6f 2d 3e 61  * Make pWInfo->a
6340: 5b 69 5d 2e 70 49 64 78 20 70 6f 69 6e 74 20 74  [i].pIdx point t
6350: 6f 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20 75  o the index to u
6360: 73 65 20 66 6f 72 20 74 68 65 20 69 2d 74 68 20  se for the i-th 
6370: 6e 65 73 74 65 64 0a 20 20 2a 2a 20 6c 6f 6f 70  nested.  ** loop
6380: 20 77 68 65 72 65 20 69 3d 3d 30 20 69 73 20 74   where i==0 is t
6390: 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61 6e  he outer loop an
63a0: 64 20 69 3d 3d 70 54 61 62 4c 69 73 74 2d 3e 6e  d i==pTabList->n
63b0: 53 72 63 2d 31 20 69 73 20 74 68 65 20 69 6e 6e  Src-1 is the inn
63c0: 65 72 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 20 0a 20  er.  ** loop. . 
63d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 65 72 6d   **.  ** If term
63e0: 73 20 65 78 69 73 74 20 74 68 61 74 20 75 73 65  s exist that use
63f0: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 61 6e   the ROWID of an
6400: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 73 65  y table, then se
6410: 74 20 74 68 65 0a 20 20 2a 2a 20 69 44 69 72 65  t the.  ** iDire
6420: 63 74 45 71 5b 5d 2c 20 69 44 69 72 65 63 74 4c  ctEq[], iDirectL
6430: 74 5b 5d 2c 20 6f 72 20 69 44 69 72 65 63 74 47  t[], or iDirectG
6440: 74 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 66 6f 72  t[] elements for
6450: 20 74 68 61 74 20 74 61 62 6c 65 0a 20 20 2a 2a   that table.  **
6460: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
6470: 20 74 68 65 20 74 65 72 6d 20 63 6f 6e 74 61 69   the term contai
6480: 6e 69 6e 67 20 74 68 65 20 52 4f 57 49 44 2e 20  ning the ROWID. 
6490: 20 57 65 20 61 6c 77 61 79 73 20 70 72 65 66 65   We always prefe
64a0: 72 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61 20  r.  ** to use a 
64b0: 52 4f 57 49 44 20 77 68 69 63 68 20 63 61 6e 20  ROWID which can 
64c0: 64 69 72 65 63 74 6c 79 20 61 63 63 65 73 73 20  directly access 
64d0: 61 20 74 61 62 6c 65 20 72 61 74 68 65 72 20 74  a table rather t
64e0: 68 61 6e 20 61 6e 0a 20 20 2a 2a 20 69 6e 64 65  han an.  ** inde
64f0: 78 20 77 68 69 63 68 20 72 65 71 75 69 72 65 73  x which requires
6500: 20 72 65 61 64 69 6e 67 20 61 6e 20 69 6e 64 65   reading an inde
6510: 78 20 66 69 72 73 74 20 74 6f 20 67 65 74 20 74  x first to get t
6520: 68 65 20 72 6f 77 69 64 20 74 68 65 6e 0a 20 20  he rowid then.  
6530: 2a 2a 20 64 6f 69 6e 67 20 61 20 73 65 63 6f 6e  ** doing a secon
6540: 64 20 72 65 61 64 20 6f 66 20 74 68 65 20 61 63  d read of the ac
6550: 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 74 61  tual database ta
6560: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ble..  **.  ** A
6570: 63 74 75 61 6c 6c 79 2c 20 69 66 20 74 68 65 72  ctually, if ther
6580: 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20  e are more than 
6590: 33 32 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  32 tables in the
65a0: 20 6a 6f 69 6e 2c 20 6f 6e 6c 79 20 74 68 65 0a   join, only the.
65b0: 20 20 2a 2a 20 66 69 72 73 74 20 33 32 20 74 61    ** first 32 ta
65c0: 62 6c 65 73 20 61 72 65 20 63 61 6e 64 69 64 61  bles are candida
65d0: 74 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  tes for indices.
65e0: 20 20 54 68 69 73 20 69 73 20 28 61 67 61 69 6e    This is (again
65f0: 29 20 64 75 65 0a 20 20 2a 2a 20 74 6f 20 74 68  ) due.  ** to th
6600: 65 20 6c 69 6d 69 74 20 6f 66 20 33 32 20 62 69  e limit of 32 bi
6610: 74 73 20 69 6e 20 61 6e 20 69 6e 74 65 67 65 72  ts in an integer
6620: 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20   bitmask..  */. 
6630: 20 6c 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b 0a 20   loopMask = 0;. 
6640: 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61 62   pTabItem = pTab
6650: 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76 65  List->a;.  pLeve
6660: 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a 20  l = pWInfo->a;. 
6670: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
6680: 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 69 3c  List->nSrc && i<
6690: 41 52 52 41 59 53 49 5a 45 28 69 44 69 72 65 63  ARRAYSIZE(iDirec
66a0: 74 45 71 29 3b 20 69 2b 2b 2c 70 54 61 62 49 74  tEq); i++,pTabIt
66b0: 65 6d 2b 2b 2c 70 4c 65 76 65 6c 2b 2b 29 7b 0a  em++,pLevel++){.
66c0: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 69      int j;.    i
66d0: 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
66e0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20 20  em->iCursor;    
66f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
6700: 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20 74  ursor for this t
6710: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 42 69 74 6d  able */.    Bitm
6720: 61 73 6b 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61  ask mask = getMa
6730: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43 75  sk(&maskSet, iCu
6740: 72 29 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20 6d  r);  /* Cursor m
6750: 61 73 6b 20 66 6f 72 20 74 68 69 73 20 74 61 62  ask for this tab
6760: 6c 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20  le */.    Table 
6770: 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
6780: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 49 6e 64 65  ->pTab;.    Inde
6790: 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 49 6e 64  x *pIdx;.    Ind
67a0: 65 78 20 2a 70 42 65 73 74 49 64 78 20 3d 20 30  ex *pBestIdx = 0
67b0: 3b 0a 20 20 20 20 69 6e 74 20 62 65 73 74 53 63  ;.    int bestSc
67c0: 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  ore = 0;.    int
67d0: 20 62 65 73 74 52 65 76 20 3d 20 30 3b 0a 0a 20   bestRev = 0;.. 
67e0: 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73     /* Check to s
67f0: 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ee if there is a
6800: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
6810: 74 20 75 73 65 73 20 6f 6e 6c 79 20 74 68 65 0a  t uses only the.
6820: 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 66 69 65      ** ROWID fie
6830: 6c 64 20 6f 66 20 74 68 69 73 20 74 61 62 6c 65  ld of this table
6840: 2e 20 20 46 6f 72 20 74 65 72 6d 73 20 6f 66 20  .  For terms of 
6850: 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3d 3d  the form ROWID==
6860: 65 78 70 72 0a 20 20 20 20 2a 2a 20 73 65 74 20  expr.    ** set 
6870: 69 44 69 72 65 63 74 45 71 5b 69 5d 20 74 6f 20  iDirectEq[i] to 
6880: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
6890: 20 74 65 72 6d 2e 20 20 46 6f 72 20 74 65 72 6d   term.  For term
68a0: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  s of the.    ** 
68b0: 66 6f 72 6d 20 52 4f 57 49 44 3c 65 78 70 72 20  form ROWID<expr 
68c0: 6f 72 20 52 4f 57 49 44 3c 3d 65 78 70 72 20 73  or ROWID<=expr s
68d0: 65 74 20 69 44 69 72 65 63 74 4c 74 5b 69 5d 20  et iDirectLt[i] 
68e0: 74 6f 20 74 68 65 20 74 65 72 6d 20 69 6e 64 65  to the term inde
68f0: 78 2e 0a 20 20 20 20 2a 2a 20 46 6f 72 20 74 65  x..    ** For te
6900: 72 6d 73 20 6c 69 6b 65 20 52 4f 57 49 44 3e 65  rms like ROWID>e
6910: 78 70 72 20 6f 72 20 52 4f 57 49 44 3e 3d 65 78  xpr or ROWID>=ex
6920: 70 72 20 73 65 74 20 69 44 69 72 65 63 74 47 74  pr set iDirectGt
6930: 5b 69 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  [i]..    **.    
6940: 2a 2a 20 28 41 64 64 65 64 3a 29 20 54 72 65 61  ** (Added:) Trea
6950: 74 20 52 4f 57 49 44 20 49 4e 20 65 78 70 72 20  t ROWID IN expr 
6960: 6c 69 6b 65 20 52 4f 57 49 44 3d 65 78 70 72 2e  like ROWID=expr.
6970: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65 76  .    */.    pLev
6980: 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d 31  el->iIdxCur = -1
6990: 3b 0a 20 20 20 20 69 44 69 72 65 63 74 45 71 5b  ;.    iDirectEq[
69a0: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 69 44 69  i] = -1;.    iDi
69b0: 72 65 63 74 4c 74 5b 69 5d 20 3d 20 2d 31 3b 0a  rectLt[i] = -1;.
69c0: 20 20 20 20 69 44 69 72 65 63 74 47 74 5b 69 5d      iDirectGt[i]
69d0: 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28 70   = -1;.    for(p
69e0: 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a 3d 30 3b  Term=aExpr, j=0;
69f0: 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20 70   j<nExpr; j++, p
6a00: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 45  Term++){.      E
6a10: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
6a20: 3e 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54  >p;.      if( pT
6a30: 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43  erm->idxLeft==iC
6a40: 75 72 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d  ur && pX->pLeft-
6a50: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
6a60: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
6a70: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
6a80: 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65 72 6d  loopMask)==pTerm
6a90: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 29 7b  ->prereqRight ){
6aa0: 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
6ab0: 20 70 58 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20   pX->op ){.     
6ac0: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a       case TK_IN:
6ad0: 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
6ae0: 54 4b 5f 45 51 3a 20 69 44 69 72 65 63 74 45 71  TK_EQ: iDirectEq
6af0: 5b 69 5d 20 3d 20 6a 3b 20 62 72 65 61 6b 3b 0a  [i] = j; break;.
6b00: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
6b10: 4b 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20 20 20  K_LE:.          
6b20: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 69 44 69 72  case TK_LT: iDir
6b30: 65 63 74 4c 74 5b 69 5d 20 3d 20 6a 3b 20 62 72  ectLt[i] = j; br
6b40: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  eak;.          c
6b50: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20  ase TK_GE:.     
6b60: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a       case TK_GT:
6b70: 20 69 44 69 72 65 63 74 47 74 5b 69 5d 20 3d 20   iDirectGt[i] = 
6b80: 6a 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  j;  break;.     
6b90: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6ba0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65   }..    /* If we
6bb0: 20 66 6f 75 6e 64 20 61 20 74 65 72 6d 20 74 68   found a term th
6bc0: 61 74 20 74 65 73 74 73 20 52 4f 57 49 44 20 77  at tests ROWID w
6bd0: 69 74 68 20 3d 3d 20 6f 72 20 49 4e 2c 20 74 68  ith == or IN, th
6be0: 61 74 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 77  at term.    ** w
6bf0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 6c  ill be used to l
6c00: 6f 63 61 74 65 20 74 68 65 20 72 6f 77 73 20 69  ocate the rows i
6c10: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  n the database t
6c20: 61 62 6c 65 2e 20 20 54 68 65 72 65 0a 20 20 20  able.  There.   
6c30: 20 2a 2a 20 69 73 20 6e 6f 74 20 6e 65 65 64 20   ** is not need 
6c40: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 69 6e 74 6f  to continue into
6c50: 20 74 68 65 20 63 6f 64 65 20 62 65 6c 6f 77 20   the code below 
6c60: 74 68 61 74 20 6c 6f 6f 6b 73 20 66 6f 72 0a 20  that looks for. 
6c70: 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78 2e 20     ** an index. 
6c80: 20 57 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20   We will always 
6c90: 75 73 65 20 74 68 65 20 52 4f 57 49 44 20 6f 76  use the ROWID ov
6ca0: 65 72 20 61 6e 20 69 6e 64 65 78 2e 0a 20 20 20  er an index..   
6cb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44 69 72   */.    if( iDir
6cc0: 65 63 74 45 71 5b 69 5d 3e 3d 30 20 29 7b 0a 20  ectEq[i]>=0 ){. 
6cd0: 20 20 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c 3d       loopMask |=
6ce0: 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 4c 65   mask;.      pLe
6cf0: 76 65 6c 2d 3e 70 49 64 78 20 3d 20 30 3b 0a 20  vel->pIdx = 0;. 
6d00: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
6d10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
6d20: 61 20 73 65 61 72 63 68 20 66 6f 72 20 75 73 61  a search for usa
6d30: 62 6c 65 20 69 6e 64 69 63 65 73 2e 20 20 4c 65  ble indices.  Le
6d40: 61 76 65 20 70 42 65 73 74 49 64 78 20 70 6f 69  ave pBestIdx poi
6d50: 6e 74 69 6e 67 20 74 6f 0a 20 20 20 20 2a 2a 20  nting to.    ** 
6d60: 74 68 65 20 22 62 65 73 74 22 20 69 6e 64 65 78  the "best" index
6d70: 2e 20 20 70 42 65 73 74 49 64 78 20 69 73 20 6c  .  pBestIdx is l
6d80: 65 66 74 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20  eft set to NULL 
6d90: 69 66 20 6e 6f 20 69 6e 64 69 63 65 73 0a 20 20  if no indices.  
6da0: 20 20 2a 2a 20 61 72 65 20 75 73 61 62 6c 65 2e    ** are usable.
6db0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6dc0: 68 65 20 62 65 73 74 20 69 6e 64 65 78 20 69 73  he best index is
6dd0: 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68   the one with th
6de0: 65 20 68 69 67 68 65 73 74 20 73 63 6f 72 65 2e  e highest score.
6df0: 20 20 54 68 65 20 73 63 6f 72 65 0a 20 20 20 20    The score.    
6e00: 2a 2a 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78  ** for the index
6e10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 61   is determined a
6e20: 73 20 66 6f 6c 6c 6f 77 73 2e 20 20 46 6f 72 20  s follows.  For 
6e30: 65 61 63 68 20 6f 66 20 74 68 65 0a 20 20 20 20  each of the.    
6e40: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  ** left-most ter
6e50: 6d 73 20 74 68 61 74 20 69 73 20 66 69 78 65 64  ms that is fixed
6e60: 20 62 79 20 61 6e 20 65 71 75 61 6c 69 74 79 20   by an equality 
6e70: 6f 70 65 72 61 74 6f 72 2c 20 61 64 64 0a 20 20  operator, add.  
6e80: 20 20 2a 2a 20 33 32 20 74 6f 20 74 68 65 20 73    ** 32 to the s
6e90: 63 6f 72 65 2e 20 20 54 68 65 20 72 69 67 68 74  core.  The right
6ea0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
6eb0: 65 20 69 6e 64 65 78 20 6d 61 79 20 62 65 0a 20  e index may be. 
6ec0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 65     ** constraine
6ed0: 64 20 62 79 20 61 6e 20 69 6e 65 71 75 61 6c 69  d by an inequali
6ee0: 74 79 2e 20 20 41 64 64 20 34 20 69 66 20 66 6f  ty.  Add 4 if fo
6ef0: 72 20 61 6e 20 22 78 3c 2e 2e 2e 22 20 63 6f 6e  r an "x<..." con
6f00: 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a 20 61  straint.    ** a
6f10: 6e 64 20 61 64 64 20 38 20 66 6f 72 20 61 6e 20  nd add 8 for an 
6f20: 22 78 3e 2e 2e 2e 22 20 63 6f 6e 73 74 72 61 69  "x>..." constrai
6f30: 6e 74 2e 20 20 49 66 20 62 6f 74 68 20 63 6f 6e  nt.  If both con
6f40: 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a 2a 20  straints.    ** 
6f50: 61 72 65 20 70 72 65 73 65 6e 74 2c 20 61 64 64  are present, add
6f60: 20 31 32 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20   12..    **.    
6f70: 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 2d 6d  ** If the left-m
6f80: 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68 65 20  ost term of the 
6f90: 69 6e 64 65 78 20 75 73 65 73 20 61 6e 20 49 4e  index uses an IN
6fa0: 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20 2a 2a   operator.    **
6fb0: 20 28 65 78 3a 20 20 22 78 20 49 4e 20 28 2e 2e   (ex:  "x IN (..
6fc0: 2e 29 22 29 20 20 74 68 65 6e 20 61 64 64 20 31  .)")  then add 1
6fd0: 36 20 74 6f 20 74 68 65 20 73 63 6f 72 65 2e 0a  6 to the score..
6fe0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
6ff0: 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20 62 65   an index can be
7000: 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74 69 6e   used for sortin
7010: 67 2c 20 61 64 64 20 32 20 74 6f 20 74 68 65 20  g, add 2 to the 
7020: 73 63 6f 72 65 2e 0a 20 20 20 20 2a 2a 20 49 66  score..    ** If
7030: 20 61 6e 20 69 6e 64 65 78 20 63 6f 6e 74 61 69   an index contai
7040: 6e 73 20 61 6c 6c 20 74 68 65 20 74 65 72 6d 73  ns all the terms
7050: 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68 61 74   of a table that
7060: 20 61 72 65 20 65 76 65 72 0a 20 20 20 20 2a 2a   are ever.    **
7070: 20 75 73 65 64 20 62 79 20 61 6e 79 20 65 78 70   used by any exp
7080: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 53  ression in the S
7090: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68  QL statement, th
70a0: 65 6e 20 61 64 64 20 31 20 74 6f 0a 20 20 20 20  en add 1 to.    
70b0: 2a 2a 20 74 68 65 20 73 63 6f 72 65 2e 0a 20 20  ** the score..  
70c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
70d0: 20 73 63 6f 72 69 6e 67 20 73 79 73 74 65 6d 20   scoring system 
70e0: 69 73 20 64 65 73 69 67 6e 65 64 20 73 6f 20 74  is designed so t
70f0: 68 61 74 20 74 68 65 20 73 63 6f 72 65 20 63 61  hat the score ca
7100: 6e 20 6c 61 74 65 72 20 62 65 0a 20 20 20 20 2a  n later be.    *
7110: 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  * used to determ
7120: 69 6e 65 20 68 6f 77 20 74 68 65 20 69 6e 64 65  ine how the inde
7130: 78 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 74  x is used.  If t
7140: 68 65 20 73 63 6f 72 65 26 30 78 31 63 20 69 73  he score&0x1c is
7150: 20 30 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 61   0.    ** then a
7160: 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61  ll constraints a
7170: 72 65 20 65 71 75 61 6c 69 74 69 65 73 2e 20 20  re equalities.  
7180: 49 66 20 73 63 6f 72 65 26 30 78 34 20 69 73 20  If score&0x4 is 
7190: 6e 6f 74 20 30 20 74 68 65 6e 0a 20 20 20 20 2a  not 0 then.    *
71a0: 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20 69 6e  * there is an in
71b0: 65 71 75 61 6c 69 74 79 20 75 73 65 64 20 61 73  equality used as
71c0: 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b   a termination k
71d0: 65 79 2e 20 20 28 65 78 3a 20 22 78 3c 2e 2e 2e  ey.  (ex: "x<...
71e0: 22 29 0a 20 20 20 20 2a 2a 20 49 66 20 73 63 6f  ").    ** If sco
71f0: 72 65 26 30 78 38 20 69 73 20 6e 6f 74 20 30 20  re&0x8 is not 0 
7200: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 6e  then there is an
7210: 20 69 6e 65 71 75 61 6c 69 74 79 20 75 73 65 64   inequality used
7220: 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   as the.    ** s
7230: 74 61 72 74 20 6b 65 79 2e 20 20 28 65 78 3a 20  tart key.  (ex: 
7240: 22 78 3e 2e 2e 2e 22 29 2e 20 20 41 20 73 63 6f  "x>...").  A sco
7250: 72 65 20 6f 72 20 30 78 31 30 20 69 73 20 74 68  re or 0x10 is th
7260: 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 0a 20  e special case. 
7270: 20 20 20 2a 2a 20 6f 66 20 61 6e 20 49 4e 20 6f     ** of an IN o
7280: 70 65 72 61 74 6f 72 20 63 6f 6e 73 74 72 61 69  perator constrai
7290: 6e 74 2e 20 20 28 65 78 3a 20 20 22 78 20 49 4e  nt.  (ex:  "x IN
72a0: 20 2e 2e 2e 22 29 2e 0a 20 20 20 20 2a 2a 0a 20   ...")..    **. 
72b0: 20 20 20 2a 2a 20 54 68 65 20 49 4e 20 6f 70 65     ** The IN ope
72c0: 72 61 74 6f 72 20 28 61 73 20 69 6e 20 22 3c 65  rator (as in "<e
72d0: 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 29 20  xpr> IN (...)") 
72e0: 69 73 20 74 72 65 61 74 65 64 20 74 68 65 20 73  is treated the s
72f0: 61 6d 65 20 61 73 0a 20 20 20 20 2a 2a 20 61 6e  ame as.    ** an
7300: 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61 72   equality compar
7310: 69 73 6f 6e 20 65 78 63 65 70 74 20 74 68 61 74  ison except that
7320: 20 69 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20   it can only be 
7330: 75 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 20 20  used on the.    
7340: 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c  ** left-most col
7350: 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65 78 20  umn of an index 
7360: 61 6e 64 20 6f 74 68 65 72 20 74 65 72 6d 73 20  and other terms 
7370: 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  of the WHERE cla
7380: 75 73 65 0a 20 20 20 20 2a 2a 20 63 61 6e 6e 6f  use.    ** canno
7390: 74 20 62 65 20 75 73 65 64 20 69 6e 20 63 6f 6e  t be used in con
73a0: 6a 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  junction with th
73b0: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 74 6f  e IN operator to
73c0: 20 68 65 6c 70 20 73 61 74 69 73 66 79 0a 20 20   help satisfy.  
73d0: 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6c 75 6d    ** other colum
73e0: 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65 78 2e  ns of the index.
73f0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
7400: 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65  pIdx=pTab->pInde
7410: 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49  x; pIdx; pIdx=pI
7420: 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  dx->pNext){.    
7430: 20 20 42 69 74 6d 61 73 6b 20 65 71 4d 61 73 6b    Bitmask eqMask
7440: 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65 78 20   = 0;  /* Index 
7450: 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65 64 20  columns covered 
7460: 62 79 20 61 6e 20 78 3d 2e 2e 2e 20 74 65 72 6d  by an x=... term
7470: 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73   */.      Bitmas
7480: 6b 20 6c 74 4d 61 73 6b 20 3d 20 30 3b 20 20 2f  k ltMask = 0;  /
7490: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  * Index columns 
74a0: 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20 78 3c  covered by an x<
74b0: 2e 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ... term */.    
74c0: 20 20 42 69 74 6d 61 73 6b 20 67 74 4d 61 73 6b    Bitmask gtMask
74d0: 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65 78 20   = 0;  /* Index 
74e0: 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65 64 20  columns covered 
74f0: 62 79 20 61 6e 20 78 3e 2e 2e 2e 20 74 65 72 6d  by an x>... term
7500: 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61 73   */.      Bitmas
7510: 6b 20 69 6e 4d 61 73 6b 20 3d 20 30 3b 20 20 2f  k inMask = 0;  /
7520: 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20  * Index columns 
7530: 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20 78 20  covered by an x 
7540: 49 4e 20 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20  IN .. term */.  
7550: 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b 0a 20      Bitmask m;. 
7560: 20 20 20 20 20 69 6e 74 20 6e 45 71 2c 20 73 63       int nEq, sc
7570: 6f 72 65 2c 20 62 52 65 76 20 3d 20 30 3b 0a 0a  ore, bRev = 0;..
7580: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
7590: 6e 43 6f 6c 75 6d 6e 3e 73 69 7a 65 6f 66 28 65  nColumn>sizeof(e
75a0: 71 4d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20  qMask)*8 ){.    
75b0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
75c0: 2a 20 49 67 6e 6f 72 65 20 69 6e 64 69 63 65 73  * Ignore indices
75d0: 20 77 69 74 68 20 74 6f 6f 20 6d 61 6e 79 20 63   with too many c
75e0: 6f 6c 75 6d 6e 73 20 74 6f 20 61 6e 61 6c 79 7a  olumns to analyz
75f0: 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  e */.      }.   
7600: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 61 45 78     for(pTerm=aEx
7610: 70 72 2c 20 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72  pr, j=0; j<nExpr
7620: 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b  ; j++, pTerm++){
7630: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
7640: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20  X = pTerm->p;.  
7650: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
7660: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
7670: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
7680: 2c 20 70 58 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  , pX->pLeft);.  
7690: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
76a0: 20 26 26 20 70 58 2d 3e 70 52 69 67 68 74 20 29   && pX->pRight )
76b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c  {.          pCol
76c0: 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  l = sqlite3ExprC
76d0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
76e0: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
76f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7700: 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  ( !pColl ){.    
7710: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 50        pColl = pP
7720: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
7730: 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  oll;.        }. 
7740: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
7750: 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 20  ->idxLeft==iCur 
7760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
7770: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52   (pTerm->prereqR
7780: 69 67 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29  ight & loopMask)
7790: 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52  ==pTerm->prereqR
77a0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
77b0: 20 20 69 6e 74 20 69 43 6f 6c 75 6d 6e 20 3d 20    int iColumn = 
77c0: 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75  pX->pLeft->iColu
77d0: 6d 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  mn;.          in
77e0: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63  t k;.          c
77f0: 68 61 72 20 69 64 78 61 66 66 20 3d 20 69 43 6f  har idxaff = iCo
7800: 6c 75 6d 6e 3e 3d 30 20 3f 20 70 49 64 78 2d 3e  lumn>=0 ? pIdx->
7810: 70 54 61 62 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f  pTable->aCol[iCo
7820: 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74 79 20 3a  lumn].affinity :
7830: 20 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 66   0; .          f
7840: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49 64 78 2d 3e  or(k=0; k<pIdx->
7850: 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b 29 7b 0a 20  nColumn; k++){. 
7860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
7870: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   the collating s
7880: 65 71 75 65 6e 63 65 73 20 6f 72 20 61 66 66 69  equences or affi
7890: 6e 69 74 69 65 73 20 64 6f 6e 27 74 20 6d 61 74  nities don't mat
78a0: 63 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ch, .           
78b0: 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20   ** ignore this 
78c0: 69 6e 64 65 78 2e 20 20 2a 2f 0a 20 20 20 20 20  index.  */.     
78d0: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c         if( pColl
78e0: 21 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e  !=pIdx->keyInfo.
78f0: 61 43 6f 6c 6c 5b 6b 5d 20 29 20 63 6f 6e 74 69  aColl[k] ) conti
7900: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
7910: 20 69 66 28 20 21 73 71 6c 69 74 65 33 49 6e 64   if( !sqlite3Ind
7920: 65 78 41 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c  exAffinityOk(pX,
7930: 20 69 64 78 61 66 66 29 20 29 20 63 6f 6e 74 69   idxaff) ) conti
7940: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
7950: 20 69 66 28 20 70 49 64 78 2d 3e 61 69 43 6f 6c   if( pIdx->aiCol
7960: 75 6d 6e 5b 6b 5d 3d 3d 69 43 6f 6c 75 6d 6e 20  umn[k]==iColumn 
7970: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7980: 20 73 77 69 74 63 68 28 20 70 58 2d 3e 6f 70 20   switch( pX->op 
7990: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
79a0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
79b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79c0: 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 20 69 6e     if( k==0 ) in
79d0: 4d 61 73 6b 20 7c 3d 20 31 3b 0a 20 20 20 20 20  Mask |= 1;.     
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
79f0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7a00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7a10: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51        case TK_EQ
7a20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
7a30: 20 20 20 20 20 20 65 71 4d 61 73 6b 20 7c 3d 20        eqMask |= 
7a40: 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6b 3b  ((Bitmask)1)<<k;
7a50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7a60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
7a70: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
7a90: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 20 20 20 20   TK_LE:.        
7aa0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
7ab0: 4c 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  LT: {.          
7ac0: 20 20 20 20 20 20 20 20 6c 74 4d 61 73 6b 20 7c          ltMask |
7ad0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
7ae0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
7af0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7b20: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 20 20  se TK_GE:.      
7b30: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
7b40: 4b 5f 47 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  K_GT: {.        
7b50: 20 20 20 20 20 20 20 20 20 20 67 74 4d 61 73 6b            gtMask
7b60: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
7b70: 3c 3c 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  <<k;.           
7b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
7ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bb0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7bd0: 43 41 4e 54 5f 48 41 50 50 45 4e 20 2a 2f 0a 20  CANT_HAPPEN */. 
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
7c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
7c20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7c40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7c50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7c60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7c70: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7c80: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
7c90: 67 20 6c 6f 6f 70 20 65 6e 64 73 20 77 69 74 68  g loop ends with
7ca0: 20 6e 45 71 20 73 65 74 20 74 6f 20 74 68 65 20   nEq set to the 
7cb0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
7cc0: 73 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  s.      ** on th
7cd0: 65 20 6c 65 66 74 20 6f 66 20 74 68 65 20 69 6e  e left of the in
7ce0: 64 65 78 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73  dex with == cons
7cf0: 74 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 20 2a  traints..      *
7d00: 2f 0a 20 20 20 20 20 20 66 6f 72 28 6e 45 71 3d  /.      for(nEq=
7d10: 30 3b 20 6e 45 71 3c 70 49 64 78 2d 3e 6e 43 6f  0; nEq<pIdx->nCo
7d20: 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29 7b 0a 20 20  lumn; nEq++){.  
7d30: 20 20 20 20 20 20 6d 20 3d 20 28 28 28 42 69 74        m = (((Bit
7d40: 6d 61 73 6b 29 31 29 3c 3c 28 6e 45 71 2b 31 29  mask)1)<<(nEq+1)
7d50: 29 2d 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  )-1;.        if(
7d60: 20 28 6d 20 26 20 65 71 4d 61 73 6b 29 21 3d 6d   (m & eqMask)!=m
7d70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7d80: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 42 65 67 69  }..      /* Begi
7d90: 6e 20 61 73 73 65 6d 62 6c 79 69 6e 67 20 74 68  n assemblying th
7da0: 65 20 73 63 6f 72 65 0a 20 20 20 20 20 20 2a 2f  e score.      */
7db0: 0a 20 20 20 20 20 20 73 63 6f 72 65 20 3d 20 6e  .      score = n
7dc0: 45 71 2a 33 32 3b 20 20 20 2f 2a 20 42 61 73 65  Eq*32;   /* Base
7dd0: 20 73 63 6f 72 65 20 69 73 20 33 32 20 74 69 6d   score is 32 tim
7de0: 65 73 20 6e 75 6d 62 65 72 20 6f 66 20 3d 3d 20  es number of == 
7df0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a 2f 0a 20  constraints */. 
7e00: 20 20 20 20 20 6d 20 3d 20 28 28 42 69 74 6d 61       m = ((Bitma
7e10: 73 6b 29 31 29 3c 3c 6e 45 71 3b 0a 20 20 20 20  sk)1)<<nEq;.    
7e20: 20 20 69 66 28 20 6d 20 26 20 6c 74 4d 61 73 6b    if( m & ltMask
7e30: 20 29 20 73 63 6f 72 65 2b 3d 34 3b 20 20 20 20   ) score+=4;    
7e40: 2f 2a 20 49 6e 63 72 65 61 73 65 20 73 63 6f 72  /* Increase scor
7e50: 65 20 66 6f 72 20 61 20 3c 20 63 6f 6e 73 74 72  e for a < constr
7e60: 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  aint */.      if
7e70: 28 20 6d 20 26 20 67 74 4d 61 73 6b 20 29 20 73  ( m & gtMask ) s
7e80: 63 6f 72 65 2b 3d 38 3b 20 20 20 20 2f 2a 20 49  core+=8;    /* I
7e90: 6e 63 72 65 61 73 65 20 73 63 6f 72 65 20 66 6f  ncrease score fo
7ea0: 72 20 61 20 3e 20 63 6f 6e 73 74 72 61 69 6e 74  r a > constraint
7eb0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 63   */.      if( sc
7ec0: 6f 72 65 3d 3d 30 20 26 26 20 69 6e 4d 61 73 6b  ore==0 && inMask
7ed0: 20 29 20 73 63 6f 72 65 20 3d 20 31 36 3b 20 2f   ) score = 16; /
7ee0: 2a 20 44 65 66 61 75 6c 74 20 73 63 6f 72 65 20  * Default score 
7ef0: 66 6f 72 20 49 4e 20 63 6f 6e 73 74 72 61 69 6e  for IN constrain
7f00: 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 47  t */..      /* G
7f10: 69 76 65 20 62 6f 6e 75 73 20 70 6f 69 6e 74 73  ive bonus points
7f20: 20 69 66 20 74 68 69 73 20 69 6e 64 65 78 20 63   if this index c
7f30: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
7f40: 6f 72 74 69 6e 67 0a 20 20 20 20 20 20 2a 2f 0a  orting.      */.
7f50: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 30 20 26        if( i==0 &
7f60: 26 20 73 63 6f 72 65 21 3d 31 36 20 26 26 20 70  & score!=16 && p
7f70: 70 4f 72 64 65 72 42 79 20 26 26 20 2a 70 70 4f  pOrderBy && *ppO
7f80: 72 64 65 72 42 79 20 29 7b 0a 20 20 20 20 20 20  rderBy ){.      
7f90: 20 20 69 6e 74 20 62 61 73 65 20 3d 20 70 54 61    int base = pTa
7fa0: 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72  bList->a[0].iCur
7fb0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28  sor;.        if(
7fc0: 20 69 73 53 6f 72 74 69 6e 67 49 6e 64 65 78 28   isSortingIndex(
7fd0: 70 50 61 72 73 65 2c 20 70 49 64 78 2c 20 70 54  pParse, pIdx, pT
7fe0: 61 62 2c 20 62 61 73 65 2c 20 2a 70 70 4f 72 64  ab, base, *ppOrd
7ff0: 65 72 42 79 2c 20 6e 45 71 2c 20 26 62 52 65 76  erBy, nEq, &bRev
8000: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
8010: 63 6f 72 65 20 2b 3d 20 32 3b 0a 20 20 20 20 20  core += 2;.     
8020: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
8030: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
8040: 73 65 65 20 69 66 20 77 65 20 63 61 6e 20 67 65  see if we can ge
8050: 74 20 61 77 61 79 20 77 69 74 68 20 75 73 69 6e  t away with usin
8060: 67 20 6a 75 73 74 20 74 68 65 20 69 6e 64 65 78  g just the index
8070: 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20 20 2a   without.      *
8080: 2a 20 65 76 65 72 20 72 65 61 64 69 6e 67 20 74  * ever reading t
8090: 68 65 20 74 61 62 6c 65 2e 20 20 49 66 20 74 68  he table.  If th
80a0: 61 74 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  at is the case, 
80b0: 74 68 65 6e 20 61 64 64 20 6f 6e 65 20 62 6f 6e  then add one bon
80c0: 75 73 0a 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e  us.      ** poin
80d0: 74 20 74 6f 20 74 68 65 20 73 63 6f 72 65 2e 0a  t to the score..
80e0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
80f0: 66 28 20 73 63 6f 72 65 20 26 26 20 70 54 61 62  f( score && pTab
8100: 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 3c 20  Item->colUsed < 
8110: 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28  (((Bitmask)1)<<(
8120: 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20 20 20 20  BMS-1)) ){.     
8130: 20 20 20 66 6f 72 28 6d 3d 30 2c 20 6a 3d 30 3b     for(m=0, j=0;
8140: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
8150: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8160: 20 20 69 6e 74 20 78 20 3d 20 70 49 64 78 2d 3e    int x = pIdx->
8170: 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20  aiColumn[j];.   
8180: 20 20 20 20 20 20 20 69 66 28 20 78 3c 42 4d 53         if( x<BMS
8190: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
81a0: 20 20 6d 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b    m |= ((Bitmask
81b0: 29 31 29 3c 3c 78 3b 0a 20 20 20 20 20 20 20 20  )1)<<x;.        
81c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
81d0: 20 20 20 20 20 20 69 66 28 20 28 70 54 61 62 49        if( (pTabI
81e0: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 26 20 6d  tem->colUsed & m
81f0: 29 3d 3d 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  )==pTabItem->col
8200: 55 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  Used ){.        
8210: 20 20 73 63 6f 72 65 2b 2b 3b 0a 20 20 20 20 20    score++;.     
8220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
8230: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 63      /* If the sc
8240: 6f 72 65 20 66 6f 72 20 74 68 69 73 20 69 6e 64  ore for this ind
8250: 65 78 20 69 73 20 74 68 65 20 62 65 73 74 20 77  ex is the best w
8260: 65 20 68 61 76 65 20 73 65 65 6e 20 73 6f 20 66  e have seen so f
8270: 61 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ar, then.      *
8280: 2a 20 73 61 76 65 20 69 74 0a 20 20 20 20 20 20  * save it.      
8290: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 63 6f  */.      if( sco
82a0: 72 65 3e 62 65 73 74 53 63 6f 72 65 20 29 7b 0a  re>bestScore ){.
82b0: 20 20 20 20 20 20 20 20 70 42 65 73 74 49 64 78          pBestIdx
82c0: 20 3d 20 70 49 64 78 3b 0a 20 20 20 20 20 20 20   = pIdx;.       
82d0: 20 62 65 73 74 53 63 6f 72 65 20 3d 20 73 63 6f   bestScore = sco
82e0: 72 65 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74  re;.        best
82f0: 52 65 76 20 3d 20 62 52 65 76 3b 0a 20 20 20 20  Rev = bRev;.    
8300: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c    }.    }.    pL
8310: 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 70 42 65  evel->pIdx = pBe
8320: 73 74 49 64 78 3b 0a 20 20 20 20 70 4c 65 76 65  stIdx;.    pLeve
8330: 6c 2d 3e 73 63 6f 72 65 20 3d 20 62 65 73 74 53  l->score = bestS
8340: 63 6f 72 65 3b 0a 20 20 20 20 70 4c 65 76 65 6c  core;.    pLevel
8350: 2d 3e 62 52 65 76 20 3d 20 62 65 73 74 52 65 76  ->bRev = bestRev
8360: 3b 0a 20 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c  ;.    loopMask |
8370: 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 69 66 28 20  = mask;.    if( 
8380: 70 42 65 73 74 49 64 78 20 29 7b 0a 20 20 20 20  pBestIdx ){.    
8390: 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75    pLevel->iIdxCu
83a0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
83b0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ++;.    }.  }.. 
83c0: 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
83d0: 20 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59   if the ORDER BY
83e0: 20 63 6c 61 75 73 65 20 69 73 20 6f 72 20 63 61   clause is or ca
83f0: 6e 20 62 65 20 73 61 74 69 73 66 69 65 64 20 62  n be satisfied b
8400: 79 20 74 68 65 0a 20 20 2a 2a 20 75 73 65 20 6f  y the.  ** use o
8410: 66 20 61 6e 20 69 6e 64 65 78 20 6f 6e 20 74 68  f an index on th
8420: 65 20 66 69 72 73 74 20 74 61 62 6c 65 2e 0a 20  e first table.. 
8430: 20 2a 2f 0a 20 20 69 66 28 20 70 70 4f 72 64 65   */.  if( ppOrde
8440: 72 42 79 20 26 26 20 2a 70 70 4f 72 64 65 72 42  rBy && *ppOrderB
8450: 79 20 26 26 20 70 54 61 62 4c 69 73 74 2d 3e 6e  y && pTabList->n
8460: 53 72 63 3e 30 20 29 7b 0a 20 20 20 20 49 6e 64  Src>0 ){.    Ind
8470: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
8480: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 64        /* Index d
8490: 65 72 69 76 65 64 20 66 72 6f 6d 20 74 68 65 20  erived from the 
84a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
84b0: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84d0: 4c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20  Left-most table 
84e0: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
84f0: 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 52  se */.    int bR
8500: 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ev = 0;         
8510: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
8520: 76 65 72 73 65 20 74 68 65 20 6f 75 74 70 75 74  verse the output
8530: 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 69 6e   order */.    in
8540: 74 20 69 43 75 72 3b 20 20 20 20 20 20 20 20 20  t iCur;         
8550: 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 2d         /* Btree-
8560: 63 75 72 73 6f 72 20 74 68 61 74 20 77 69 6c 6c  cursor that will
8570: 20 62 65 20 75 73 65 64 20 62 79 20 70 54 61 62   be used by pTab
8580: 20 2a 2f 0a 20 20 20 20 57 68 65 72 65 4c 65 76   */.    WhereLev
8590: 65 6c 20 2a 70 4c 65 76 65 6c 30 20 3d 20 26 70  el *pLevel0 = &p
85a0: 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a 0a 20 20  WInfo->a[0];..  
85b0: 20 20 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73    pTab = pTabLis
85c0: 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20  t->a[0].pTab;.  
85d0: 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 30    pIdx = pLevel0
85e0: 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 43 75 72  ->pIdx;.    iCur
85f0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30   = pTabList->a[0
8600: 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69  ].iCursor;.    i
8610: 66 28 20 70 49 64 78 3d 3d 30 20 26 26 20 73 6f  f( pIdx==0 && so
8620: 72 74 61 62 6c 65 42 79 52 6f 77 69 64 28 69 43  rtableByRowid(iC
8630: 75 72 2c 20 2a 70 70 4f 72 64 65 72 42 79 2c 20  ur, *ppOrderBy, 
8640: 26 62 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20  &bRev) ){.      
8650: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
8660: 63 6c 61 75 73 65 20 73 70 65 63 69 66 69 65 73  clause specifies
8670: 20 52 4f 57 49 44 20 6f 72 64 65 72 2c 20 77 68   ROWID order, wh
8680: 69 63 68 20 69 73 20 77 68 61 74 20 77 65 0a 20  ich is what we. 
8690: 20 20 20 20 20 2a 2a 20 77 65 72 65 20 67 6f 69       ** were goi
86a0: 6e 67 20 74 6f 20 62 65 20 64 6f 69 6e 67 20 61  ng to be doing a
86b0: 6e 79 77 61 79 2e 2e 2e 0a 20 20 20 20 20 20 2a  nyway....      *
86c0: 2f 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  /.      *ppOrder
86d0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4c  By = 0;.      pL
86e0: 65 76 65 6c 30 2d 3e 62 52 65 76 20 3d 20 62 52  evel0->bRev = bR
86f0: 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ev;.    }else if
8700: 28 20 70 4c 65 76 65 6c 30 2d 3e 73 63 6f 72 65  ( pLevel0->score
8710: 3d 3d 31 36 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ==16 ){.      /*
8720: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
8730: 65 61 64 79 20 61 6e 20 49 4e 20 69 6e 64 65 78  eady an IN index
8740: 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   on the left-mos
8750: 74 20 74 61 62 6c 65 2c 0a 20 20 20 20 20 20 2a  t table,.      *
8760: 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 67 69  * it will not gi
8770: 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 73  ve the correct s
8780: 6f 72 74 20 6f 72 64 65 72 2e 0a 20 20 20 20 20  ort order..     
8790: 20 2a 2a 20 53 6f 2c 20 70 72 65 74 65 6e 64 20   ** So, pretend 
87a0: 74 68 61 74 20 6e 6f 20 73 75 69 74 61 62 6c 65  that no suitable
87b0: 20 69 6e 64 65 78 20 69 73 20 66 6f 75 6e 64 2e   index is found.
87c0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65  .      */.    }e
87d0: 6c 73 65 20 69 66 28 20 69 44 69 72 65 63 74 45  lse if( iDirectE
87e0: 71 5b 30 5d 3e 3d 30 20 7c 7c 20 69 44 69 72 65  q[0]>=0 || iDire
87f0: 63 74 4c 74 5b 30 5d 3e 3d 30 20 7c 7c 20 69 44  ctLt[0]>=0 || iD
8800: 69 72 65 63 74 47 74 5b 30 5d 3e 3d 30 20 29 7b  irectGt[0]>=0 ){
8810: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8820: 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d   left-most colum
8830: 6e 20 69 73 20 61 63 63 65 73 73 65 64 20 75 73  n is accessed us
8840: 69 6e 67 20 69 74 73 20 52 4f 57 49 44 2c 20 74  ing its ROWID, t
8850: 68 65 6e 20 64 6f 0a 20 20 20 20 20 20 2a 2a 20  hen do.      ** 
8860: 6e 6f 74 20 74 72 79 20 74 6f 20 73 6f 72 74 20  not try to sort 
8870: 62 79 20 69 6e 64 65 78 2e 20 20 42 75 74 20 64  by index.  But d
8880: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 4f 52 44  o delete the ORD
8890: 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20  ER BY clause.   
88a0: 20 20 20 2a 2a 20 69 66 20 69 74 20 69 73 20 72     ** if it is r
88b0: 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20 20 20 20  edundant..      
88c0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
88d0: 20 28 70 4c 65 76 65 6c 30 2d 3e 73 63 6f 72 65   (pLevel0->score
88e0: 26 32 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  &2)!=0 ){.      
88f0: 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 74 68 61  /* The index tha
8900: 74 20 77 61 73 20 73 65 6c 65 63 74 65 64 20 66  t was selected f
8910: 6f 72 20 73 65 61 72 63 68 69 6e 67 20 77 69 6c  or searching wil
8920: 6c 20 63 61 75 73 65 20 72 6f 77 73 20 74 6f 0a  l cause rows to.
8930: 20 20 20 20 20 20 2a 2a 20 61 70 70 65 61 72 20        ** appear 
8940: 69 6e 20 73 6f 72 74 65 64 20 6f 72 64 65 72 2e  in sorted order.
8950: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8960: 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
8970: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
8980: 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c 65 73 20  Open all tables 
8990: 69 6e 20 74 68 65 20 70 54 61 62 4c 69 73 74 20  in the pTabList 
89a0: 61 6e 64 20 61 6e 79 20 69 6e 64 69 63 65 73 20  and any indices 
89b0: 73 65 6c 65 63 74 65 64 20 66 6f 72 0a 20 20 2a  selected for.  *
89c0: 2a 20 73 65 61 72 63 68 69 6e 67 20 74 68 6f 73  * searching thos
89d0: 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  e tables..  */. 
89e0: 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69   sqlite3CodeVeri
89f0: 66 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c  fySchema(pParse,
8a00: 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20   -1); /* Insert 
8a10: 74 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66  the cookie verif
8a20: 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 70 4c  ier Goto */.  pL
8a30: 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61  evel = pWInfo->a
8a40: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 54 61  ;.  for(i=0, pTa
8a50: 62 49 74 65 6d 3d 70 54 61 62 4c 69 73 74 2d 3e  bItem=pTabList->
8a60: 61 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  a; i<pTabList->n
8a70: 53 72 63 3b 20 69 2b 2b 2c 20 70 54 61 62 49 74  Src; i++, pTabIt
8a80: 65 6d 2b 2b 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b  em++, pLevel++){
8a90: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
8aa0: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 78  ;.    Index *pIx
8ab0: 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 43 75  ;.    int iIdxCu
8ac0: 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  r = pLevel->iIdx
8ad0: 43 75 72 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d  Cur;..    pTab =
8ae0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
8af0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
8b00: 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54  sTransient || pT
8b10: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
8b20: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
8b30: 28 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26  (pLevel->score &
8b40: 20 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)==0 ){.      
8b50: 73 71 6c 69 74 65 33 4f 70 65 6e 54 61 62 6c 65  sqlite3OpenTable
8b60: 46 6f 72 52 65 61 64 69 6e 67 28 76 2c 20 70 54  ForReading(v, pT
8b70: 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
8b80: 20 70 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20   pTab);.    }.  
8b90: 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61 62 43 75    pLevel->iTabCu
8ba0: 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
8bb0: 75 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 28  ursor;.    if( (
8bc0: 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  pIx = pLevel->pI
8bd0: 64 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  dx)!=0 ){.      
8be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8bf0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8c00: 70 49 78 2d 3e 69 44 62 2c 20 30 29 3b 0a 20 20  pIx->iDb, 0);.  
8c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8c20: 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e 52 65 61  p3(v, OP_OpenRea
8c30: 64 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  d, iIdxCur, pIx-
8c40: 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20 20 20 20  >tnum,.         
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
8c60: 72 2a 29 26 70 49 78 2d 3e 6b 65 79 49 6e 66 6f  r*)&pIx->keyInfo
8c70: 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20  , P3_KEYINFO);. 
8c80: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 70 4c     }.    if( (pL
8c90: 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20 31 29  evel->score & 1)
8ca0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
8cb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8cc0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
8cd0: 73 2c 20 69 49 64 78 43 75 72 2c 20 70 49 78 2d  s, iIdxCur, pIx-
8ce0: 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20  >nColumn+1);.   
8cf0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
8d00: 64 65 56 65 72 69 66 79 53 63 68 65 6d 61 28 70  deVerifySchema(p
8d10: 50 61 72 73 65 2c 20 70 54 61 62 2d 3e 69 44 62  Parse, pTab->iDb
8d20: 29 3b 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d  );.  }.  pWInfo-
8d30: 3e 69 54 6f 70 20 3d 20 73 71 6c 69 74 65 33 56  >iTop = sqlite3V
8d40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
8d50: 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
8d60: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 64 6f  e the code to do
8d70: 20 74 68 65 20 73 65 61 72 63 68 0a 20 20 2a 2f   the search.  */
8d80: 0a 20 20 6c 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b  .  loopMask = 0;
8d90: 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e  .  pLevel = pWIn
8da0: 66 6f 2d 3e 61 3b 0a 20 20 70 54 61 62 49 74 65  fo->a;.  pTabIte
8db0: 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b  m = pTabList->a;
8dc0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
8dd0: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
8de0: 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b 2c 20 70  +, pTabItem++, p
8df0: 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e  Level++){.    in
8e00: 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 69 6e 74 20  t j, k;.    int 
8e10: 69 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  iCur = pTabItem-
8e20: 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68  >iCursor;  /* Th
8e30: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
8e40: 72 20 74 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20  r the table */. 
8e50: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
8e60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64        /* The ind
8e70: 65 78 20 77 65 20 77 69 6c 6c 20 62 65 20 75 73  ex we will be us
8e80: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ing */.    int i
8e90: 49 64 78 43 75 72 3b 20 20 20 20 20 20 20 2f 2a  IdxCur;       /*
8ea0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
8eb0: 20 66 6f 72 20 74 68 65 20 69 6e 64 65 78 20 2a   for the index *
8ec0: 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69 74 54 61  /.    int omitTa
8ed0: 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  ble;     /* True
8ee0: 20 69 66 20 77 65 20 75 73 65 20 74 68 65 20 69   if we use the i
8ef0: 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20  ndex only */..  
8f00: 20 20 70 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d    pIdx = pLevel-
8f10: 3e 70 49 64 78 3b 0a 20 20 20 20 69 49 64 78 43  >pIdx;.    iIdxC
8f20: 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64  ur = pLevel->iId
8f30: 78 43 75 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c  xCur;.    pLevel
8f40: 2d 3e 69 6e 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  ->inOp = OP_Noop
8f50: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
8f60: 74 6f 20 73 65 65 20 69 66 20 69 74 20 69 73 20  to see if it is 
8f70: 61 70 70 72 6f 70 72 69 61 74 65 20 74 6f 20 6f  appropriate to o
8f80: 6d 69 74 20 74 68 65 20 75 73 65 20 6f 66 20 74  mit the use of t
8f90: 68 65 20 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20  he table.    ** 
8fa0: 68 65 72 65 20 61 6e 64 20 75 73 65 20 69 74 73  here and use its
8fb0: 20 69 6e 64 65 78 20 69 6e 73 74 65 61 64 2e 0a   index instead..
8fc0: 20 20 20 20 2a 2f 0a 20 20 20 20 6f 6d 69 74 54      */.    omitT
8fd0: 61 62 6c 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e  able = (pLevel->
8fe0: 73 63 6f 72 65 26 31 29 21 3d 30 3b 0a 0a 20 20  score&1)!=0;..  
8ff0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
9000: 74 68 65 20 72 69 67 68 74 20 74 61 62 6c 65 20  the right table 
9010: 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20  of a LEFT OUTER 
9020: 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61  JOIN, allocate a
9030: 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69 74 69 61  nd.    ** initia
9040: 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79 20 63 65  lize a memory ce
9050: 6c 6c 20 74 68 61 74 20 72 65 63 6f 72 64 73 20  ll that records 
9060: 69 66 20 74 68 69 73 20 74 61 62 6c 65 20 6d 61  if this table ma
9070: 74 63 68 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a  tches any.    **
9080: 20 72 6f 77 20 6f 66 20 74 68 65 20 6c 65 66 74   row of the left
9090: 20 74 61 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f   table of the jo
90a0: 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  in..    */.    i
90b0: 66 28 20 69 3e 30 20 26 26 20 28 70 54 61 62 4c  f( i>0 && (pTabL
90c0: 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e  ist->a[i-1].join
90d0: 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29 21  type & JT_LEFT)!
90e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
90f0: 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20  !pParse->nMem ) 
9100: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
9110: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c        pLevel->iL
9120: 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65  eftJoin = pParse
9130: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
9140: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9150: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20  (v, OP_Null, 0, 
9160: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9170: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9180: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
9190: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 31 29  l->iLeftJoin, 1)
91a0: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
91b0: 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20  ent((v, "# init 
91c0: 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
91d0: 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  ch flag"));.    
91e0: 7d 0a 0a 20 20 20 20 69 66 28 20 69 3c 41 52 52  }..    if( i<ARR
91f0: 41 59 53 49 5a 45 28 69 44 69 72 65 63 74 45 71  AYSIZE(iDirectEq
9200: 29 20 26 26 20 28 6b 20 3d 20 69 44 69 72 65 63  ) && (k = iDirec
9210: 74 45 71 5b 69 5d 29 3e 3d 30 20 29 7b 0a 20 20  tEq[i])>=0 ){.  
9220: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
9230: 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
9240: 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
9250: 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
9260: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
9270: 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
9280: 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
9290: 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
92a0: 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  Or.      **     
92b0: 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
92c0: 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
92d0: 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
92e0: 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a  N (...)".      *
92f0: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
9300: 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ruct..      */. 
9310: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
9320: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 70 54  Expr );.      pT
9330: 65 72 6d 20 3d 20 26 61 45 78 70 72 5b 6b 5d 3b  erm = &aExpr[k];
9340: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9350: 54 65 72 6d 2d 3e 70 21 3d 30 20 29 3b 0a 20 20  Term->p!=0 );.  
9360: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
9370: 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72  m->idxLeft==iCur
9380: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9390: 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
93a0: 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c  ;.      brk = pL
93b0: 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69  evel->brk = sqli
93c0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
93d0: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  (v);.      codeE
93e0: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
93f0: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
9400: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 63  pLevel);.      c
9410: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
9420: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
9430: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
9440: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9450: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
9460: 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20  eInt, 1, brk);. 
9470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45  AddOp(v, OP_NotE
9490: 78 69 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b  xists, iCur, brk
94a0: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
94b0: 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
94c0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
94d0: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
94e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 64 78 21   }else if( pIdx!
94f0: 3d 30 20 26 26 20 70 4c 65 76 65 6c 2d 3e 73 63  =0 && pLevel->sc
9500: 6f 72 65 3e 33 20 26 26 20 28 70 4c 65 76 65 6c  ore>3 && (pLevel
9510: 2d 3e 73 63 6f 72 65 26 30 78 30 63 29 3d 3d 30  ->score&0x0c)==0
9520: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
9530: 65 20 32 3a 20 20 54 68 65 72 65 20 69 73 20 61  e 2:  There is a
9540: 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20  n index and all 
9550: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
9560: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20  RE clause that. 
9570: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
9580: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e   refer to the in
9590: 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d  dex using the "=
95a0: 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
95b0: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tors..      */. 
95c0: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
95d0: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 75 6d        int nColum
95e0: 6e 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 73 63 6f  n = (pLevel->sco
95f0: 72 65 2b 31 36 29 2f 33 32 3b 0a 20 20 20 20 20  re+16)/32;.     
9600: 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
9610: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
9620: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
9630: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
9640: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
9650: 6e 64 65 78 2c 20 66 69 6e 64 20 74 68 65 20 74  ndex, find the t
9660: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
9670: 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20   clause that.   
9680: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
9690: 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 20  s that column.  
96a0: 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
96b0: 75 73 65 20 74 65 72 6d 20 69 73 20 58 3d 65 78  use term is X=ex
96c0: 70 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  pr, then.      *
96d0: 2a 20 65 76 61 6c 75 61 74 69 6f 6e 20 65 78 70  * evaluation exp
96e0: 72 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  r and leave the 
96f0: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 73 74  result on the st
9700: 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ack */.      for
9710: 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
9720: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
9730: 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20  or(pTerm=aExpr, 
9740: 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b  k=0; k<nExpr; k+
9750: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
9760: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
9770: 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20  = pTerm->p;.    
9780: 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20        if( pX==0 
9790: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
97a0: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
97b0: 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20  >idxLeft==iCur. 
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
97d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
97e0: 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d  ht & loopMask)==
97f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9800: 68 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht .            
9810: 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69   && pX->pLeft->i
9820: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
9830: 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20  Column[j].      
9840: 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e 6f         && (pX->o
9850: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 58 2d 3e  p==TK_EQ || pX->
9860: 6f 70 3d 3d 54 4b 5f 49 4e 29 0a 20 20 20 20 20  op==TK_IN).     
9870: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
9880: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
9890: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
98a0: 61 43 6f 6c 5b 70 58 2d 3e 70 4c 65 66 74 2d 3e  aCol[pX->pLeft->
98b0: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
98c0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
98d0: 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  f( sqlite3IndexA
98e0: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
98f0: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
9900: 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
9910: 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
9920: 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76  pTerm, brk, pLev
9930: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  el);.           
9940: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9960: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9970: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
9980: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
9990: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
99a0: 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
99b0: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
99c0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
99d0: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
99e0: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 75 6d 6e  Probe(v, nColumn
99f0: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
9a00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9a20: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
9a30: 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
9a40: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
9a50: 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
9a60: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
9a70: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9a80: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
9a90: 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
9aa0: 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
9ab0: 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
9ac0: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
9ad0: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
9ae0: 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
9af0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
9b00: 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
9b10: 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
9b20: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
9b30: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
9b40: 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
9b50: 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
9b60: 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
9b70: 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
9b80: 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
9b90: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
9ba0: 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
9bb0: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
9bc0: 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
9bd0: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
9be0: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  rse order */.   
9bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9c00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
9c10: 4c 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Le, iIdxCur, brk
9c20: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
9c30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9c40: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
9c50: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
9c60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
9c70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9c80: 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43   OP_IdxLT, iIdxC
9c90: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
9ca0: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
9cb0: 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  P_Prev;.      }e
9cc0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9cd0: 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77  Scan in the forw
9ce0: 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ard order */.   
9cf0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9d00: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
9d10: 47 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Ge, iIdxCur, brk
9d20: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
9d30: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9d40: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
9d50: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
9d60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
9d70: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
9d80: 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72  P_IdxGE, iIdxCur
9d90: 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33 5f 53  , brk, "+", P3_S
9da0: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9db0: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
9dc0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
9dd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9de0: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
9df0: 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  y, iIdxCur, 0);.
9e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9e10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
9e20: 49 73 4e 75 6c 6c 2c 20 6e 43 6f 6c 75 6d 6e 2c  IsNull, nColumn,
9e30: 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
9e40: 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
9e50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9e60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9e70: 64 78 52 6f 77 69 64 2c 20 69 49 64 78 43 75 72  dxRowid, iIdxCur
9e80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
9e90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9ea0: 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
9eb0: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
9ec0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
9ed0: 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
9ee0: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
9ef0: 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  art;.    }else i
9f00: 66 28 20 69 3c 41 52 52 41 59 53 49 5a 45 28 69  f( i<ARRAYSIZE(i
9f10: 44 69 72 65 63 74 4c 74 29 20 26 26 20 28 69 44  DirectLt) && (iD
9f20: 69 72 65 63 74 4c 74 5b 69 5d 3e 3d 30 20 7c 7c  irectLt[i]>=0 ||
9f30: 20 69 44 69 72 65 63 74 47 74 5b 69 5d 3e 3d 30   iDirectGt[i]>=0
9f40: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  ) ){.      /* Ca
9f50: 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61  se 3:  We have a
9f60: 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
9f70: 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
9f80: 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
9f90: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9fa0: 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
9fb0: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Noop;.      int 
9fc0: 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
9fd0: 20 62 52 65 76 20 3d 20 70 4c 65 76 65 6c 2d 3e   bRev = pLevel->
9fe0: 62 52 65 76 3b 0a 0a 20 20 20 20 20 20 61 73 73  bRev;..      ass
9ff0: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
a000: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d  0 );.      brk =
a010: 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73   pLevel->brk = s
a020: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a030: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
a040: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
a050: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
a060: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a070: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
a080: 20 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20 69         int t = i
a090: 44 69 72 65 63 74 47 74 5b 69 5d 3b 0a 20 20 20  DirectGt[i];.   
a0a0: 20 20 20 20 20 69 44 69 72 65 63 74 47 74 5b 69       iDirectGt[i
a0b0: 5d 20 3d 20 69 44 69 72 65 63 74 4c 74 5b 69 5d  ] = iDirectLt[i]
a0c0: 3b 0a 20 20 20 20 20 20 20 20 69 44 69 72 65 63  ;.        iDirec
a0d0: 74 4c 74 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20  tLt[i] = t;.    
a0e0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 44    }.      if( iD
a0f0: 69 72 65 63 74 47 74 5b 69 5d 3e 3d 30 20 29 7b  irectGt[i]>=0 ){
a100: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
a110: 58 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 69  X;.        k = i
a120: 44 69 72 65 63 74 47 74 5b 69 5d 3b 0a 20 20 20  DirectGt[i];.   
a130: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
a140: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
a150: 70 54 65 72 6d 20 3d 20 26 61 45 78 70 72 5b 6b  pTerm = &aExpr[k
a160: 5d 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  ];.        pX = 
a170: 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20  pTerm->p;.      
a180: 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
a190: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a1a0: 74 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66  t( pTerm->idxLef
a1b0: 74 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  t==iCur );.     
a1c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a1d0: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
a1e0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
a1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a200: 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c  (v, OP_ForceInt,
a210: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c   pX->op==TK_LE |
a220: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c  | pX->op==TK_GT,
a230: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
a240: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a250: 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76  v, bRev ? OP_Mov
a260: 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c  eLt : OP_MoveGe,
a270: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
a280: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
a290: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
a2a0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
a2b0: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
a2c0: 3e 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >p);.      }else
a2d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a2e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52  3VdbeAddOp(v, bR
a2f0: 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
a300: 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
a310: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
a320: 20 20 20 20 69 66 28 20 69 44 69 72 65 63 74 4c      if( iDirectL
a330: 74 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]>=0 ){.     
a340: 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
a350: 20 20 20 20 20 6b 20 3d 20 69 44 69 72 65 63 74       k = iDirect
a360: 4c 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  Lt[i];.        a
a370: 73 73 65 72 74 28 20 6b 3c 6e 45 78 70 72 20 29  ssert( k<nExpr )
a380: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
a390: 3d 20 26 61 45 78 70 72 5b 6b 5d 3b 0a 20 20 20  = &aExpr[k];.   
a3a0: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
a3b0: 3e 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  >p;.        asse
a3c0: 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
a3d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
a3e0: 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75  rm->idxLeft==iCu
a3f0: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
a400: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a410: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
a420: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
a430: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
a440: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
a450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a460: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
a470: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
a480: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
a490: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
a4a0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
a4b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
a4c0: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
a4d0: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
a4e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a4f0: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
a500: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
a510: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a520: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
a530: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
a540: 3e 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >p);.      }.   
a550: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
a560: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a570: 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  r(v);.      pLev
a580: 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
a590: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
a5a0: 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
a5b0: 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
a5c0: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
a5d0: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  tart;.      if( 
a5e0: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
a5f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a600: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a610: 50 5f 52 6f 77 69 64 2c 20 69 43 75 72 2c 20 30  P_Rowid, iCur, 0
a620: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a630: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a640: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
a650: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
a660: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a670: 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c  AddOp(v, testOp,
a680: 20 27 6e 27 2c 20 62 72 6b 29 3b 0a 20 20 20 20   'n', brk);.    
a690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
a6a0: 28 20 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pIdx==0 ){.   
a6b0: 20 20 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54     /* Case 4:  T
a6c0: 68 65 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c  here is no usabl
a6d0: 65 20 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73  e index.  We mus
a6e0: 74 20 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a  t do a complete.
a6f0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
a700: 20 20 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e    scan of the en
a710: 74 69 72 65 20 64 61 74 61 62 61 73 65 20 74 61  tire database ta
a720: 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ble..      */.  
a730: 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20      int start;. 
a740: 20 20 20 20 20 69 6e 74 20 6f 70 52 65 77 69 6e       int opRewin
a750: 64 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  d;..      assert
a760: 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
a770: 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c  ;.      brk = pL
a780: 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69  evel->brk = sqli
a790: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
a7a0: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 20  (v);.      cont 
a7b0: 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
a7c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
a7d0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
a7e0: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76  if( pLevel->bRev
a7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 70 52 65   ){.        opRe
a800: 77 69 6e 64 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a  wind = OP_Last;.
a810: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
a820: 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
a830: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a840: 20 20 20 6f 70 52 65 77 69 6e 64 20 3d 20 4f 50     opRewind = OP
a850: 5f 52 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 20  _Rewind;.       
a860: 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50   pLevel->op = OP
a870: 5f 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _Next;.      }. 
a880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a890: 41 64 64 4f 70 28 76 2c 20 6f 70 52 65 77 69 6e  AddOp(v, opRewin
a8a0: 64 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20  d, iCur, brk);. 
a8b0: 20 20 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c       start = sql
a8c0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
a8d0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c  ddr(v);.      pL
a8e0: 65 76 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b  evel->p1 = iCur;
a8f0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
a900: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
a910: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43  else{.      /* C
a920: 61 73 65 20 35 3a 20 54 68 65 20 57 48 45 52 45  ase 5: The WHERE
a930: 20 63 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61   clause term tha
a940: 74 20 72 65 66 65 72 73 20 74 6f 20 74 68 65 20  t refers to the 
a950: 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20  right-most.     
a960: 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75   **         colu
a970: 6d 6e 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  mn of the index 
a980: 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79  is an inequality
a990: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
a9a0: 69 66 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  if.      **     
a9b0: 20 20 20 20 74 68 65 20 69 6e 64 65 78 20 69 73      the index is
a9c0: 20 6f 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20   on (x,y,z) and 
a9d0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
a9e0: 20 69 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20   is of the.     
a9f0: 20 2a 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d   **         form
aa00: 20 22 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20   "x=5 AND y<10" 
aa10: 74 68 65 6e 20 74 68 69 73 20 63 61 73 65 20 69  then this case i
aa20: 73 20 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68  s used.  Only th
aa30: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
aa40: 20 20 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f     right-most co
aa50: 6c 75 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69  lumn can be an i
aa60: 6e 65 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20  nequality - the 
aa70: 72 65 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20  rest must.      
aa80: 2a 2a 20 20 20 20 20 20 20 20 20 75 73 65 20 74  **         use t
aa90: 68 65 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72  he "==" operator
aaa0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
aab0: 20 2a 2a 20 20 20 20 20 20 20 20 20 54 68 69 73   **         This
aac0: 20 63 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73   case is also us
aad0: 65 64 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ed when there ar
aae0: 65 20 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73  e no WHERE claus
aaf0: 65 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  e.      **      
ab00: 20 20 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62     constraints b
ab10: 75 74 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73  ut an index is s
ab20: 65 6c 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20  elected anyway, 
ab30: 69 6e 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a  in order.      *
ab40: 2a 20 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72  *         to for
ab50: 63 65 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72  ce the output or
ab60: 64 65 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74  der to conform t
ab70: 6f 20 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20  o an ORDER BY.. 
ab80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ab90: 74 20 73 63 6f 72 65 20 3d 20 70 4c 65 76 65 6c  t score = pLevel
aba0: 2d 3e 73 63 6f 72 65 3b 0a 20 20 20 20 20 20 69  ->score;.      i
abb0: 6e 74 20 6e 45 71 43 6f 6c 75 6d 6e 20 3d 20 73  nt nEqColumn = s
abc0: 63 6f 72 65 2f 33 32 3b 0a 20 20 20 20 20 20 69  core/32;.      i
abd0: 6e 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20  nt start;.      
abe0: 69 6e 74 20 6c 65 46 6c 61 67 3d 30 2c 20 67 65  int leFlag=0, ge
abf0: 46 6c 61 67 3d 30 3b 0a 20 20 20 20 20 20 69 6e  Flag=0;.      in
ac00: 74 20 74 65 73 74 4f 70 3b 0a 0a 20 20 20 20 20  t testOp;..     
ac10: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
ac20: 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72   equality constr
ac30: 61 69 6e 74 73 0a 20 20 20 20 20 20 2a 2f 0a 20  aints.      */. 
ac40: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
ac50: 6e 45 71 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b  nEqColumn; j++){
ac60: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 49 64  .        int iId
ac70: 78 43 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43  xCol = pIdx->aiC
ac80: 6f 6c 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20  olumn[j];.      
ac90: 20 20 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70    for(pTerm=aExp
aca0: 72 2c 20 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b  r, k=0; k<nExpr;
acb0: 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a   k++, pTerm++){.
acc0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
acd0: 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20  pX = pTerm->p;. 
ace0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 58 3d           if( pX=
acf0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
ad00: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65           if( pTe
ad10: 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75  rm->idxLeft==iCu
ad20: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  r.             &
ad30: 26 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a  & pX->op==TK_EQ.
ad40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
ad50: 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  (pTerm->prereqRi
ad60: 67 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d  ght & loopMask)=
ad70: 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69  =pTerm->prereqRi
ad80: 67 68 74 20 0a 20 20 20 20 20 20 20 20 20 20 20  ght .           
ad90: 20 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e    && pX->pLeft->
ada0: 69 43 6f 6c 75 6d 6e 3d 3d 69 49 64 78 43 6f 6c  iColumn==iIdxCol
adb0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
adc0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
add0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ade0: 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20  , pX->pRight);. 
adf0: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 61 62             disab
ae00: 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26  leTerm(pLevel, &
ae10: 70 54 65 72 6d 2d 3e 70 29 3b 0a 20 20 20 20 20  pTerm->p);.     
ae20: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ae30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae40: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
ae50: 20 20 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20     /* Duplicate 
ae60: 74 68 65 20 65 71 75 61 6c 69 74 79 20 74 65 72  the equality ter
ae70: 6d 20 76 61 6c 75 65 73 20 62 65 63 61 75 73 65  m values because
ae80: 20 74 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62   they will all b
ae90: 65 0a 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20  e.      ** used 
aea0: 74 77 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d  twice: once to m
aeb0: 61 6b 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ake the terminat
aec0: 69 6f 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65  ion key and once
aed0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20   to make the.   
aee0: 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e     ** start key.
aef0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
af00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 43 6f  for(j=0; j<nEqCo
af10: 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  lumn; j++){.    
af20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
af30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
af40: 6e 45 71 43 6f 6c 75 6d 6e 2d 31 2c 20 30 29 3b  nEqColumn-1, 0);
af50: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
af60: 2f 2a 20 4c 61 62 65 6c 73 20 66 6f 72 20 74 68  /* Labels for th
af70: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20  e beginning and 
af80: 65 6e 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a  end of the loop.
af90: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63        */.      c
afa0: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
afb0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
afc0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
afd0: 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c      brk = pLevel
afe0: 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56  ->brk = sqlite3V
aff0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
b000: 0a 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72  ..      /* Gener
b010: 61 74 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74  ate the terminat
b020: 69 6f 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69  ion key.  This i
b030: 73 20 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20  s the key value 
b040: 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69  that.      ** wi
b050: 6c 6c 20 65 6e 64 20 74 68 65 20 73 65 61 72 63  ll end the searc
b060: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
b070: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20  termination key 
b080: 69 66 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a  if there.      *
b090: 2a 20 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74  * are no equalit
b0a0: 79 20 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22  y terms and no "
b0b0: 58 3c 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20  X<..." term..   
b0c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32     **.      ** 2
b0d0: 30 30 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61  002-Dec-04: On a
b0e0: 20 72 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73   reverse-order s
b0f0: 63 61 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c  can, the so-call
b100: 65 64 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22  ed "termination"
b110: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f  .      ** key co
b120: 6d 70 75 74 65 64 20 68 65 72 65 20 72 65 61 6c  mputed here real
b130: 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  ly ends up being
b140: 20 74 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a   the start key..
b150: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
b160: 66 28 20 28 73 63 6f 72 65 20 26 20 34 29 21 3d  f( (score & 4)!=
b170: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
b180: 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6b 3d  (pTerm=aExpr, k=
b190: 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b 2b 2c  0; k<nExpr; k++,
b1a0: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
b1b0: 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20       Expr *pX = 
b1c0: 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20  pTerm->p;.      
b1d0: 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20      if( pX==0 ) 
b1e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
b1f0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69      if( pTerm->i
b200: 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20 20  dxLeft==iCur.   
b210: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58            && (pX
b220: 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70  ->op==TK_LT || p
b230: 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 0a 20 20  X->op==TK_LE).  
b240: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
b250: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b260: 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70  t & loopMask)==p
b270: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
b280: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
b290: 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  && pX->pLeft->iC
b2a0: 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43  olumn==pIdx->aiC
b2b0: 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20 20  olumn[j].       
b2c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
b2d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b2e0: 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52  e(pParse, pX->pR
b2f0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ight);.         
b300: 20 20 20 6c 65 46 6c 61 67 20 3d 20 70 58 2d 3e     leFlag = pX->
b310: 6f 70 3d 3d 54 4b 5f 4c 45 3b 0a 20 20 20 20 20  op==TK_LE;.     
b320: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
b330: 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72  rm(pLevel, &pTer
b340: 6d 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 20  m->p);.         
b350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b360: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
b370: 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d          testOp =
b380: 20 4f 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20   OP_IdxGE;.     
b390: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b3a0: 74 65 73 74 4f 70 20 3d 20 6e 45 71 43 6f 6c 75  testOp = nEqColu
b3b0: 6d 6e 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20  mn>0 ? OP_IdxGE 
b3c0: 3a 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20  : OP_Noop;.     
b3d0: 20 20 20 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20     leFlag = 1;. 
b3e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
b3f0: 20 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70   testOp!=OP_Noop
b400: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
b410: 6e 43 6f 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e  nCol = nEqColumn
b420: 20 2b 20 28 28 73 63 6f 72 65 20 26 20 34 29 21   + ((score & 4)!
b430: 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65  =0);.        pLe
b440: 76 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72  vel->iMem = pPar
b450: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
b460: 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72      buildIndexPr
b470: 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b  obe(v, nCol, brk
b480: 2c 20 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20  , pIdx);.       
b490: 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65   if( pLevel->bRe
b4a0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  v ){.          i
b4b0: 6e 74 20 6f 70 20 3d 20 6c 65 46 6c 61 67 20 3f  nt op = leFlag ?
b4c0: 20 4f 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f   OP_MoveLe : OP_
b4d0: 4d 6f 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20  MoveLt;.        
b4e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b4f0: 4f 70 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75  Op(v, op, iIdxCu
b500: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
b510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b530: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
b540: 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  e, pLevel->iMem,
b550: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
b560: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
b570: 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29 7b 0a 20  Level->bRev ){. 
b580: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61  beAddOp(v, OP_La
b5a0: 73 74 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  st, iIdxCur, brk
b5b0: 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
b5c0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
b5d0: 65 20 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68  e start key.  Th
b5e0: 69 73 20 69 73 20 74 68 65 20 6b 65 79 20 74 68  is is the key th
b5f0: 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c  at defines the l
b600: 6f 77 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f  ower.      ** bo
b610: 75 6e 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63  und on the searc
b620: 68 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  h.  There is no 
b630: 73 74 61 72 74 20 6b 65 79 20 69 66 20 74 68 65  start key if the
b640: 72 65 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20  re are no.      
b650: 2a 2a 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d  ** equality term
b660: 73 20 61 6e 64 20 69 66 20 74 68 65 72 65 20 69  s and if there i
b670: 73 20 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72  s no "X>..." ter
b680: 6d 2e 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20  m.  In.      ** 
b690: 74 68 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72  that case, gener
b6a0: 61 74 65 20 61 20 22 52 65 77 69 6e 64 22 20 69  ate a "Rewind" i
b6b0: 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c  nstruction in pl
b6c0: 61 63 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20  ace of the.     
b6d0: 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65   ** start key se
b6e0: 61 72 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  arch..      **. 
b6f0: 20 20 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63       ** 2002-Dec
b700: 2d 30 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65  -04: In the case
b710: 20 6f 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72   of a reverse-or
b720: 64 65 72 20 73 65 61 72 63 68 2c 20 74 68 65 20  der search, the 
b730: 73 6f 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20  so-called.      
b740: 2a 2a 20 22 73 74 61 72 74 22 20 6b 65 79 20 72  ** "start" key r
b750: 65 61 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65  eally ends up be
b760: 69 6e 67 20 75 73 65 64 20 61 73 20 74 68 65 20  ing used as the 
b770: 74 65 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e  termination key.
b780: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b790: 69 66 28 20 28 73 63 6f 72 65 20 26 20 38 29 21  if( (score & 8)!
b7a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  =0 ){.        fo
b7b0: 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6b  r(pTerm=aExpr, k
b7c0: 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b 2b  =0; k<nExpr; k++
b7d0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
b7e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
b7f0: 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20   pTerm->p;.     
b800: 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
b810: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b820: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
b830: 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20  idxLeft==iCur.  
b840: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
b850: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  X->op==TK_GT || 
b860: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 0a 20  pX->op==TK_GE). 
b870: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
b880: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
b890: 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d  ht & loopMask)==
b8a0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
b8b0: 68 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht .            
b8c0: 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69   && pX->pLeft->i
b8d0: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
b8e0: 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20  Column[j].      
b8f0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
b900: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b910: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
b920: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
b930: 20 20 20 20 67 65 46 6c 61 67 20 3d 20 70 58 2d      geFlag = pX-
b940: 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20 20 20 20  >op==TK_GE;.    
b950: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
b960: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54 65  erm(pLevel, &pTe
b970: 72 6d 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20  rm->p);.        
b980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
b9a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
b9b0: 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20 31        geFlag = 1
b9c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b9d0: 69 66 28 20 6e 45 71 43 6f 6c 75 6d 6e 3e 30 20  if( nEqColumn>0 
b9e0: 7c 7c 20 28 73 63 6f 72 65 26 38 29 21 3d 30 20  || (score&8)!=0 
b9f0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
ba00: 43 6f 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20  Col = nEqColumn 
ba10: 2b 20 28 28 73 63 6f 72 65 26 38 29 21 3d 30 29  + ((score&8)!=0)
ba20: 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49  ;.        buildI
ba30: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f  ndexProbe(v, nCo
ba40: 6c 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  l, brk, pIdx);. 
ba50: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65         if( pLeve
ba60: 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  l->bRev ){.     
ba70: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
ba80: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
ba90: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
baa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bab0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
bac0: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
bad0: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f  .          testO
bae0: 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20  p = OP_IdxLT;.  
baf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
bb00: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
bb10: 67 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65  geFlag ? OP_Move
bb20: 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Ge : OP_MoveGt;.
bb30: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
bb40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
bb50: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
bb60: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bb70: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
bb80: 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  l->bRev ){.     
bb90: 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e     testOp = OP_N
bba0: 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oop;.      }else
bbb0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
bbc0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bbd0: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
bbe0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
bbf0: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
bc00: 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f  te the the top o
bc10: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
bc20: 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69  there is a termi
bc30: 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
bc40: 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74  key we have to t
bc50: 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79  est for that key
bc60: 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68   and abort at th
bc70: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20  e top of the.   
bc80: 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
bc90: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74    */.      start
bca0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
bcb0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
bcc0: 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
bcd0: 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
bce0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bcf0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
bd00: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
bd10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
bd20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bd30: 20 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72   testOp, iIdxCur
bd40: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
bd50: 69 66 28 20 28 6c 65 46 6c 61 67 20 26 26 20 21  if( (leFlag && !
bd60: 70 4c 65 76 65 6c 2d 3e 62 52 65 76 29 20 7c 7c  pLevel->bRev) ||
bd70: 20 28 21 67 65 46 6c 61 67 20 26 26 20 70 4c 65   (!geFlag && pLe
bd80: 76 65 6c 2d 3e 62 52 65 76 29 20 29 7b 0a 20 20  vel->bRev) ){.  
bd90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bda0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
bdb0: 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  1, "+", P3_STATI
bdc0: 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
bdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
bde0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bdf0: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
be00: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
be10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
be20: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
be30: 6e 45 71 43 6f 6c 75 6d 6e 20 2b 20 28 28 73 63  nEqColumn + ((sc
be40: 6f 72 65 26 34 29 21 3d 30 29 2c 20 63 6f 6e 74  ore&4)!=0), cont
be50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
be60: 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
be70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
be80: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
be90: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
bea0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
beb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bec0: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
bed0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
bee0: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
bef0: 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
bf00: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
bf10: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
bf20: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
bf30: 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20   = pLevel->bRev 
bf40: 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
bf50: 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
bf60: 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
bf70: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
bf80: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
bf90: 0a 20 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c 3d  .    loopMask |=
bfa0: 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
bfb0: 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
bfc0: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
bfd0: 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
bfe0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
bff0: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
c000: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
c010: 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
c020: 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
c030: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
c040: 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a 3d  (pTerm=aExpr, j=
c050: 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 2c  0; j<nExpr; j++,
c060: 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20   pTerm++){.     
c070: 20 69 66 28 20 70 54 65 72 6d 2d 3e 70 3d 3d 30   if( pTerm->p==0
c080: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
c090: 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70     if( (pTerm->p
c0a0: 72 65 72 65 71 41 6c 6c 20 26 20 6c 6f 6f 70 4d  rereqAll & loopM
c0b0: 61 73 6b 29 21 3d 70 54 65 72 6d 2d 3e 70 72 65  ask)!=pTerm->pre
c0c0: 72 65 71 41 6c 6c 20 29 20 63 6f 6e 74 69 6e 75  reqAll ) continu
c0d0: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65  e;.      if( pLe
c0e0: 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26  vel->iLeftJoin &
c0f0: 26 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  & !ExprHasProper
c100: 74 79 28 70 54 65 72 6d 2d 3e 70 2c 45 50 5f 46  ty(pTerm->p,EP_F
c110: 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20  romJoin) ){.    
c120: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
c130: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c140: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
c150: 50 61 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 2c  Parse, pTerm->p,
c160: 20 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20   cont, 1);.     
c170: 20 70 54 65 72 6d 2d 3e 70 20 3d 20 30 3b 0a 20   pTerm->p = 0;. 
c180: 20 20 20 7d 0a 20 20 20 20 62 72 6b 20 3d 20 63     }.    brk = c
c190: 6f 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  ont;..    /* For
c1a0: 20 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f   a LEFT OUTER JO
c1b0: 49 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64  IN, generate cod
c1c0: 65 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f  e that will reco
c1d0: 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
c1e0: 0a 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74  .    ** at least
c1f0: 20 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20   one row of the 
c200: 72 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20  right table has 
c210: 6d 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74  matched the left
c220: 20 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f   table.  .    */
c230: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
c240: 3e 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20  >iLeftJoin ){.  
c250: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20      pLevel->top 
c260: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c270: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
c280: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c290: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
c2a0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
c2b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2c0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
c2d0: 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f   pLevel->iLeftJo
c2e0: 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64  in, 1);.      Vd
c2f0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23  beComment((v, "#
c300: 20 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49   record LEFT JOI
c310: 4e 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20  N hit"));.      
c320: 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c  for(pTerm=aExpr,
c330: 20 6a 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a   j=0; j<nExpr; j
c340: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
c350: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
c360: 3e 70 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  >p==0 ) continue
c370: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  ;.        if( (p
c380: 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20  Term->prereqAll 
c390: 26 20 6c 6f 6f 70 4d 61 73 6b 29 21 3d 70 54 65  & loopMask)!=pTe
c3a0: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 29 20  rm->prereqAll ) 
c3b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c3c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
c3d0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65  alse(pParse, pTe
c3e0: 72 6d 2d 3e 70 2c 20 63 6f 6e 74 2c 20 31 29 3b  rm->p, cont, 1);
c3f0: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e  .        pTerm->
c400: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  p = 0;.      }. 
c410: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66     }.  }.  pWInf
c420: 6f 2d 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63  o->iContinue = c
c430: 6f 6e 74 3b 0a 20 20 66 72 65 65 4d 61 73 6b 53  ont;.  freeMaskS
c440: 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20  et(&maskSet);.  
c450: 72 65 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 7d  return pWInfo;.}
c460: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
c470: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c480: 57 48 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65  WHERE loop.  See
c490: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a   comments on .**
c4a0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
c4b0: 69 6e 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  in() for additio
c4c0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
c4d0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
c4e0: 57 68 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e  WhereEnd(WhereIn
c4f0: 66 6f 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56  fo *pWInfo){.  V
c500: 64 62 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d  dbe *v = pWInfo-
c510: 3e 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a  >pParse->pVdbe;.
c520: 20 20 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65    int i;.  Where
c530: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20  Level *pLevel;. 
c540: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
c550: 73 74 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61  st = pWInfo->pTa
c560: 62 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  bList;.  struct 
c570: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54  SrcList_item *pT
c580: 61 62 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 47 65  abItem;..  /* Ge
c590: 6e 65 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d  nerate loop term
c5a0: 69 6e 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20  ination code..  
c5b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c  */.  for(i=pTabL
c5c0: 69 73 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d  ist->nSrc-1; i>=
c5d0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65  0; i--){.    pLe
c5e0: 76 65 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  vel = &pWInfo->a
c5f0: 5b 69 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  [i];.    sqlite3
c600: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c610: 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74  (v, pLevel->cont
c620: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65  );.    if( pLeve
c630: 6c 2d 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  l->op!=OP_Noop )
c640: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c650: 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76  dbeAddOp(v, pLev
c660: 65 6c 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e  el->op, pLevel->
c670: 70 31 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b  p1, pLevel->p2);
c680: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
c690: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
c6a0: 65 6c 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72  el(v, pLevel->br
c6b0: 6b 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76  k);.    if( pLev
c6c0: 65 6c 2d 3e 69 6e 4f 70 21 3d 4f 50 5f 4e 6f 6f  el->inOp!=OP_Noo
c6d0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
c6e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70  e3VdbeAddOp(v, p
c6f0: 4c 65 76 65 6c 2d 3e 69 6e 4f 70 2c 20 70 4c 65  Level->inOp, pLe
c700: 76 65 6c 2d 3e 69 6e 50 31 2c 20 70 4c 65 76 65  vel->inP1, pLeve
c710: 6c 2d 3e 69 6e 50 32 29 3b 0a 20 20 20 20 7d 0a  l->inP2);.    }.
c720: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
c730: 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
c740: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
c750: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c760: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c770: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c  _MemLoad, pLevel
c780: 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b  ->iLeftJoin, 0);
c790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c7a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
c7b0: 74 4e 75 6c 6c 2c 20 31 2c 20 61 64 64 72 2b 34  tNull, 1, addr+4
c7c0: 20 2b 20 28 70 4c 65 76 65 6c 2d 3e 69 49 64 78   + (pLevel->iIdx
c7d0: 43 75 72 3e 3d 30 29 29 3b 0a 20 20 20 20 20 20  Cur>=0));.      
c7e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c7f0: 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20  (v, OP_NullRow, 
c800: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pTabList->a[i].i
c810: 43 75 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20  Cursor, 0);.    
c820: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49    if( pLevel->iI
c830: 64 78 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20  dxCur>=0 ){.    
c840: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c850: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52  ddOp(v, OP_NullR
c860: 6f 77 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  ow, pLevel->iIdx
c870: 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Cur, 0);.      }
c880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c890: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
c8a0: 74 6f 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74  to, 0, pLevel->t
c8b0: 6f 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  op);.    }.  }..
c8c0: 20 20 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22    /* The "break"
c8d0: 20 70 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20   point is here, 
c8e0: 6a 75 73 74 20 70 61 73 74 20 74 68 65 20 65 6e  just past the en
c8f0: 64 20 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c  d of the outer l
c900: 6f 6f 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74  oop..  ** Set it
c910: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
c920: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c930: 28 76 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65  (v, pWInfo->iBre
c940: 61 6b 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65  ak);..  /* Close
c950: 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73   all of the curs
c960: 6f 72 73 20 74 68 61 74 20 77 65 72 65 20 6f 70  ors that were op
c970: 65 6e 64 20 62 79 20 73 71 6c 69 74 65 33 57 68  end by sqlite3Wh
c980: 65 72 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20  ereBegin..  */. 
c990: 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
c9a0: 2d 3e 61 3b 0a 20 20 70 54 61 62 49 74 65 6d 20  ->a;.  pTabItem 
c9b0: 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20  = pTabList->a;. 
c9c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62   for(i=0; i<pTab
c9d0: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
c9e0: 20 70 54 61 62 49 74 65 6d 2b 2b 2c 20 70 4c 65   pTabItem++, pLe
c9f0: 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c  vel++){.    Tabl
ca00: 65 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74  e *pTab = pTabIt
ca10: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73  em->pTab;.    as
ca20: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b  sert( pTab!=0 );
ca30: 0a 20 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69  .    if( pTab->i
ca40: 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54  sTransient || pT
ca50: 61 62 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f  ab->pSelect ) co
ca60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
ca70: 28 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26  (pLevel->score &
ca80: 20 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)==0 ){.      
ca90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
caa0: 28 76 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54  (v, OP_Close, pT
cab0: 61 62 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c  abItem->iCursor,
cac0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
cad0: 66 28 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21  f( pLevel->pIdx!
cae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
caf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cb00: 4f 50 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c  OP_Close, pLevel
cb10: 2d 3e 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  ->iIdxCur, 0);. 
cb20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
cb30: 65 20 63 75 72 73 6f 72 20 73 75 62 73 74 69 74  e cursor substit
cb40: 75 74 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73  utions for cases
cb50: 20 77 68 65 72 65 20 77 65 20 77 61 6e 74 20 74   where we want t
cb60: 6f 20 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73  o use.    ** jus
cb70: 74 20 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20  t the index and 
cb80: 6e 65 76 65 72 20 72 65 66 65 72 65 6e 63 65 20  never reference 
cb90: 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a  the table..    *
cba0: 2a 20 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20  * .    ** Calls 
cbb0: 74 6f 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65  to the code gene
cbc0: 72 61 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e  rator in between
cbd0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
cbe0: 69 6e 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71  in and.    ** sq
cbf0: 6c 69 74 65 33 57 68 65 72 65 45 6e 64 20 77 69  lite3WhereEnd wi
cc00: 6c 6c 20 68 61 76 65 20 63 72 65 61 74 65 64 20  ll have created 
cc10: 63 6f 64 65 20 74 68 61 74 20 72 65 66 65 72 65  code that refere
cc20: 6e 63 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20  nces the table. 
cc30: 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20     ** directly. 
cc40: 20 54 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73   This loop scans
cc50: 20 61 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c   all that code l
cc60: 6f 6f 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64  ooking for opcod
cc70: 65 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72  es.    ** that r
cc80: 65 66 65 72 65 6e 63 65 20 74 68 65 20 74 61 62  eference the tab
cc90: 6c 65 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20  le and converts 
cca0: 74 68 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65  them into opcode
ccb0: 73 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65  s that.    ** re
ccc0: 66 65 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65  ference the inde
ccd0: 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  x..    */.    if
cce0: 28 20 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20  ( pLevel->score 
ccf0: 26 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  & 1 ){.      int
cd00: 20 69 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20   i, j, last;.   
cd10: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a     VdbeOp *pOp;.
cd20: 20 20 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64        Index *pId
cd30: 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78  x = pLevel->pIdx
cd40: 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
cd50: 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20   pIdx!=0 );.    
cd60: 20 20 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56    pOp = sqlite3V
cd70: 64 62 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e  dbeGetOp(v, pWIn
cd80: 66 6f 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20  fo->iTop);.     
cd90: 20 6c 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56   last = sqlite3V
cda0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
cdb0: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70  );.      for(i=p
cdc0: 57 49 6e 66 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c  WInfo->iTop; i<l
cdd0: 61 73 74 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29  ast; i++, pOp++)
cde0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f  {.        if( pO
cdf0: 70 2d 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69  p->p1!=pLevel->i
ce00: 54 61 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75  TabCur ) continu
ce10: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
ce20: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  Op->opcode==OP_C
ce30: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
ce40: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
ce50: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
ce60: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
ce70: 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e   j<pIdx->nColumn
ce80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
ce90: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d      if( pOp->p2=
cea0: 3d 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b  =pIdx->aiColumn[
ceb0: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
cec0: 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b      pOp->p2 = j;
ced0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
cee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
cef0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
cf00: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
cf10: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f  ( pOp->opcode==O
cf20: 50 5f 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  P_Rowid ){.     
cf30: 20 20 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70       pOp->p1 = p
cf40: 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a  Level->iIdxCur;.
cf50: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
cf60: 70 63 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f  pcode = OP_IdxRo
cf70: 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  wid;.        }el
cf80: 73 65 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  se if( pOp->opco
cf90: 64 65 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29  de==OP_NullRow )
cfa0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  {.          pOp-
cfb0: 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f  >opcode = OP_Noo
cfc0: 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  p;.        }.   
cfd0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
cfe0: 20 20 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e    /* Final clean
cff0: 75 70 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  up.  */.  sqlite
d000: 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20  Free(pWInfo);.  
d010: 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.