System.Data.SQLite
Hex Artifact Content
Not logged in

Artifact 396f1f816f1b662594a5208fa95c62ce7d897719:


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 31 2e 31   where.c,v 1.1.1
0340: 2e 31 20 32 30 30 35 2f 30 33 2f 30 31 20 31 36  .1 2005/03/01 16
0350: 3a 30 34 3a 33 39 20 72 6d 73 69 6d 70 73 6f 6e  :04:39 rmsimpson
0360: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
0370: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
0380: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 71 75 65 72  ../*.** The quer
0390: 79 20 67 65 6e 65 72 61 74 6f 72 20 75 73 65 73  y generator uses
03a0: 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 73   an array of ins
03b0: 74 61 6e 63 65 73 20 6f 66 20 74 68 69 73 20 73  tances of this s
03c0: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 68  tructure to.** h
03d0: 65 6c 70 20 69 74 20 61 6e 61 6c 79 7a 65 20 74  elp it analyze t
03e0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
03f0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
0400: 6c 61 75 73 65 2e 20 20 45 61 63 68 20 57 48 45  lause.  Each WHE
0410: 52 45 0a 2a 2a 20 63 6c 61 75 73 65 20 73 75 62  RE.** clause sub
0420: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65  expression is se
0430: 70 61 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  parated from the
0440: 20 6f 74 68 65 72 73 20 62 79 20 61 6e 20 41 4e   others by an AN
0450: 44 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a  D operator..**.*
0460: 2a 20 54 68 65 20 69 64 78 4c 65 66 74 20 61 6e  * The idxLeft an
0470: 64 20 69 64 78 52 69 67 68 74 20 66 69 65 6c 64  d idxRight field
0480: 73 20 61 72 65 20 74 68 65 20 56 44 42 45 20 63  s are the VDBE c
0490: 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 66 6f  ursor numbers fo
04a0: 72 20 74 68 65 0a 2a 2a 20 74 61 62 6c 65 20 74  r the.** table t
04b0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
04c0: 20 63 6f 6c 75 6d 6e 20 74 68 61 74 20 61 70 70   column that app
04d0: 65 61 72 73 20 6f 6e 20 74 68 65 20 6c 65 66 74  ears on the left
04e0: 2d 68 61 6e 64 20 61 6e 64 0a 2a 2a 20 72 69 67  -hand and.** rig
04f0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
0500: 45 78 70 72 49 6e 66 6f 2e 70 2e 20 20 49 66 20  ExprInfo.p.  If 
0510: 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 45  either side of E
0520: 78 70 72 49 6e 66 6f 2e 70 20 69 73 0a 2a 2a 20  xprInfo.p is.** 
0530: 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72 20  something other 
0540: 74 68 61 6e 20 61 20 73 69 6d 70 6c 65 20 63 6f  than a simple co
0550: 6c 75 6d 6e 20 72 65 66 65 72 65 6e 63 65 2c 20  lumn reference, 
0560: 74 68 65 6e 20 69 64 78 4c 65 66 74 20 6f 72 0a  then idxLeft or.
0570: 2a 2a 20 69 64 78 52 69 67 68 74 20 61 72 65 20  ** idxRight are 
0580: 2d 31 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69  -1.  .**.** It i
0590: 73 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f  s the VDBE curso
05a0: 72 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20  r number is the 
05b0: 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
05c0: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 77  Expr.iTable.** w
05d0: 68 65 6e 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f  hen Expr.op==TK_
05e0: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 20 76  COLUMN and the v
05f0: 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 53  alue stored in S
0600: 72 63 4c 69 73 74 2e 61 5b 5d 2e 69 43 75 72 73  rcList.a[].iCurs
0610: 6f 72 2e 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71  or..**.** prereq
0620: 4c 65 66 74 2c 20 70 72 65 72 65 71 52 69 67 68  Left, prereqRigh
0630: 74 2c 20 61 6e 64 20 70 72 65 72 65 71 41 6c 6c  t, and prereqAll
0640: 20 72 65 63 6f 72 64 20 73 65 74 73 20 6f 66 20   record sets of 
0650: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a  cursor numbers,.
0660: 2a 2a 20 62 75 74 20 74 68 65 79 20 64 6f 20 73  ** but they do s
0670: 6f 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 20 41  o indirectly.  A
0680: 20 73 69 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b   single ExprMask
0690: 53 65 74 20 73 74 72 75 63 74 75 72 65 20 74 72  Set structure tr
06a0: 61 6e 73 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73  anslates.** curs
06b0: 6f 72 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62  or number into b
06c0: 69 74 73 20 61 6e 64 20 74 68 65 20 74 72 61 6e  its and the tran
06d0: 73 6c 61 74 65 64 20 62 69 74 20 69 73 20 73 74  slated bit is st
06e0: 6f 72 65 64 20 69 6e 20 74 68 65 20 70 72 65 72  ored in the prer
06f0: 65 71 0a 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54  eq.** fields.  T
0700: 68 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  he translation i
0710: 73 20 75 73 65 64 20 69 6e 20 6f 72 64 65 72 20  s used in order 
0720: 74 6f 20 6d 61 78 69 6d 69 7a 65 20 74 68 65 20  to maximize the 
0730: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74  number of.** bit
0740: 73 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20  s that will fit 
0750: 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e 20 20 54  in a Bitmask.  T
0760: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
0770: 75 6d 62 65 72 73 20 6d 69 67 68 74 20 62 65 0a  umbers might be.
0780: 2a 2a 20 73 70 72 65 61 64 20 6f 75 74 20 6f 76  ** spread out ov
0790: 65 72 20 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74  er the non-negat
07a0: 69 76 65 20 69 6e 74 65 67 65 72 73 2e 20 20 46  ive integers.  F
07b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20  or example, the 
07c0: 63 75 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72  cursor.** number
07d0: 73 20 6d 69 67 68 74 20 62 65 20 33 2c 20 38 2c  s might be 3, 8,
07e0: 20 39 2c 20 31 30 2c 20 32 30 2c 20 32 33 2c 20   9, 10, 20, 23, 
07f0: 34 31 2c 20 61 6e 64 20 34 35 2e 20 20 54 68 65  41, and 45.  The
0800: 20 45 78 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20   ExprMaskSet.** 
0810: 74 72 61 6e 73 6c 61 74 65 73 20 74 68 65 73 65  translates these
0820: 20 73 70 61 72 73 65 20 63 75 72 73 6f 72 20 6e   sparse cursor n
0830: 75 6d 62 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73  umbers into cons
0840: 65 63 75 74 69 76 65 20 69 6e 74 65 67 65 72 73  ecutive integers
0850: 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69  .** beginning wi
0860: 74 68 20 30 20 69 6e 20 6f 72 64 65 72 20 74 6f  th 0 in order to
0870: 20 6d 61 6b 65 20 74 68 65 20 62 65 73 74 20 70   make the best p
0880: 6f 73 73 69 62 6c 65 20 75 73 65 20 6f 66 20 74  ossible use of t
0890: 68 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20  he available.** 
08a0: 62 69 74 73 20 69 6e 20 74 68 65 20 42 69 74 6d  bits in the Bitm
08b0: 61 73 6b 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65  ask.  So, in the
08c0: 20 65 78 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20   example above, 
08d0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
08e0: 72 73 0a 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d  rs.** would be m
08f0: 61 70 70 65 64 20 69 6e 74 6f 20 69 6e 74 65 67  apped into integ
0900: 65 72 73 20 30 20 74 68 72 6f 75 67 68 20 37 2e  ers 0 through 7.
0910: 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 4c 65 66  .**.** prereqLef
0920: 74 20 74 65 6c 6c 73 20 75 73 20 65 76 65 72 79  t tells us every
0930: 20 56 44 42 45 20 63 75 72 73 6f 72 20 74 68 61   VDBE cursor tha
0940: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 20  t is referenced 
0950: 6f 6e 20 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 68  on the.** left-h
0960: 61 6e 64 20 73 69 64 65 20 6f 66 20 45 78 70 72  and side of Expr
0970: 49 6e 66 6f 2e 70 2e 20 20 70 72 65 72 65 71 52  Info.p.  prereqR
0980: 69 67 68 74 20 64 6f 65 73 20 74 68 65 20 73 61  ight does the sa
0990: 6d 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20 72 69  me for the.** ri
09a0: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
09b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
09c0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
09d0: 69 64 65 6e 74 69 74 79 20 61 6c 77 61 79 73 0a  identity always.
09e0: 2a 2a 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  ** holds:.**.** 
09f0: 20 20 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20        prereqAll 
0a00: 3d 20 70 72 65 72 65 71 4c 65 66 74 20 7c 20 70  = prereqLeft | p
0a10: 72 65 72 65 71 52 69 67 68 74 0a 2a 2a 0a 2a 2a  rereqRight.**.**
0a20: 20 54 68 65 20 45 78 70 72 49 6e 66 6f 2e 69 6e   The ExprInfo.in
0a30: 64 65 78 61 62 6c 65 20 66 69 65 6c 64 20 69 73  dexable field is
0a40: 20 74 72 75 65 20 69 66 20 74 68 65 20 45 78 70   true if the Exp
0a50: 72 49 6e 66 6f 2e 70 20 65 78 70 72 65 73 73 69  rInfo.p expressi
0a60: 6f 6e 0a 2a 2a 20 69 73 20 6f 66 20 61 20 66 6f  on.** is of a fo
0a70: 72 6d 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  rm that might co
0a80: 6e 74 72 6f 6c 20 61 6e 20 69 6e 64 65 78 2e 20  ntrol an index. 
0a90: 20 49 6e 64 65 78 61 62 6c 65 20 65 78 70 72 65   Indexable expre
0aa0: 73 73 69 6f 6e 73 0a 2a 2a 20 6c 6f 6f 6b 20 6c  ssions.** look l
0ab0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 63 6f               <co
0ad0: 6c 75 6d 6e 3e 20 3c 6f 70 3e 20 3c 65 78 70 72  lumn> <op> <expr
0ae0: 3e 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 63  >.**.** Where <c
0af0: 6f 6c 75 6d 6e 3e 20 69 73 20 61 20 73 69 6d 70  olumn> is a simp
0b00: 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  le column name a
0b10: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 20 6f 66  nd <op> is on of
0b20: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 0a 2a   the operators.*
0b30: 2a 20 74 68 61 74 20 61 6c 6c 6f 77 65 64 4f 70  * that allowedOp
0b40: 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 2e 20 20  () recognizes.  
0b50: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0b60: 63 74 20 45 78 70 72 49 6e 66 6f 20 45 78 70 72  ct ExprInfo Expr
0b70: 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70  Info;.struct Exp
0b80: 72 49 6e 66 6f 20 7b 0a 20 20 45 78 70 72 20 2a  rInfo {.  Expr *
0b90: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
0ba0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
0bb0: 74 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f  the subexpressio
0bc0: 6e 20 2a 2f 0a 20 20 75 38 20 69 6e 64 65 78 61  n */.  u8 indexa
0bd0: 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ble;           /
0be0: 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20 73  * True if this s
0bf0: 75 62 65 78 70 72 73 73 69 6f 6e 20 69 73 20 75  ubexprssion is u
0c00: 73 61 62 6c 65 20 62 79 20 61 6e 20 69 6e 64 65  sable by an inde
0c10: 78 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74  x */.  short int
0c20: 20 69 64 78 4c 65 66 74 3b 20 20 20 20 20 20 2f   idxLeft;      /
0c30: 2a 20 70 2d 3e 70 4c 65 66 74 20 69 73 20 61 20  * p->pLeft is a 
0c40: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 69 73 20 74  column in this t
0c50: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 20 2d 31 20  able number. -1 
0c60: 69 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  if.             
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
0c80: 70 2d 3e 70 4c 65 66 74 20 69 73 20 6e 6f 74 20  p->pLeft is not 
0c90: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e  the column of an
0ca0: 79 20 74 61 62 6c 65 20 2a 2f 0a 20 20 73 68 6f  y table */.  sho
0cb0: 72 74 20 69 6e 74 20 69 64 78 52 69 67 68 74 3b  rt int idxRight;
0cc0: 20 20 20 20 20 2f 2a 20 70 2d 3e 70 52 69 67 68       /* p->pRigh
0cd0: 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  t is a column in
0ce0: 20 74 68 69 73 20 74 61 62 6c 65 20 6e 75 6d 62   this table numb
0cf0: 65 72 2e 20 2d 31 20 69 66 0a 20 20 20 20 20 20  er. -1 if.      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d10: 20 20 20 20 2a 2a 20 70 2d 3e 70 52 69 67 68 74      ** p->pRight
0d20: 20 69 73 20 6e 6f 74 20 74 68 65 20 63 6f 6c 75   is not the colu
0d30: 6d 6e 20 6f 66 20 61 6e 79 20 74 61 62 6c 65 20  mn of any table 
0d40: 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65  */.  Bitmask pre
0d50: 72 65 71 4c 65 66 74 3b 20 20 20 20 20 2f 2a 20  reqLeft;     /* 
0d60: 42 69 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65  Bitmask of table
0d70: 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79 20  s referenced by 
0d80: 70 2d 3e 70 4c 65 66 74 20 2a 2f 0a 20 20 42 69  p->pLeft */.  Bi
0d90: 74 6d 61 73 6b 20 70 72 65 72 65 71 52 69 67 68  tmask prereqRigh
0da0: 74 3b 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b  t;    /* Bitmask
0db0: 20 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72   of tables refer
0dc0: 65 6e 63 65 64 20 62 79 20 70 2d 3e 70 52 69 67  enced by p->pRig
0dd0: 68 74 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20  ht */.  Bitmask 
0de0: 70 72 65 72 65 71 41 6c 6c 3b 20 20 20 20 20 20  prereqAll;      
0df0: 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20 74 61  /* Bitmask of ta
0e00: 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65 64 20  bles referenced 
0e10: 62 79 20 70 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  by p */.};../*.*
0e20: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
0e30: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
0e40: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 74  tructure keeps t
0e50: 72 61 63 6b 20 6f 66 20 61 20 6d 61 70 70 69 6e  rack of a mappin
0e60: 67 0a 2a 2a 20 62 65 74 77 65 65 6e 20 56 44 42  g.** between VDB
0e70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
0e80: 20 61 6e 64 20 62 69 74 73 20 6f 66 20 74 68 65   and bits of the
0e90: 20 62 69 74 6d 61 73 6b 73 20 69 6e 20 45 78 70   bitmasks in Exp
0ea0: 72 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rInfo..**.** The
0eb0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
0ec0: 62 65 72 73 20 61 72 65 20 73 6d 61 6c 6c 20 69  bers are small i
0ed0: 6e 74 65 67 65 72 73 20 63 6f 6e 74 61 69 6e 65  ntegers containe
0ee0: 64 20 69 6e 20 0a 2a 2a 20 53 72 63 4c 69 73 74  d in .** SrcList
0ef0: 5f 69 74 65 6d 2e 69 43 75 72 73 6f 72 20 61 6e  _item.iCursor an
0f00: 64 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69  d Expr.iTable fi
0f10: 65 6c 64 73 2e 20 20 46 6f 72 20 61 6e 79 20 67  elds.  For any g
0f20: 69 76 65 6e 20 57 48 45 52 45 20 0a 2a 2a 20 63  iven WHERE .** c
0f30: 6c 61 75 73 65 2c 20 74 68 65 20 63 75 72 73 6f  lause, the curso
0f40: 72 20 6e 75 6d 62 65 72 73 20 6d 69 67 68 74 20  r numbers might 
0f50: 6e 6f 74 20 62 65 67 69 6e 20 77 69 74 68 20 30  not begin with 0
0f60: 20 61 6e 64 20 74 68 65 79 20 6d 69 67 68 74 0a   and they might.
0f70: 2a 2a 20 63 6f 6e 74 61 69 6e 20 67 61 70 73 20  ** contain gaps 
0f80: 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 69 6e 67  in the numbering
0f90: 20 73 65 71 75 65 6e 63 65 2e 20 20 42 75 74 20   sequence.  But 
0fa0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
0fb0: 6d 61 78 69 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f  maximum.** use o
0fc0: 66 20 74 68 65 20 62 69 74 73 20 69 6e 20 6f 75  f the bits in ou
0fd0: 72 20 62 69 74 6d 61 73 6b 73 2e 20 20 54 68 69  r bitmasks.  Thi
0fe0: 73 20 73 74 72 75 63 74 75 72 65 20 70 72 6f 76  s structure prov
0ff0: 69 64 65 73 20 61 20 6d 61 70 70 69 6e 67 0a 2a  ides a mapping.*
1000: 2a 20 66 72 6f 6d 20 74 68 65 20 73 70 61 72 73  * from the spars
1010: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  e cursor numbers
1020: 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75 74 69 76   into consecutiv
1030: 65 20 69 6e 74 65 67 65 72 73 20 62 65 67 69 6e  e integers begin
1040: 6e 69 6e 67 0a 2a 2a 20 77 69 74 68 20 30 2e 0a  ning.** with 0..
1050: 2a 2a 0a 2a 2a 20 49 66 20 45 78 70 72 4d 61 73  **.** If ExprMas
1060: 6b 53 65 74 2e 69 78 5b 41 5d 3d 3d 42 20 69 74  kSet.ix[A]==B it
1070: 20 6d 65 61 6e 73 20 74 68 61 74 20 54 68 65 20   means that The 
1080: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 42 69  A-th bit of a Bi
1090: 74 6d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  tmask.** corresp
10a0: 6f 6e 64 73 20 56 44 42 45 20 63 75 72 73 6f 72  onds VDBE cursor
10b0: 20 6e 75 6d 62 65 72 20 42 2e 20 20 54 68 65 20   number B.  The 
10c0: 41 2d 74 68 20 62 69 74 20 6f 66 20 61 20 62 69  A-th bit of a bi
10d0: 74 6d 61 73 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a  tmask is 1<<A..*
10e0: 2a 0a 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65  *.** For example
10f0: 2c 20 69 66 20 74 68 65 20 57 48 45 52 45 20 63  , if the WHERE c
1100: 6c 61 75 73 65 20 65 78 70 72 65 73 73 69 6f 6e  lause expression
1110: 20 75 73 65 64 20 74 68 65 73 65 20 56 44 42 45   used these VDBE
1120: 0a 2a 2a 20 63 75 72 73 6f 72 73 3a 20 20 34 2c  .** cursors:  4,
1130: 20 35 2c 20 38 2c 20 32 39 2c 20 35 37 2c 20 37   5, 8, 29, 57, 7
1140: 33 2e 20 20 54 68 65 6e 20 74 68 65 20 20 45 78  3.  Then the  Ex
1150: 70 72 4d 61 73 6b 53 65 74 20 73 74 72 75 63 74  prMaskSet struct
1160: 75 72 65 0a 2a 2a 20 77 6f 75 6c 64 20 6d 61 70  ure.** would map
1170: 20 74 68 6f 73 65 20 63 75 72 73 6f 72 20 6e 75   those cursor nu
1180: 6d 62 65 72 73 20 69 6e 74 6f 20 62 69 74 73 20  mbers into bits 
1190: 30 20 74 68 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a  0 through 5..**.
11a0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
11b0: 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 20   mapping is not 
11c0: 6e 65 63 65 73 73 61 72 69 6c 79 20 6f 72 64 65  necessarily orde
11d0: 72 65 64 2e 20 20 49 6e 20 74 68 65 20 65 78 61  red.  In the exa
11e0: 6d 70 6c 65 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  mple.** above, t
11f0: 68 65 20 6d 61 70 70 69 6e 67 20 6d 69 67 68 74  he mapping might
1200: 20 67 6f 20 6c 69 6b 65 20 74 68 69 73 3a 20 20   go like this:  
1210: 34 2d 3e 33 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32  4->3, 5->1, 8->2
1220: 2c 20 32 39 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e  , 29->0,.** 57->
1230: 35 2c 20 37 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e  5, 73->4.  Or on
1240: 65 20 6f 66 20 37 31 39 20 6f 74 68 65 72 20 63  e of 719 other c
1250: 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6d 69 67 68  ombinations migh
1260: 74 20 62 65 20 75 73 65 64 2e 20 49 74 0a 2a 2a  t be used. It.**
1270: 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 6c 6c 79   does not really
1280: 20 6d 61 74 74 65 72 2e 20 20 57 68 61 74 20 69   matter.  What i
1290: 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 73 20 74  s important is t
12a0: 68 61 74 20 73 70 61 72 73 65 20 63 75 72 73 6f  hat sparse curso
12b0: 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 61 6c 6c  r.** numbers all
12c0: 20 67 65 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   get mapped into
12d0: 20 62 69 74 20 6e 75 6d 62 65 72 73 20 74 68 61   bit numbers tha
12e0: 74 20 62 65 67 69 6e 20 77 69 74 68 20 30 20 61  t begin with 0 a
12f0: 6e 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f  nd contain.** no
1300: 20 67 61 70 73 2e 0a 2a 2f 0a 74 79 70 65 64 65   gaps..*/.typede
1310: 66 20 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  f struct ExprMas
1320: 6b 53 65 74 20 45 78 70 72 4d 61 73 6b 53 65 74  kSet ExprMaskSet
1330: 3b 0a 73 74 72 75 63 74 20 45 78 70 72 4d 61 73  ;.struct ExprMas
1340: 6b 53 65 74 20 7b 0a 20 20 69 6e 74 20 6e 3b 20  kSet {.  int n; 
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1370: 20 6f 66 20 61 73 73 69 67 6e 65 64 20 63 75 72   of assigned cur
1380: 73 6f 72 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  sor values */.  
1390: 69 6e 74 20 69 78 5b 73 69 7a 65 6f 66 28 42 69  int ix[sizeof(Bi
13a0: 74 6d 61 73 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a  tmask)*8];    /*
13b0: 20 43 75 72 73 6f 72 20 61 73 73 69 67 6e 65 64   Cursor assigned
13c0: 20 74 6f 20 65 61 63 68 20 62 69 74 20 2a 2f 0a   to each bit */.
13d0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d  };../*.** Determ
13e0: 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ine the number o
13f0: 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e  f elements in an
1400: 20 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66 69   array..*/.#defi
1410: 6e 65 20 41 52 52 41 59 53 49 5a 45 28 58 29 20  ne ARRAYSIZE(X) 
1420: 20 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65   (sizeof(X)/size
1430: 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a  of(X[0]))../*.**
1440: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 64   This routine id
1450: 65 6e 74 69 66 69 65 73 20 73 75 62 65 78 70 72  entifies subexpr
1460: 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 57  essions in the W
1470: 48 45 52 45 20 63 6c 61 75 73 65 20 77 68 65 72  HERE clause wher
1480: 65 0a 2a 2a 20 65 61 63 68 20 73 75 62 65 78 70  e.** each subexp
1490: 72 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72  ression is separ
14a0: 61 74 65 20 62 79 20 74 68 65 20 41 4e 44 20 6f  ate by the AND o
14b0: 70 65 72 61 74 6f 72 2e 20 20 61 53 6c 6f 74 20  perator.  aSlot 
14c0: 69 73 20 0a 2a 2a 20 66 69 6c 6c 65 64 20 77 69  is .** filled wi
14d0: 74 68 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  th pointers to t
14e0: 68 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  he subexpression
14f0: 73 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a  s.  For example:
1500: 0a 2a 2a 0a 2a 2a 20 20 20 20 57 48 45 52 45 20  .**.**    WHERE 
1510: 20 61 3d 3d 27 68 65 6c 6c 6f 27 20 41 4e 44 20   a=='hello' AND 
1520: 63 6f 61 6c 65 73 63 65 28 62 2c 31 31 29 3c 31  coalesce(b,11)<1
1530: 30 20 41 4e 44 20 28 63 2b 31 32 21 3d 64 20 4f  0 AND (c+12!=d O
1540: 52 20 63 3d 3d 32 32 29 0a 2a 2a 20 20 20 20 20  R c==22).**     
1550: 20 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f        \________/
1560: 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f       \__________
1570: 5f 5f 5f 5f 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f  _____/     \____
1580: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a  ____________/.**
1590: 20 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74              slot
15a0: 5b 30 5d 20 20 20 20 20 20 20 20 20 20 20 20 73  [0]            s
15b0: 6c 6f 74 5b 31 5d 20 20 20 20 20 20 20 20 20 20  lot[1]          
15c0: 20 20 20 20 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a       slot[2].**.
15d0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
15e0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20  WHERE clause in 
15f0: 70 45 78 70 72 20 69 73 20 75 6e 61 6c 74 65 72  pExpr is unalter
1600: 65 64 2e 20 20 41 6c 6c 20 74 68 69 73 20 72 6f  ed.  All this ro
1610: 75 74 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 69 73  utine.** does is
1620: 20 6d 61 6b 65 20 61 53 6c 6f 74 5b 5d 20 65 6e   make aSlot[] en
1630: 74 72 69 65 73 20 70 6f 69 6e 74 20 74 6f 20 73  tries point to s
1640: 75 62 73 74 72 75 63 74 75 72 65 20 77 69 74 68  ubstructure with
1650: 69 6e 20 70 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20  in pExpr..**.** 
1660: 61 53 6c 6f 74 5b 5d 20 69 73 20 61 6e 20 61 72  aSlot[] is an ar
1670: 72 61 79 20 6f 66 20 73 75 62 65 78 70 72 65 73  ray of subexpres
1680: 73 69 6f 6e 73 20 73 74 72 75 63 74 75 72 65 73  sions structures
1690: 2e 20 20 54 68 65 72 65 20 61 72 65 20 6e 53 6c  .  There are nSl
16a0: 6f 74 0a 2a 2a 20 73 70 61 63 65 73 20 6c 65 66  ot.** spaces lef
16b0: 74 20 69 6e 20 74 68 69 73 20 61 72 72 61 79 2e  t in this array.
16c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 66    This routine f
16d0: 69 6e 64 73 20 61 73 20 6d 61 6e 79 20 41 4e 44  inds as many AND
16e0: 2d 73 65 70 61 72 61 74 65 64 0a 2a 2a 20 73 75  -separated.** su
16f0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 61 73 20  bexpressions as 
1700: 69 74 20 63 61 6e 20 61 6e 64 20 70 75 74 73 20  it can and puts 
1710: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 6f 73  pointers to thos
1720: 65 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 73  e subexpressions
1730: 0a 2a 2a 20 69 6e 74 6f 20 61 53 6c 6f 74 5b 5d  .** into aSlot[]
1740: 20 65 6e 74 72 69 65 73 2e 20 20 54 68 65 20 72   entries.  The r
1750: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1760: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
1770: 74 73 20 66 69 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  ts filled..*/.st
1780: 61 74 69 63 20 69 6e 74 20 65 78 70 72 53 70 6c  atic int exprSpl
1790: 69 74 28 69 6e 74 20 6e 53 6c 6f 74 2c 20 45 78  it(int nSlot, Ex
17a0: 70 72 49 6e 66 6f 20 2a 61 53 6c 6f 74 2c 20 45  prInfo *aSlot, E
17b0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
17c0: 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66  nt cnt = 0;.  if
17d0: 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 6e 53  ( pExpr==0 || nS
17e0: 6c 6f 74 3c 31 20 29 20 72 65 74 75 72 6e 20 30  lot<1 ) return 0
17f0: 3b 0a 20 20 69 66 28 20 6e 53 6c 6f 74 3d 3d 31  ;.  if( nSlot==1
1800: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54   || pExpr->op!=T
1810: 4b 5f 41 4e 44 20 29 7b 0a 20 20 20 20 61 53 6c  K_AND ){.    aSl
1820: 6f 74 5b 30 5d 2e 70 20 3d 20 70 45 78 70 72 3b  ot[0].p = pExpr;
1830: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1840: 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e   }.  if( pExpr->
1850: 70 4c 65 66 74 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pLeft->op!=TK_AN
1860: 44 20 29 7b 0a 20 20 20 20 61 53 6c 6f 74 5b 30  D ){.    aSlot[0
1870: 5d 2e 70 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  ].p = pExpr->pLe
1880: 66 74 3b 0a 20 20 20 20 63 6e 74 20 3d 20 31 20  ft;.    cnt = 1 
1890: 2b 20 65 78 70 72 53 70 6c 69 74 28 6e 53 6c 6f  + exprSplit(nSlo
18a0: 74 2d 31 2c 20 26 61 53 6c 6f 74 5b 31 5d 2c 20  t-1, &aSlot[1], 
18b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
18c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6e 74    }else{.    cnt
18d0: 20 3d 20 65 78 70 72 53 70 6c 69 74 28 6e 53 6c   = exprSplit(nSl
18e0: 6f 74 2c 20 61 53 6c 6f 74 2c 20 70 45 78 70 72  ot, aSlot, pExpr
18f0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 63 6e  ->pLeft);.    cn
1900: 74 20 2b 3d 20 65 78 70 72 53 70 6c 69 74 28 6e  t += exprSplit(n
1910: 53 6c 6f 74 2d 63 6e 74 2c 20 26 61 53 6c 6f 74  Slot-cnt, &aSlot
1920: 5b 63 6e 74 5d 2c 20 70 45 78 70 72 2d 3e 70 52  [cnt], pExpr->pR
1930: 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ight);.  }.  ret
1940: 75 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn cnt;.}../*.*
1950: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20  * Initialize an 
1960: 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20  expression mask 
1970: 73 65 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69  set.*/.#define i
1980: 6e 69 74 4d 61 73 6b 53 65 74 28 50 29 20 20 6d  nitMaskSet(P)  m
1990: 65 6d 73 65 74 28 50 2c 20 30 2c 20 73 69 7a 65  emset(P, 0, size
19a0: 6f 66 28 2a 50 29 29 0a 0a 2f 2a 0a 2a 2a 20 52  of(*P))../*.** R
19b0: 65 74 75 72 6e 20 74 68 65 20 62 69 74 6d 61 73  eturn the bitmas
19c0: 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
19d0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 2e 20 20  cursor number.  
19e0: 52 65 74 75 72 6e 20 30 20 69 66 0a 2a 2a 20 69  Return 0 if.** i
19f0: 43 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  Cursor is not in
1a00: 20 74 68 65 20 73 65 74 2e 0a 2a 2f 0a 73 74 61   the set..*/.sta
1a10: 74 69 63 20 42 69 74 6d 61 73 6b 20 67 65 74 4d  tic Bitmask getM
1a20: 61 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20  ask(ExprMaskSet 
1a30: 2a 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69  *pMaskSet, int i
1a40: 43 75 72 73 6f 72 29 7b 0a 20 20 69 6e 74 20 69  Cursor){.  int i
1a50: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1a60: 4d 61 73 6b 53 65 74 2d 3e 6e 3b 20 69 2b 2b 29  MaskSet->n; i++)
1a70: 7b 0a 20 20 20 20 69 66 28 20 70 4d 61 73 6b 53  {.    if( pMaskS
1a80: 65 74 2d 3e 69 78 5b 69 5d 3d 3d 69 43 75 72 73  et->ix[i]==iCurs
1a90: 6f 72 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  or ){.      retu
1aa0: 72 6e 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  rn ((Bitmask)1)<
1ab0: 3c 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  <i;.    }.  }.  
1ac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1ad0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
1ae0: 6d 61 73 6b 20 66 6f 72 20 63 75 72 73 6f 72 20  mask for cursor 
1af0: 69 43 75 72 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74  iCursor..*/.stat
1b00: 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 4d 61  ic void createMa
1b10: 73 6b 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  sk(ExprMaskSet *
1b20: 70 4d 61 73 6b 53 65 74 2c 20 69 6e 74 20 69 43  pMaskSet, int iC
1b30: 75 72 73 6f 72 29 7b 0a 20 20 69 66 28 20 70 4d  ursor){.  if( pM
1b40: 61 73 6b 53 65 74 2d 3e 6e 3c 41 52 52 41 59 53  askSet->n<ARRAYS
1b50: 49 5a 45 28 70 4d 61 73 6b 53 65 74 2d 3e 69 78  IZE(pMaskSet->ix
1b60: 29 20 29 7b 0a 20 20 20 20 70 4d 61 73 6b 53 65  ) ){.    pMaskSe
1b70: 74 2d 3e 69 78 5b 70 4d 61 73 6b 53 65 74 2d 3e  t->ix[pMaskSet->
1b80: 6e 2b 2b 5d 20 3d 20 69 43 75 72 73 6f 72 3b 0a  n++] = iCursor;.
1b90: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73    }.}../*.** Des
1ba0: 74 72 6f 79 20 61 6e 20 65 78 70 72 65 73 73 69  troy an expressi
1bb0: 6f 6e 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23  on mask set.*/.#
1bc0: 64 65 66 69 6e 65 20 66 72 65 65 4d 61 73 6b 53  define freeMaskS
1bd0: 65 74 28 50 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50  et(P)   /* NO-OP
1be0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
1bf0: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 28 72  routine walks (r
1c00: 65 63 75 72 73 69 76 65 6c 79 29 20 61 6e 20 65  ecursively) an e
1c10: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
1c20: 6e 64 20 67 65 6e 65 72 61 74 65 73 0a 2a 2a 20  nd generates.** 
1c30: 61 20 62 69 74 6d 61 73 6b 20 69 6e 64 69 63 61  a bitmask indica
1c40: 74 69 6e 67 20 77 68 69 63 68 20 74 61 62 6c 65  ting which table
1c50: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
1c60: 61 74 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  at expression.**
1c70: 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20   tree..**.** In 
1c80: 6f 72 64 65 72 20 66 6f 72 20 74 68 69 73 20 72  order for this r
1c90: 6f 75 74 69 6e 65 20 74 6f 20 77 6f 72 6b 2c 20  outine to work, 
1ca0: 74 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63  the calling func
1cb0: 74 69 6f 6e 20 6d 75 73 74 20 68 61 76 65 0a 2a  tion must have.*
1cc0: 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 76  * previously inv
1cd0: 6f 6b 65 64 20 73 71 6c 69 74 65 33 45 78 70 72  oked sqlite3Expr
1ce0: 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20 6f  ResolveNames() o
1cf0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
1d00: 2e 20 20 53 65 65 0a 2a 2a 20 74 68 65 20 68 65  .  See.** the he
1d10: 61 64 65 72 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20  ader comment on 
1d20: 74 68 61 74 20 72 6f 75 74 69 6e 65 20 66 6f 72  that routine for
1d30: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
1d40: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  rmation..** The 
1d50: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
1d60: 76 65 4e 61 6d 65 73 28 29 20 72 6f 75 74 69 6e  veNames() routin
1d70: 65 73 20 6c 6f 6f 6b 73 20 66 6f 72 20 63 6f 6c  es looks for col
1d80: 75 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 0a 2a 2a  umn names and.**
1d90: 20 73 65 74 73 20 74 68 65 69 72 20 6f 70 63 6f   sets their opco
1da0: 64 65 73 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  des to TK_COLUMN
1db0: 20 61 6e 64 20 74 68 65 69 72 20 45 78 70 72 2e   and their Expr.
1dc0: 69 54 61 62 6c 65 20 66 69 65 6c 64 73 20 74 6f  iTable fields to
1dd0: 0a 2a 2a 20 74 68 65 20 56 44 42 45 20 63 75 72  .** the VDBE cur
1de0: 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  sor number of th
1df0: 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
1e00: 69 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c  ic Bitmask exprL
1e10: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 45 78  istTableUsage(Ex
1e20: 70 72 4d 61 73 6b 53 65 74 20 2a 2c 20 45 78 70  prMaskSet *, Exp
1e30: 72 4c 69 73 74 20 2a 29 3b 0a 73 74 61 74 69 63  rList *);.static
1e40: 20 42 69 74 6d 61 73 6b 20 65 78 70 72 54 61 62   Bitmask exprTab
1e50: 6c 65 55 73 61 67 65 28 45 78 70 72 4d 61 73 6b  leUsage(ExprMask
1e60: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
1e70: 78 70 72 20 2a 70 29 7b 0a 20 20 42 69 74 6d 61  xpr *p){.  Bitma
1e80: 73 6b 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 69  sk mask = 0;.  i
1e90: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1ea0: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d   0;.  if( p->op=
1eb0: 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20  =TK_COLUMN ){.  
1ec0: 20 20 6d 61 73 6b 20 3d 20 67 65 74 4d 61 73 6b    mask = getMask
1ed0: 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e 69 54  (pMaskSet, p->iT
1ee0: 61 62 6c 65 29 3b 0a 20 20 20 20 72 65 74 75 72  able);.    retur
1ef0: 6e 20 6d 61 73 6b 3b 0a 20 20 7d 0a 20 20 6d 61  n mask;.  }.  ma
1f00: 73 6b 20 3d 20 65 78 70 72 54 61 62 6c 65 55 73  sk = exprTableUs
1f10: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d  age(pMaskSet, p-
1f20: 3e 70 52 69 67 68 74 29 3b 0a 20 20 6d 61 73 6b  >pRight);.  mask
1f30: 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61   |= exprTableUsa
1f40: 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 2d 3e  ge(pMaskSet, p->
1f50: 70 4c 65 66 74 29 3b 0a 20 20 6d 61 73 6b 20 7c  pLeft);.  mask |
1f60: 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55  = exprListTableU
1f70: 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70  sage(pMaskSet, p
1f80: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 69 66 28 20  ->pList);.  if( 
1f90: 70 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  p->pSelect ){.  
1fa0: 20 20 53 65 6c 65 63 74 20 2a 70 53 20 3d 20 70    Select *pS = p
1fb0: 2d 3e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 6d  ->pSelect;.    m
1fc0: 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54  ask |= exprListT
1fd0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
1fe0: 65 74 2c 20 70 53 2d 3e 70 45 4c 69 73 74 29 3b  et, pS->pEList);
1ff0: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
2000: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
2010: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 47  pMaskSet, pS->pG
2020: 72 6f 75 70 42 79 29 3b 0a 20 20 20 20 6d 61 73  roupBy);.    mas
2030: 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62  k |= exprListTab
2040: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2050: 2c 20 70 53 2d 3e 70 4f 72 64 65 72 42 79 29 3b  , pS->pOrderBy);
2060: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
2070: 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73  rTableUsage(pMas
2080: 6b 53 65 74 2c 20 70 53 2d 3e 70 57 68 65 72 65  kSet, pS->pWhere
2090: 29 3b 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65  );.    mask |= e
20a0: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d  xprTableUsage(pM
20b0: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 48 61 76  askSet, pS->pHav
20c0: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ing);.  }.  retu
20d0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 73 74 61 74 69  rn mask;.}.stati
20e0: 63 20 42 69 74 6d 61 73 6b 20 65 78 70 72 4c 69  c Bitmask exprLi
20f0: 73 74 54 61 62 6c 65 55 73 61 67 65 28 45 78 70  stTableUsage(Exp
2100: 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53  rMaskSet *pMaskS
2110: 65 74 2c 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  et, ExprList *pL
2120: 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ist){.  int i;. 
2130: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
2140: 30 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29  0;.  if( pList )
2150: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
2160: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
2170: 2b 2b 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20  ++){.      mask 
2180: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2190: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 4c 69 73  e(pMaskSet, pLis
21a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
21b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
21c0: 72 6e 20 6d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn mask;.}../*.*
21d0: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
21e0: 20 74 68 65 20 67 69 76 65 6e 20 6f 70 65 72 61   the given opera
21f0: 74 6f 72 20 69 73 20 6f 6e 65 20 6f 66 20 74 68  tor is one of th
2200: 65 20 6f 70 65 72 61 74 6f 72 73 20 74 68 61 74  e operators that
2210: 20 69 73 0a 2a 2a 20 61 6c 6c 6f 77 65 64 20 66   is.** allowed f
2220: 6f 72 20 61 6e 20 69 6e 64 65 78 61 62 6c 65 20  or an indexable 
2230: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 65 72  WHERE clause ter
2240: 6d 2e 20 20 54 68 65 20 61 6c 6c 6f 77 65 64 20  m.  The allowed 
2250: 6f 70 65 72 61 74 6f 72 73 20 61 72 65 0a 2a 2a  operators are.**
2260: 20 22 3d 22 2c 20 22 3c 22 2c 20 22 3e 22 2c 20   "=", "<", ">", 
2270: 22 3c 3d 22 2c 20 22 3e 3d 22 2c 20 61 6e 64 20  "<=", ">=", and 
2280: 22 49 4e 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "IN"..*/.static 
2290: 69 6e 74 20 61 6c 6c 6f 77 65 64 4f 70 28 69 6e  int allowedOp(in
22a0: 74 20 6f 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t op){.  assert(
22b0: 20 54 4b 5f 47 54 3d 3d 54 4b 5f 4c 45 2d 31 20   TK_GT==TK_LE-1 
22c0: 26 26 20 54 4b 5f 4c 45 3d 3d 54 4b 5f 4c 54 2d  && TK_LE==TK_LT-
22d0: 31 20 26 26 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47  1 && TK_LT==TK_G
22e0: 45 2d 31 20 26 26 20 54 4b 5f 45 51 3d 3d 54 4b  E-1 && TK_EQ==TK
22f0: 5f 47 54 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e  _GT-1);.  return
2300: 20 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 28 6f   op==TK_IN || (o
2310: 70 3e 3d 54 4b 5f 45 51 20 26 26 20 6f 70 3c 3d  p>=TK_EQ && op<=
2320: 54 4b 5f 47 45 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TK_GE);.}../*.**
2330: 20 53 77 61 70 20 74 77 6f 20 6f 62 6a 65 63 74   Swap two object
2340: 73 20 6f 66 20 74 79 70 65 20 54 2e 0a 2a 2f 0a  s of type T..*/.
2350: 23 64 65 66 69 6e 65 20 53 57 41 50 28 54 59 50  #define SWAP(TYP
2360: 45 2c 41 2c 42 29 20 7b 54 59 50 45 20 74 3d 41  E,A,B) {TYPE t=A
2370: 3b 20 41 3d 42 3b 20 42 3d 74 3b 7d 0a 0a 2f 2a  ; A=B; B=t;}../*
2380: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
2390: 6e 64 65 78 20 69 6e 20 74 68 65 20 53 72 63 4c  ndex in the SrcL
23a0: 69 73 74 20 74 68 61 74 20 75 73 65 73 20 63 75  ist that uses cu
23b0: 72 73 6f 72 20 69 43 75 72 2e 20 20 49 66 20 69  rsor iCur.  If i
23c0: 43 75 72 20 69 73 0a 2a 2a 20 75 73 65 64 20 62  Cur is.** used b
23d0: 79 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  y the first entr
23e0: 79 20 69 6e 20 53 72 63 4c 69 73 74 20 72 65 74  y in SrcList ret
23f0: 75 72 6e 20 30 2e 20 20 49 66 20 69 43 75 72 20  urn 0.  If iCur 
2400: 69 73 20 75 73 65 64 20 62 79 0a 2a 2a 20 74 68  is used by.** th
2410: 65 20 73 65 63 6f 6e 64 20 65 6e 74 72 79 20 72  e second entry r
2420: 65 74 75 72 6e 20 31 2e 20 20 41 6e 64 20 73 6f  eturn 1.  And so
2430: 20 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 53 72   forth..**.** Sr
2440: 63 4c 69 73 74 20 69 73 20 74 68 65 20 73 65 74  cList is the set
2450: 20 6f 66 20 74 61 62 6c 65 73 20 69 6e 20 74 68   of tables in th
2460: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e  e FROM clause in
2470: 20 74 68 65 20 6f 72 64 65 72 20 74 68 61 74 0a   the order that.
2480: 2a 2a 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  ** they will be 
2490: 70 72 6f 63 65 73 73 65 64 2e 20 20 54 68 65 20  processed.  The 
24a0: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 68  value returned h
24b0: 65 72 65 20 67 69 76 65 73 20 75 73 20 61 6e 20  ere gives us an 
24c0: 69 6e 64 65 78 0a 2a 2a 20 6f 66 20 77 68 69 63  index.** of whic
24d0: 68 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 62 65  h tables will be
24e0: 20 70 72 6f 63 65 73 73 65 64 20 66 69 72 73 74   processed first
24f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2500: 74 61 62 6c 65 4f 72 64 65 72 28 53 72 63 4c 69  tableOrder(SrcLi
2510: 73 74 20 2a 70 4c 69 73 74 2c 20 69 6e 74 20 69  st *pList, int i
2520: 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Cur){.  int i;. 
2530: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2540: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 66  item *pItem;.  f
2550: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4c  or(i=0, pItem=pL
2560: 69 73 74 2d 3e 61 3b 20 69 3c 70 4c 69 73 74 2d  ist->a; i<pList-
2570: 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65  >nSrc; i++, pIte
2580: 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 49  m++){.    if( pI
2590: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3d 3d 69 43  tem->iCursor==iC
25a0: 75 72 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20  ur ) return i;. 
25b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a   }.  return -1;.
25c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70  }../*.** The inp
25d0: 75 74 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ut to this routi
25e0: 6e 65 20 69 73 20 61 6e 20 45 78 70 72 49 6e 66  ne is an ExprInf
25f0: 6f 20 73 74 72 75 63 74 75 72 65 20 77 69 74 68  o structure with
2600: 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 22 70 22   only the.** "p"
2610: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 20 69 6e   field filled in
2620: 2e 20 20 54 68 65 20 6a 6f 62 20 6f 66 20 74 68  .  The job of th
2630: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
2640: 20 61 6e 61 6c 79 7a 65 20 74 68 65 0a 2a 2a 20   analyze the.** 
2650: 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  subexpression an
2660: 64 20 70 6f 70 75 6c 61 74 65 20 61 6c 6c 20 74  d populate all t
2670: 68 65 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20  he other fields 
2680: 6f 66 20 74 68 65 20 45 78 70 72 49 6e 66 6f 0a  of the ExprInfo.
2690: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  ** structure..*/
26a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70  .static void exp
26b0: 72 41 6e 61 6c 79 7a 65 28 53 72 63 4c 69 73 74  rAnalyze(SrcList
26c0: 20 2a 70 53 72 63 2c 20 45 78 70 72 4d 61 73 6b   *pSrc, ExprMask
26d0: 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20 45  Set *pMaskSet, E
26e0: 78 70 72 49 6e 66 6f 20 2a 70 49 6e 66 6f 29 7b  xprInfo *pInfo){
26f0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d  .  Expr *pExpr =
2700: 20 70 49 6e 66 6f 2d 3e 70 3b 0a 20 20 70 49 6e   pInfo->p;.  pIn
2710: 66 6f 2d 3e 70 72 65 72 65 71 4c 65 66 74 20 3d  fo->prereqLeft =
2720: 20 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28   exprTableUsage(
2730: 70 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d  pMaskSet, pExpr-
2740: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 49 6e 66 6f  >pLeft);.  pInfo
2750: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 3d 20  ->prereqRight = 
2760: 65 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 70  exprTableUsage(p
2770: 4d 61 73 6b 53 65 74 2c 20 70 45 78 70 72 2d 3e  MaskSet, pExpr->
2780: 70 52 69 67 68 74 29 3b 0a 20 20 70 49 6e 66 6f  pRight);.  pInfo
2790: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 3d 20 65 78  ->prereqAll = ex
27a0: 70 72 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61  prTableUsage(pMa
27b0: 73 6b 53 65 74 2c 20 70 45 78 70 72 29 3b 0a 20  skSet, pExpr);. 
27c0: 20 70 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c   pInfo->indexabl
27d0: 65 20 3d 20 30 3b 0a 20 20 70 49 6e 66 6f 2d 3e  e = 0;.  pInfo->
27e0: 69 64 78 4c 65 66 74 20 3d 20 2d 31 3b 0a 20 20  idxLeft = -1;.  
27f0: 70 49 6e 66 6f 2d 3e 69 64 78 52 69 67 68 74 20  pInfo->idxRight 
2800: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 6c 6c 6f  = -1;.  if( allo
2810: 77 65 64 4f 70 28 70 45 78 70 72 2d 3e 6f 70 29  wedOp(pExpr->op)
2820: 20 26 26 20 28 70 49 6e 66 6f 2d 3e 70 72 65 72   && (pInfo->prer
2830: 65 71 52 69 67 68 74 20 26 20 70 49 6e 66 6f 2d  eqRight & pInfo-
2840: 3e 70 72 65 72 65 71 4c 65 66 74 29 3d 3d 30 20  >prereqLeft)==0 
2850: 29 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  ){.    if( pExpr
2860: 2d 3e 70 52 69 67 68 74 20 26 26 20 70 45 78 70  ->pRight && pExp
2870: 72 2d 3e 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  r->pRight->op==T
2880: 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  K_COLUMN ){.    
2890: 20 20 70 49 6e 66 6f 2d 3e 69 64 78 52 69 67 68    pInfo->idxRigh
28a0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
28b0: 74 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  t->iTable;.     
28c0: 20 70 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c   pInfo->indexabl
28d0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  e = 1;.    }.   
28e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
28f0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  t->op==TK_COLUMN
2900: 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d   ){.      pInfo-
2910: 3e 69 64 78 4c 65 66 74 20 3d 20 70 45 78 70 72  >idxLeft = pExpr
2920: 2d 3e 70 4c 65 66 74 2d 3e 69 54 61 62 6c 65 3b  ->pLeft->iTable;
2930: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 69 6e  .      pInfo->in
2940: 64 65 78 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20  dexable = 1;.   
2950: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e   }.  }.  if( pIn
2960: 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65 20 29 7b  fo->indexable ){
2970: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
2980: 66 6f 2d 3e 69 64 78 4c 65 66 74 21 3d 70 49 6e  fo->idxLeft!=pIn
2990: 66 6f 2d 3e 69 64 78 52 69 67 68 74 20 29 3b 0a  fo->idxRight );.
29a0: 0a 20 20 20 20 2f 2a 20 57 65 20 77 61 6e 74 20  .    /* We want 
29b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
29c0: 6f 20 62 65 20 6f 66 20 74 68 65 20 66 6f 72 6d  o be of the form
29d0: 20 22 58 20 3d 20 65 78 70 72 22 2c 20 6e 6f 74   "X = expr", not
29e0: 20 22 65 78 70 72 20 3d 20 58 22 2e 0a 20 20 20   "expr = X"..   
29f0: 20 2a 2a 20 53 6f 20 66 6c 69 70 20 69 74 20 6f   ** So flip it o
2a00: 76 65 72 20 69 66 20 6e 65 63 65 73 73 61 72 79  ver if necessary
2a10: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
2a20: 73 69 6f 6e 20 69 73 20 22 58 20 3d 20 59 22 2c  sion is "X = Y",
2a30: 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   then.    ** we 
2a40: 77 61 6e 74 20 59 20 74 6f 20 63 6f 6d 65 20 66  want Y to come f
2a50: 72 6f 6d 20 61 6e 20 65 61 72 6c 69 65 72 20 74  rom an earlier t
2a60: 61 62 6c 65 20 74 68 61 6e 20 58 2e 0a 20 20 20  able than X..   
2a70: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 63   **.    ** The c
2a80: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
2a90: 65 20 72 75 6c 65 20 69 73 20 74 6f 20 61 6c 77  e rule is to alw
2aa0: 61 79 73 20 63 68 6f 6f 73 65 20 74 68 65 20 6c  ays choose the l
2ab0: 65 66 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  eft expression..
2ac0: 20 20 20 20 2a 2a 20 53 6f 20 69 66 20 77 65 20      ** So if we 
2ad0: 64 6f 20 61 20 66 6c 69 70 2c 20 77 65 20 61 6c  do a flip, we al
2ae0: 73 6f 20 68 61 76 65 20 74 6f 20 6d 6f 76 65 20  so have to move 
2af0: 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  the collating se
2b00: 71 75 65 6e 63 65 2e 0a 20 20 20 20 2a 2f 0a 20  quence..    */. 
2b10: 20 20 20 69 66 28 20 74 61 62 6c 65 4f 72 64 65     if( tableOrde
2b20: 72 28 70 53 72 63 2c 70 49 6e 66 6f 2d 3e 69 64  r(pSrc,pInfo->id
2b30: 78 4c 65 66 74 29 3c 74 61 62 6c 65 4f 72 64 65  xLeft)<tableOrde
2b40: 72 28 70 53 72 63 2c 70 49 6e 66 6f 2d 3e 69 64  r(pSrc,pInfo->id
2b50: 78 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  xRight) ){.     
2b60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
2b70: 6f 70 21 3d 54 4b 5f 49 4e 20 29 3b 0a 20 20 20  op!=TK_IN );.   
2b80: 20 20 20 53 57 41 50 28 43 6f 6c 6c 53 65 71 2a     SWAP(CollSeq*
2b90: 2c 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2d 3e  ,pExpr->pRight->
2ba0: 70 43 6f 6c 6c 2c 70 45 78 70 72 2d 3e 70 4c 65  pColl,pExpr->pLe
2bb0: 66 74 2d 3e 70 43 6f 6c 6c 29 3b 0a 20 20 20 20  ft->pColl);.    
2bc0: 20 20 53 57 41 50 28 45 78 70 72 2a 2c 70 45 78    SWAP(Expr*,pEx
2bd0: 70 72 2d 3e 70 52 69 67 68 74 2c 70 45 78 70 72  pr->pRight,pExpr
2be0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
2bf0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54  if( pExpr->op>=T
2c00: 4b 5f 47 54 20 29 7b 0a 20 20 20 20 20 20 20 20  K_GT ){.        
2c10: 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 54  assert( TK_LT==T
2c20: 4b 5f 47 54 2b 32 20 29 3b 0a 20 20 20 20 20 20  K_GT+2 );.      
2c30: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45 3d    assert( TK_GE=
2c40: 3d 54 4b 5f 4c 45 2b 32 20 29 3b 0a 20 20 20 20  =TK_LE+2 );.    
2c50: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
2c60: 54 3e 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20  T>TK_EQ );.     
2c70: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54     assert( TK_GT
2c80: 3c 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  <TK_LE );.      
2c90: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
2ca0: 3e 6f 70 3e 3d 54 4b 5f 47 54 20 26 26 20 70 45  >op>=TK_GT && pE
2cb0: 78 70 72 2d 3e 6f 70 3c 3d 54 4b 5f 47 45 20 29  xpr->op<=TK_GE )
2cc0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
2cd0: 3e 6f 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f  >op = ((pExpr->o
2ce0: 70 2d 54 4b 5f 47 54 29 5e 32 29 2b 54 4b 5f 47  p-TK_GT)^2)+TK_G
2cf0: 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
2d00: 20 53 57 41 50 28 75 6e 73 69 67 6e 65 64 2c 20   SWAP(unsigned, 
2d10: 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71 4c 65 66  pInfo->prereqLef
2d20: 74 2c 20 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71  t, pInfo->prereq
2d30: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 53 57  Right);.      SW
2d40: 41 50 28 73 68 6f 72 74 20 69 6e 74 2c 20 70 49  AP(short int, pI
2d50: 6e 66 6f 2d 3e 69 64 78 4c 65 66 74 2c 20 70 49  nfo->idxLeft, pI
2d60: 6e 66 6f 2d 3e 69 64 78 52 69 67 68 74 29 3b 0a  nfo->idxRight);.
2d70: 20 20 20 20 7d 0a 20 20 7d 20 20 20 20 20 20 0a      }.  }      .
2d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2d90: 6f 75 74 69 6e 65 20 64 65 63 69 64 65 73 20 69  outine decides i
2da0: 66 20 70 49 64 78 20 63 61 6e 20 62 65 20 75 73  f pIdx can be us
2db0: 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 74 68  ed to satisfy th
2dc0: 65 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c  e ORDER BY.** cl
2dd0: 61 75 73 65 2e 20 20 49 66 20 69 74 20 63 61 6e  ause.  If it can
2de0: 2c 20 69 74 20 72 65 74 75 72 6e 73 20 31 2e 20  , it returns 1. 
2df0: 20 49 66 20 70 49 64 78 20 63 61 6e 6e 6f 74 20   If pIdx cannot 
2e00: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 4f  satisfy the.** O
2e10: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20  RDER BY clause, 
2e20: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2e30: 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 4f  urns 0..**.** pO
2e40: 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f 52 44  rderBy is an ORD
2e50: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 72 6f  ER BY clause fro
2e60: 6d 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65  m a SELECT state
2e70: 6d 65 6e 74 2e 20 20 70 54 61 62 20 69 73 20 74  ment.  pTab is t
2e80: 68 65 0a 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20  he.** left-most 
2e90: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
2ea0: 4d 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74  M clause of that
2eb0: 20 73 61 6d 65 20 53 45 4c 45 43 54 20 73 74 61   same SELECT sta
2ec0: 74 65 6d 65 6e 74 20 61 6e 64 0a 2a 2a 20 74 68  tement and.** th
2ed0: 65 20 74 61 62 6c 65 20 68 61 73 20 61 20 63 75  e table has a cu
2ee0: 72 73 6f 72 20 6e 75 6d 62 65 72 20 6f 66 20 22  rsor number of "
2ef0: 62 61 73 65 22 2e 20 20 70 49 64 78 20 69 73 20  base".  pIdx is 
2f00: 61 6e 20 69 6e 64 65 78 20 6f 6e 20 70 54 61 62  an index on pTab
2f10: 2e 0a 2a 2a 0a 2a 2a 20 6e 45 71 43 6f 6c 20 69  ..**.** nEqCol i
2f20: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
2f30: 63 6f 6c 75 6d 6e 73 20 6f 66 20 70 49 64 78 20  columns of pIdx 
2f40: 74 68 61 74 20 61 72 65 20 75 73 65 64 20 61 73  that are used as
2f50: 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20 63 6f 6e   equality.** con
2f60: 73 74 72 61 69 6e 74 73 2e 20 20 41 6e 79 20 6f  straints.  Any o
2f70: 66 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  f these columns 
2f80: 6d 61 79 20 62 65 20 6d 69 73 73 69 6e 67 20 66  may be missing f
2f90: 72 6f 6d 20 74 68 65 20 4f 52 44 45 52 20 42 59  rom the ORDER BY
2fa0: 0a 2a 2a 20 63 6c 61 75 73 65 20 61 6e 64 20 74  .** clause and t
2fb0: 68 65 20 6d 61 74 63 68 20 63 61 6e 20 73 74 69  he match can sti
2fc0: 6c 6c 20 62 65 20 61 20 73 75 63 63 65 73 73 2e  ll be a success.
2fd0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
2fe0: 64 65 78 20 69 73 20 55 4e 49 51 55 45 2c 20 74  dex is UNIQUE, t
2ff0: 68 65 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59  hen the ORDER BY
3000: 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c 6f 77   clause is allow
3010: 65 64 20 74 6f 20 68 61 76 65 0a 2a 2a 20 61 64  ed to have.** ad
3020: 64 69 74 69 6f 6e 61 6c 20 74 65 72 6d 73 20 70  ditional terms p
3030: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ast the end of t
3040: 68 65 20 69 6e 64 65 78 20 61 6e 64 20 74 68 65  he index and the
3050: 20 6d 61 74 63 68 20 77 69 6c 6c 20 73 74 69 6c   match will stil
3060: 6c 0a 2a 2a 20 62 65 20 61 20 73 75 63 63 65 73  l.** be a succes
3070: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 74 65 72  s..**.** All ter
3080: 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  ms of the ORDER 
3090: 42 59 20 74 68 61 74 20 6d 61 74 63 68 20 61 67  BY that match ag
30a0: 61 69 6e 73 74 20 74 68 65 20 69 6e 64 65 78 20  ainst the index 
30b0: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 0a 2a  must be either.*
30c0: 2a 20 41 53 43 20 6f 72 20 44 45 53 43 2e 20 20  * ASC or DESC.  
30d0: 28 54 65 72 6d 73 20 6f 66 20 74 68 65 20 4f 52  (Terms of the OR
30e0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 70 61  DER BY clause pa
30f0: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  st the end of a 
3100: 55 4e 49 51 55 45 0a 2a 2a 20 69 6e 64 65 78 20  UNIQUE.** index 
3110: 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 73  do not need to s
3120: 61 74 69 73 66 79 20 74 68 69 73 20 63 6f 6e 73  atisfy this cons
3130: 74 72 61 69 6e 74 2e 29 20 20 54 68 65 20 2a 70  traint.)  The *p
3140: 62 52 65 76 20 76 61 6c 75 65 20 69 73 0a 2a 2a  bRev value is.**
3150: 20 73 65 74 20 74 6f 20 31 20 69 66 20 74 68 65   set to 1 if the
3160: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
3170: 20 69 73 20 61 6c 6c 20 44 45 53 43 20 61 6e 64   is all DESC and
3180: 20 69 74 20 69 73 20 73 65 74 20 74 6f 20 30 20   it is set to 0 
3190: 69 66 0a 2a 2a 20 74 68 65 20 4f 52 44 45 52 20  if.** the ORDER 
31a0: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
31b0: 20 41 53 43 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   ASC..*/.static 
31c0: 69 6e 74 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  int isSortingInd
31d0: 65 78 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  ex(.  Parse *pPa
31e0: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
31f0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
3200: 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64   */.  Index *pId
3210: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  x,            /*
3220: 20 54 68 65 20 69 6e 64 65 78 20 77 65 20 61 72   The index we ar
3230: 65 20 74 65 73 74 69 6e 67 20 2a 2f 0a 20 20 54  e testing */.  T
3240: 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
3250: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
3260: 62 6c 65 20 74 6f 20 62 65 20 73 6f 72 74 65 64  ble to be sorted
3270: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 65 2c 20   */.  int base, 
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3290: 20 43 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   Cursor number f
32a0: 6f 72 20 70 54 61 62 20 2a 2f 0a 20 20 45 78 70  or pTab */.  Exp
32b0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
32c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45       /* The ORDE
32d0: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
32e0: 20 69 6e 74 20 6e 45 71 43 6f 6c 2c 20 20 20 20   int nEqCol,    
32f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3300: 65 72 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  er of index colu
3310: 6d 6e 73 20 77 69 74 68 20 3d 3d 20 63 6f 6e 73  mns with == cons
3320: 74 72 61 69 6e 74 73 20 2a 2f 0a 20 20 69 6e 74  traints */.  int
3330: 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20   *pbRev         
3340: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
3350: 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20   if ORDER BY is 
3360: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  DESC */.){.  int
3370: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
3380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
3390: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
33a0: 69 6e 74 20 73 6f 72 74 4f 72 64 65 72 3b 20 20  int sortOrder;  
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33c0: 57 68 69 63 68 20 64 69 72 65 63 74 69 6f 6e 20  Which direction 
33d0: 77 65 20 61 72 65 20 73 6f 72 74 69 6e 67 20 2a  we are sorting *
33e0: 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20 20  /.  int nTerm;  
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 52   /* Number of OR
3410: 44 45 52 20 42 59 20 74 65 72 6d 73 20 2a 2f 0a  DER BY terms */.
3420: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
3430: 74 5f 69 74 65 6d 20 2a 70 54 65 72 6d 3b 20 2f  t_item *pTerm; /
3440: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
3450: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
3460: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
3470: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 0a   = pParse->db;..
3480: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
3490: 42 79 21 3d 30 20 29 3b 0a 20 20 6e 54 65 72 6d  By!=0 );.  nTerm
34a0: 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   = pOrderBy->nEx
34b0: 70 72 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54  pr;.  assert( nT
34c0: 65 72 6d 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  erm>0 );..  /* M
34d0: 61 74 63 68 20 74 65 72 6d 73 20 6f 66 20 74 68  atch terms of th
34e0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
34f0: 65 20 61 67 61 69 6e 73 74 20 63 6f 6c 75 6d 6e  e against column
3500: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 69 6e  s of.  ** the in
3510: 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  dex..  */.  for(
3520: 69 3d 6a 3d 30 2c 20 70 54 65 72 6d 3d 70 4f 72  i=j=0, pTerm=pOr
3530: 64 65 72 42 79 2d 3e 61 3b 20 6a 3c 6e 54 65 72  derBy->a; j<nTer
3540: 6d 20 26 26 20 69 3c 70 49 64 78 2d 3e 6e 43 6f  m && i<pIdx->nCo
3550: 6c 75 6d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lumn; i++){.    
3560: 45 78 70 72 20 2a 70 45 78 70 72 3b 20 20 20 20  Expr *pExpr;    
3570: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
3580: 73 69 6f 6e 20 6f 66 20 74 68 65 20 4f 52 44 45  sion of the ORDE
3590: 52 20 42 59 20 70 54 65 72 6d 20 2a 2f 0a 20 20  R BY pTerm */.  
35a0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
35b0: 3b 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  ;    /* The coll
35c0: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 6f  ating sequence o
35d0: 66 20 70 45 78 70 72 20 2a 2f 0a 0a 20 20 20 20  f pExpr */..    
35e0: 70 45 78 70 72 20 3d 20 70 54 65 72 6d 2d 3e 70  pExpr = pTerm->p
35f0: 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70 45  Expr;.    if( pE
3600: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55  xpr->op!=TK_COLU
3610: 4d 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 69 54 61  MN || pExpr->iTa
3620: 62 6c 65 21 3d 62 61 73 65 20 29 7b 0a 20 20 20  ble!=base ){.   
3630: 20 20 20 2f 2a 20 43 61 6e 20 6e 6f 74 20 75 73     /* Can not us
3640: 65 20 61 6e 20 69 6e 64 65 78 20 73 6f 72 74 20  e an index sort 
3650: 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61 74  on anything that
3660: 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d 6e   is not a column
3670: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3680: 20 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65   left-most table
3690: 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   of the FROM cla
36a0: 75 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  use */.      ret
36b0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
36c0: 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33   pColl = sqlite3
36d0: 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72  ExprCollSeq(pPar
36e0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
36f0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
3700: 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ll = db->pDfltCo
3710: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  ll;.    if( pExp
3720: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 49 64 78  r->iColumn!=pIdx
3730: 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 69 5d 20 7c 7c  ->aiColumn[i] ||
3740: 20 70 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65   pColl!=pIdx->ke
3750: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 69 5d 20 29  yInfo.aColl[i] )
3760: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  {.      /* Term 
3770: 6a 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  j of the ORDER B
3780: 59 20 63 6c 61 75 73 65 20 64 6f 65 73 20 6e 6f  Y clause does no
3790: 74 20 6d 61 74 63 68 20 63 6f 6c 75 6d 6e 20 69  t match column i
37a0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 2a 2f   of the index */
37b0: 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 45 71  .      if( i<nEq
37c0: 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Col ){.        /
37d0: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
37e0: 6c 75 6d 6e 20 74 68 61 74 20 69 73 20 63 6f 6e  lumn that is con
37f0: 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d 20 66  strained by == f
3800: 61 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e  ails to match an
3810: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 52 44 45  .        ** ORDE
3820: 52 20 42 59 20 74 65 72 6d 2c 20 74 68 61 74 20  R BY term, that 
3830: 69 73 20 4f 4b 2e 20 20 4a 75 73 74 20 69 67 6e  is OK.  Just ign
3840: 6f 72 65 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  ore that column 
3850: 6f 66 20 74 68 65 20 69 6e 64 65 78 0a 20 20 20  of the index.   
3860: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
3870: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3880: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
3890: 2a 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f  * If an index co
38a0: 6c 75 6d 6e 20 66 61 69 6c 73 20 74 6f 20 6d 61  lumn fails to ma
38b0: 74 63 68 20 61 6e 64 20 69 73 20 6e 6f 74 20 63  tch and is not c
38c0: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 3d 3d  onstrained by ==
38d0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
38e0: 20 74 68 65 20 69 6e 64 65 78 20 63 61 6e 6e 6f   the index canno
38f0: 74 20 73 61 74 69 73 66 79 20 74 68 65 20 4f 52  t satisfy the OR
3900: 44 45 52 20 42 59 20 63 6f 6e 73 74 72 61 69 6e  DER BY constrain
3910: 74 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  t..        */.  
3920: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3930: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3940: 20 20 69 66 28 20 69 3e 6e 45 71 43 6f 6c 20 29    if( i>nEqCol )
3950: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 54 65 72  {.      if( pTer
3960: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 21 3d 73 6f  m->sortOrder!=so
3970: 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 20  rtOrder ){.     
3980: 20 20 20 2f 2a 20 49 6e 64 69 63 65 73 20 63 61     /* Indices ca
3990: 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 69  n only be used i
39a0: 66 20 61 6c 6c 20 4f 52 44 45 52 20 42 59 20 74  f all ORDER BY t
39b0: 65 72 6d 73 20 70 61 73 74 20 74 68 65 0a 20 20  erms past the.  
39c0: 20 20 20 20 20 20 2a 2a 20 65 71 75 61 6c 69 74        ** equalit
39d0: 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 72  y constraints ar
39e0: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 44 45 53  e all either DES
39f0: 43 20 6f 72 20 41 53 43 2e 20 2a 2f 0a 20 20 20  C or ASC. */.   
3a00: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3a10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
3a20: 7b 0a 20 20 20 20 20 20 73 6f 72 74 4f 72 64 65  {.      sortOrde
3a30: 72 20 3d 20 70 54 65 72 6d 2d 3e 73 6f 72 74 4f  r = pTerm->sortO
3a40: 72 64 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rder;.    }.    
3a50: 6a 2b 2b 3b 0a 20 20 20 20 70 54 65 72 6d 2b 2b  j++;.    pTerm++
3a60: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
3a70: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
3a80: 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 69 66  d for sorting if
3a90: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
3aa0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3ab0: 65 0a 20 20 2a 2a 20 6f 72 20 63 6f 76 65 72 65  e.  ** or covere
3ac0: 64 20 6f 72 20 69 66 20 77 65 20 72 61 6e 20 6f  d or if we ran o
3ad0: 75 74 20 6f 66 20 69 6e 64 65 78 20 63 6f 6c 75  ut of index colu
3ae0: 6d 6e 73 20 61 6e 64 20 74 68 65 20 69 74 20 69  mns and the it i
3af0: 73 20 61 20 55 4e 49 51 55 45 0a 20 20 2a 2a 20  s a UNIQUE.  ** 
3b00: 69 6e 64 65 78 2e 0a 20 20 2a 2f 0a 20 20 69 66  index..  */.  if
3b10: 28 20 6a 3e 3d 6e 54 65 72 6d 20 7c 7c 20 28 69  ( j>=nTerm || (i
3b20: 3e 3d 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 20  >=pIdx->nColumn 
3b30: 26 26 20 70 49 64 78 2d 3e 6f 6e 45 72 72 6f 72  && pIdx->onError
3b40: 21 3d 4f 45 5f 4e 6f 6e 65 29 20 29 7b 0a 20 20  !=OE_None) ){.  
3b50: 20 20 2a 70 62 52 65 76 20 3d 20 73 6f 72 74 4f    *pbRev = sortO
3b60: 72 64 65 72 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f  rder==SQLITE_SO_
3b70: 44 45 53 43 3b 0a 20 20 20 20 72 65 74 75 72 6e  DESC;.    return
3b80: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
3b90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65   0;.}../*.** Che
3ba0: 63 6b 20 74 61 62 6c 65 20 74 6f 20 73 65 65 20  ck table to see 
3bb0: 69 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  if the ORDER BY 
3bc0: 63 6c 61 75 73 65 20 69 6e 20 70 4f 72 64 65 72  clause in pOrder
3bd0: 42 79 20 63 61 6e 20 62 65 20 73 61 74 69 73 66  By can be satisf
3be0: 69 65 64 0a 2a 2a 20 62 79 20 73 6f 72 74 69 6e  ied.** by sortin
3bf0: 67 20 69 6e 20 6f 72 64 65 72 20 6f 66 20 52 4f  g in order of RO
3c00: 57 49 44 2e 20 20 52 65 74 75 72 6e 20 74 72 75  WID.  Return tru
3c10: 65 20 69 66 20 73 6f 20 61 6e 64 20 73 65 74 20  e if so and set 
3c20: 2a 70 62 52 65 76 20 74 6f 20 62 65 0a 2a 2a 20  *pbRev to be.** 
3c30: 74 72 75 65 20 66 6f 72 20 72 65 76 65 72 73 65  true for reverse
3c40: 20 52 4f 57 49 44 20 61 6e 64 20 66 61 6c 73 65   ROWID and false
3c50: 20 66 6f 72 20 66 6f 72 77 61 72 64 20 52 4f 57   for forward ROW
3c60: 49 44 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ID order..*/.sta
3c70: 74 69 63 20 69 6e 74 20 73 6f 72 74 61 62 6c 65  tic int sortable
3c80: 42 79 52 6f 77 69 64 28 0a 20 20 69 6e 74 20 62  ByRowid(.  int b
3c90: 61 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ase,            
3ca0: 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 75 6d     /* Cursor num
3cb0: 62 65 72 20 66 6f 72 20 74 61 62 6c 65 20 74 6f  ber for table to
3cc0: 20 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20   be sorted */.  
3cd0: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
3ce0: 42 79 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  By,     /* The O
3cf0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a  RDER BY clause *
3d00: 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76 20 20  /.  int *pbRev  
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3d20: 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44 45 52  et to 1 if ORDER
3d30: 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f 0a 29   BY is DESC */.)
3d40: 7b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 0a 20 20  {.  Expr *p;..  
3d50: 61 73 73 65 72 74 28 20 70 4f 72 64 65 72 42 79  assert( pOrderBy
3d60: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
3d70: 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72   pOrderBy->nExpr
3d80: 3e 30 20 29 3b 0a 20 20 70 20 3d 20 70 4f 72 64  >0 );.  p = pOrd
3d90: 65 72 42 79 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  erBy->a[0].pExpr
3da0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 3d 3d 54  ;.  if( p->op==T
3db0: 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20 70 2d 3e 69  K_COLUMN && p->i
3dc0: 54 61 62 6c 65 3d 3d 62 61 73 65 20 26 26 20 70  Table==base && p
3dd0: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 2d 31 20 29 7b  ->iColumn==-1 ){
3de0: 0a 20 20 20 20 2a 70 62 52 65 76 20 3d 20 70 4f  .    *pbRev = pO
3df0: 72 64 65 72 42 79 2d 3e 61 5b 30 5d 2e 73 6f 72  rderBy->a[0].sor
3e00: 74 4f 72 64 65 72 3b 0a 20 20 20 20 72 65 74 75  tOrder;.    retu
3e10: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
3e20: 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
3e30: 44 69 73 61 62 6c 65 20 61 20 74 65 72 6d 20 69  Disable a term i
3e40: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
3e50: 73 65 2e 20 20 45 78 63 65 70 74 2c 20 64 6f 20  se.  Except, do 
3e60: 6e 6f 74 20 64 69 73 61 62 6c 65 20 74 68 65 20  not disable the 
3e70: 74 65 72 6d 0a 2a 2a 20 69 66 20 69 74 20 63 6f  term.** if it co
3e80: 6e 74 72 6f 6c 73 20 61 20 4c 45 46 54 20 4f 55  ntrols a LEFT OU
3e90: 54 45 52 20 4a 4f 49 4e 20 61 6e 64 20 69 74 20  TER JOIN and it 
3ea0: 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61 74  did not originat
3eb0: 65 20 69 6e 20 74 68 65 20 4f 4e 0a 2a 2a 20 6f  e in the ON.** o
3ec0: 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20 6f  r USING clause o
3ed0: 66 20 74 68 61 74 20 6a 6f 69 6e 2e 0a 2a 2a 0a  f that join..**.
3ee0: 2a 2a 20 43 6f 6e 73 69 64 65 72 20 74 68 65 20  ** Consider the 
3ef0: 74 65 72 6d 20 74 32 2e 7a 3d 27 6f 6b 27 20 69  term t2.z='ok' i
3f00: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  n the following 
3f10: 71 75 65 72 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  queries:.**.**  
3f20: 20 28 31 29 20 20 53 45 4c 45 43 54 20 2a 20 46   (1)  SELECT * F
3f30: 52 4f 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e  ROM t1 LEFT JOIN
3f40: 20 74 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78   t2 ON t1.a=t2.x
3f50: 20 57 48 45 52 45 20 74 32 2e 7a 3d 27 6f 6b 27   WHERE t2.z='ok'
3f60: 0a 2a 2a 20 20 20 28 32 29 20 20 53 45 4c 45 43  .**   (2)  SELEC
3f70: 54 20 2a 20 46 52 4f 4d 20 74 31 20 4c 45 46 54  T * FROM t1 LEFT
3f80: 20 4a 4f 49 4e 20 74 32 20 4f 4e 20 74 31 2e 61   JOIN t2 ON t1.a
3f90: 3d 74 32 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27  =t2.x AND t2.z='
3fa0: 6f 6b 27 0a 2a 2a 20 20 20 28 33 29 20 20 53 45  ok'.**   (3)  SE
3fb0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20  LECT * FROM t1, 
3fc0: 74 32 20 57 48 45 52 45 20 74 31 2e 61 3d 74 32  t2 WHERE t1.a=t2
3fd0: 2e 78 20 41 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27  .x AND t2.z='ok'
3fe0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 32 2e 7a 3d  .**.** The t2.z=
3ff0: 27 6f 6b 27 20 69 73 20 64 69 73 61 62 6c 65 64  'ok' is disabled
4000: 20 69 6e 20 74 68 65 20 69 6e 20 28 32 29 20 62   in the in (2) b
4010: 65 63 61 75 73 65 20 69 74 20 6f 72 69 67 69 6e  ecause it origin
4020: 61 74 65 73 0a 2a 2a 20 69 6e 20 74 68 65 20 4f  ates.** in the O
4030: 4e 20 63 6c 61 75 73 65 2e 20 20 54 68 65 20 74  N clause.  The t
4040: 65 72 6d 20 69 73 20 64 69 73 61 62 6c 65 64 20  erm is disabled 
4050: 69 6e 20 28 33 29 20 62 65 63 61 75 73 65 20 69  in (3) because i
4060: 74 20 69 73 20 6e 6f 74 20 70 61 72 74 0a 2a 2a  t is not part.**
4070: 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54 45 52   of a LEFT OUTER
4080: 20 4a 4f 49 4e 2e 20 20 49 6e 20 28 31 29 2c 20   JOIN.  In (1), 
4090: 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  the term is not 
40a0: 64 69 73 61 62 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  disabled..**.** 
40b0: 44 69 73 61 62 6c 69 6e 67 20 61 20 74 65 72 6d  Disabling a term
40c0: 20 63 61 75 73 65 73 20 74 68 61 74 20 74 65 72   causes that ter
40d0: 6d 20 74 6f 20 6e 6f 74 20 62 65 20 74 65 73 74  m to not be test
40e0: 65 64 20 69 6e 20 74 68 65 20 69 6e 6e 65 72 20  ed in the inner 
40f0: 6c 6f 6f 70 0a 2a 2a 20 6f 66 20 74 68 65 20 6a  loop.** of the j
4100: 6f 69 6e 2e 20 20 44 69 73 61 62 6c 69 6e 67 20  oin.  Disabling 
4110: 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  is an optimizati
4120: 6f 6e 2e 20 20 57 65 20 77 6f 75 6c 64 20 67 65  on.  We would ge
4130: 74 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  t the correct.**
4140: 20 72 65 73 75 6c 74 73 20 69 66 20 6e 6f 74 68   results if noth
4150: 69 6e 67 20 77 65 72 65 20 65 76 65 72 20 64 69  ing were ever di
4160: 73 61 62 6c 65 64 2c 20 62 75 74 20 6a 6f 69 6e  sabled, but join
4170: 73 20 6d 69 67 68 74 20 72 75 6e 20 61 20 6c 69  s might run a li
4180: 74 74 6c 65 0a 2a 2a 20 73 6c 6f 77 65 72 2e 20  ttle.** slower. 
4190: 20 54 68 65 20 74 72 69 63 6b 20 69 73 20 74 6f   The trick is to
41a0: 20 64 69 73 61 62 6c 65 20 61 73 20 6d 75 63 68   disable as much
41b0: 20 61 73 20 77 65 20 63 61 6e 20 77 69 74 68 6f   as we can witho
41c0: 75 74 20 64 69 73 61 62 6c 69 6e 67 0a 2a 2a 20  ut disabling.** 
41d0: 74 6f 6f 20 6d 75 63 68 2e 20 20 49 66 20 77 65  too much.  If we
41e0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 28 31 29   disabled in (1)
41f0: 2c 20 77 65 27 64 20 67 65 74 20 74 68 65 20 77  , we'd get the w
4200: 72 6f 6e 67 20 61 6e 73 77 65 72 2e 0a 2a 2a 20  rong answer..** 
4210: 53 65 65 20 74 69 63 6b 65 74 20 23 38 31 33 2e  See ticket #813.
4220: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4230: 64 69 73 61 62 6c 65 54 65 72 6d 28 57 68 65 72  disableTerm(Wher
4240: 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 2c 20  eLevel *pLevel, 
4250: 45 78 70 72 20 2a 2a 70 70 45 78 70 72 29 7b 0a  Expr **ppExpr){.
4260: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 3d 20    Expr *pExpr = 
4270: 2a 70 70 45 78 70 72 3b 0a 20 20 69 66 28 20 70  *ppExpr;.  if( p
4280: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
4290: 3d 3d 30 20 7c 7c 20 45 78 70 72 48 61 73 50 72  ==0 || ExprHasPr
42a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
42b0: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20  _FromJoin) ){.  
42c0: 20 20 2a 70 70 45 78 70 72 20 3d 20 30 3b 0a 20    *ppExpr = 0;. 
42d0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
42e0: 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 62  rate code that b
42f0: 75 69 6c 64 73 20 61 20 70 72 6f 62 65 20 66 6f  uilds a probe fo
4300: 72 20 61 6e 20 69 6e 64 65 78 2e 20 20 44 65 74  r an index.  Det
4310: 61 69 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  ails:.**.**    *
4320: 20 20 43 68 65 63 6b 20 74 68 65 20 74 6f 70 20    Check the top 
4330: 6e 43 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20  nColumn entries 
4340: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 49  on the stack.  I
4350: 66 20 61 6e 79 0a 2a 2a 20 20 20 20 20 20 20 6f  f any.**       o
4360: 66 20 74 68 6f 73 65 20 65 6e 74 72 69 65 73 20  f those entries 
4370: 61 72 65 20 4e 55 4c 4c 2c 20 6a 75 6d 70 20 69  are NULL, jump i
4380: 6d 6d 65 64 69 61 74 65 6c 79 20 74 6f 20 62 72  mmediately to br
4390: 6b 2c 0a 2a 2a 20 20 20 20 20 20 20 77 68 69 63  k,.**       whic
43a0: 68 20 69 73 20 74 68 65 20 6c 6f 6f 70 20 65 78  h is the loop ex
43b0: 69 74 2c 20 73 69 6e 63 65 20 6e 6f 20 69 6e 64  it, since no ind
43c0: 65 78 20 65 6e 74 72 79 20 77 69 6c 6c 20 6d 61  ex entry will ma
43d0: 74 63 68 0a 2a 2a 20 20 20 20 20 20 20 69 66 20  tch.**       if 
43e0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
43f0: 6b 65 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  key is NULL..**.
4400: 2a 2a 20 20 20 20 2a 20 20 43 6f 6e 73 74 72 75  **    *  Constru
4410: 63 74 20 61 20 70 72 6f 62 65 20 65 6e 74 72 79  ct a probe entry
4420: 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6e 43   from the top nC
4430: 6f 6c 75 6d 6e 20 65 6e 74 72 69 65 73 20 69 6e  olumn entries in
4440: 0a 2a 2a 20 20 20 20 20 20 20 74 68 65 20 73 74  .**       the st
4450: 61 63 6b 20 77 69 74 68 20 61 66 66 69 6e 69 74  ack with affinit
4460: 69 65 73 20 61 70 70 72 6f 70 72 69 61 74 65 20  ies appropriate 
4470: 66 6f 72 20 69 6e 64 65 78 20 70 49 64 78 2e 0a  for index pIdx..
4480: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
4490: 75 69 6c 64 49 6e 64 65 78 50 72 6f 62 65 28 56  uildIndexProbe(V
44a0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 43 6f 6c  dbe *v, int nCol
44b0: 75 6d 6e 2c 20 69 6e 74 20 62 72 6b 2c 20 49 6e  umn, int brk, In
44c0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 73 71  dex *pIdx){.  sq
44d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
44e0: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 6e  , OP_NotNull, -n
44f0: 43 6f 6c 75 6d 6e 2c 20 73 71 6c 69 74 65 33 56  Column, sqlite3V
4500: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
4510: 29 2b 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  )+3);.  sqlite3V
4520: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
4530: 6f 70 2c 20 6e 43 6f 6c 75 6d 6e 2c 20 30 29 3b  op, nColumn, 0);
4540: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
4550: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
4560: 30 2c 20 62 72 6b 29 3b 0a 20 20 73 71 6c 69 74  0, brk);.  sqlit
4570: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
4580: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 6e 43  P_MakeRecord, nC
4590: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c  olumn, 0);.  sql
45a0: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
45b0: 79 53 74 72 28 76 2c 20 70 49 64 78 29 3b 0a 7d  yStr(v, pIdx);.}
45c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
45d0: 20 63 6f 64 65 20 66 6f 72 20 61 6e 20 65 71 75   code for an equ
45e0: 61 6c 69 74 79 20 74 65 72 6d 20 6f 66 20 74 68  ality term of th
45f0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20  e WHERE clause. 
4600: 20 41 6e 20 65 71 75 61 6c 69 74 79 0a 2a 2a 20   An equality.** 
4610: 74 65 72 6d 20 63 61 6e 20 62 65 20 65 69 74 68  term can be eith
4620: 65 72 20 58 3d 65 78 70 72 20 20 6f 72 20 58 20  er X=expr  or X 
4630: 49 4e 20 28 2e 2e 2e 29 2e 20 20 20 70 54 65 72  IN (...).   pTer
4640: 6d 20 69 73 20 74 68 65 20 58 2e 20 20 0a 2a 2f  m is the X.  .*/
4650: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64  .static void cod
4660: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 0a 20  eEqualityTerm(. 
4670: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
4680: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
4690: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
46a0: 20 45 78 70 72 49 6e 66 6f 20 2a 70 54 65 72 6d   ExprInfo *pTerm
46b0: 2c 20 20 20 20 2f 2a 20 54 68 65 20 74 65 72 6d  ,    /* The term
46c0: 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   of the WHERE cl
46d0: 61 75 73 65 20 74 6f 20 62 65 20 63 6f 64 65 64  ause to be coded
46e0: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 2c 20 20   */.  int brk,  
46f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d            /* Jum
4700: 70 20 68 65 72 65 20 74 6f 20 61 62 61 6e 64 6f  p here to abando
4710: 6e 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20  n the loop */.  
4720: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
4730: 65 6c 20 20 2f 2a 20 57 68 65 6e 20 6c 65 76 65  el  /* When leve
4740: 6c 20 6f 66 20 74 68 65 20 46 52 4f 4d 20 63 6c  l of the FROM cl
4750: 61 75 73 65 20 77 65 20 61 72 65 20 77 6f 72 6b  ause we are work
4760: 69 6e 67 20 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 45  ing on */.){.  E
4770: 78 70 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d  xpr *pX = pTerm-
4780: 3e 70 3b 0a 20 20 69 66 28 20 70 58 2d 3e 6f 70  >p;.  if( pX->op
4790: 21 3d 54 4b 5f 49 4e 20 29 7b 0a 20 20 20 20 61  !=TK_IN ){.    a
47a0: 73 73 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54  ssert( pX->op==T
47b0: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 73 71 6c 69  K_EQ );.    sqli
47c0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
47d0: 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b  se, pX->pRight);
47e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
47f0: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20  OMIT_SUBQUERY.  
4800: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69  }else{.    int i
4810: 54 61 62 3b 0a 20 20 20 20 56 64 62 65 20 2a 76  Tab;.    Vdbe *v
4820: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
4830: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ;..    sqlite3Co
4840: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
4850: 73 65 2c 20 70 58 29 3b 0a 20 20 20 20 69 54 61  se, pX);.    iTa
4860: 62 20 3d 20 70 58 2d 3e 69 54 61 62 6c 65 3b 0a  b = pX->iTable;.
4870: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
4880: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 77 69 6e  ddOp(v, OP_Rewin
4890: 64 2c 20 69 54 61 62 2c 20 62 72 6b 29 3b 0a 20  d, iTab, brk);. 
48a0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
48b0: 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41 73 44  dOp(v, OP_KeyAsD
48c0: 61 74 61 2c 20 69 54 61 62 2c 20 31 29 3b 0a 20  ata, iTab, 1);. 
48d0: 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28     VdbeComment((
48e0: 76 2c 20 22 23 20 25 2e 2a 73 22 2c 20 70 58 2d  v, "# %.*s", pX-
48f0: 3e 73 70 61 6e 2e 6e 2c 20 70 58 2d 3e 73 70 61  >span.n, pX->spa
4900: 6e 2e 7a 29 29 3b 0a 20 20 20 20 70 4c 65 76 65  n.z));.    pLeve
4910: 6c 2d 3e 69 6e 50 32 20 3d 20 73 71 6c 69 74 65  l->inP2 = sqlite
4920: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
4930: 5f 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20 30  _Column, iTab, 0
4940: 29 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  );.    pLevel->i
4950: 6e 4f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20  nOp = OP_Next;. 
4960: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 6e 50 31 20     pLevel->inP1 
4970: 3d 20 69 54 61 62 3b 0a 23 65 6e 64 69 66 0a 20  = iTab;.#endif. 
4980: 20 7d 0a 20 20 64 69 73 61 62 6c 65 54 65 72 6d   }.  disableTerm
4990: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
49a0: 3e 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  >p);.}../*.** Th
49b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
49c0: 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 0a 2a 2f   in a Bitmask.*/
49d0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
49e0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
49f0: 2d 31 29 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  -1).../*.** Gene
4a00: 72 61 74 65 20 74 68 65 20 62 65 67 69 6e 6e 69  rate the beginni
4a10: 6e 67 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 75  ng of the loop u
4a20: 73 65 64 20 66 6f 72 20 57 48 45 52 45 20 63 6c  sed for WHERE cl
4a30: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e  ause processing.
4a40: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
4a50: 61 6c 75 65 20 69 73 20 61 20 70 6f 69 6e 74 65  alue is a pointe
4a60: 72 20 74 6f 20 61 6e 20 6f 70 61 71 75 65 20 73  r to an opaque s
4a70: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
4a80: 6e 74 61 69 6e 73 0a 2a 2a 20 69 6e 66 6f 72 6d  ntains.** inform
4a90: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 74 6f 20  ation needed to 
4aa0: 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c 6f  terminate the lo
4ab0: 6f 70 2e 20 20 4c 61 74 65 72 2c 20 74 68 65 20  op.  Later, the 
4ac0: 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 0a  calling routine.
4ad0: 2a 2a 20 73 68 6f 75 6c 64 20 69 6e 76 6f 6b 65  ** should invoke
4ae0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 45 6e 64   sqlite3WhereEnd
4af0: 28 29 20 77 69 74 68 20 74 68 65 20 72 65 74 75  () with the retu
4b00: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
4b10: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 6e 20   function.** in 
4b20: 6f 72 64 65 72 20 74 6f 20 63 6f 6d 70 6c 65 74  order to complet
4b30: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
4b40: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 2e 0a 2a  se processing..*
4b50: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
4b60: 20 6f 63 63 75 72 73 2c 20 74 68 69 73 20 72 6f   occurs, this ro
4b70: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 4e 55  utine returns NU
4b80: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 62 61  LL..**.** The ba
4b90: 73 69 63 20 69 64 65 61 20 69 73 20 74 6f 20 64  sic idea is to d
4ba0: 6f 20 61 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2c  o a nested loop,
4bb0: 20 6f 6e 65 20 6c 6f 6f 70 20 66 6f 72 20 65 61   one loop for ea
4bc0: 63 68 20 74 61 62 6c 65 20 69 6e 0a 2a 2a 20 74  ch table in.** t
4bd0: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f  he FROM clause o
4be0: 66 20 61 20 73 65 6c 65 63 74 2e 20 20 28 49 4e  f a select.  (IN
4bf0: 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
4c00: 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74  statements are t
4c10: 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 61 20  he.** same as a 
4c20: 53 45 4c 45 43 54 20 77 69 74 68 20 6f 6e 6c 79  SELECT with only
4c30: 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   a single table 
4c40: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
4c50: 73 65 2e 29 20 20 46 6f 72 0a 2a 2a 20 65 78 61  se.)  For.** exa
4c60: 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 53 51 4c  mple, if the SQL
4c70: 20 69 73 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20   is this:.**.** 
4c80: 20 20 20 20 20 20 53 45 4c 45 43 54 20 2a 20 46        SELECT * F
4c90: 52 4f 4d 20 74 31 2c 20 74 32 2c 20 74 33 20 57  ROM t1, t2, t3 W
4ca0: 48 45 52 45 20 2e 2e 2e 3b 0a 2a 2a 0a 2a 2a 20  HERE ...;.**.** 
4cb0: 54 68 65 6e 20 74 68 65 20 63 6f 64 65 20 67 65  Then the code ge
4cc0: 6e 65 72 61 74 65 64 20 69 73 20 63 6f 6e 63 65  nerated is conce
4cd0: 70 74 75 61 6c 6c 79 20 6c 69 6b 65 20 74 68 65  ptually like the
4ce0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
4cf0: 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
4d00: 6f 77 31 20 69 6e 20 74 31 20 64 6f 20 20 20 20  ow1 in t1 do    
4d10: 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
4d20: 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
4d30: 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
4d40: 20 74 32 20 64 6f 20 20 20 20 20 20 7c 2d 2d 20   t2 do      |-- 
4d50: 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 42  by sqlite3WhereB
4d60: 65 67 69 6e 28 29 0a 2a 2a 20 20 20 20 20 20 20  egin().**       
4d70: 20 20 20 66 6f 72 65 61 63 68 20 72 6f 77 33 20     foreach row3 
4d80: 69 6e 20 74 33 20 64 6f 20 20 20 2f 0a 2a 2a 20  in t3 do   /.** 
4d90: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a             ....*
4da0: 2a 20 20 20 20 20 20 20 20 20 20 65 6e 64 20 20  *          end  
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 20 20 5c 20 20 20 20 43 6f 64 65 20 67 65 6e     \    Code gen
4dd0: 65 72 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  erated.**       
4de0: 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 2d 2d 20              |-- 
4e00: 62 79 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  by sqlite3WhereE
4e10: 6e 64 28 29 0a 2a 2a 20 20 20 20 20 20 65 6e 64  nd().**      end
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 20 20 20 20 20 20 20 20 2f 0a 2a 2a 0a 2a 2a           /.**.**
4e40: 20 54 68 65 72 65 20 61 72 65 20 42 74 72 65 65   There are Btree
4e50: 20 63 75 72 73 6f 72 73 20 61 73 73 6f 63 69 61   cursors associa
4e60: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 74 61  ted with each ta
4e70: 62 6c 65 2e 20 20 74 31 20 75 73 65 73 20 63 75  ble.  t1 uses cu
4e80: 72 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 20 70  rsor.** number p
4e90: 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69 43  TabList->a[0].iC
4ea0: 75 72 73 6f 72 2e 20 20 74 32 20 75 73 65 73 20  ursor.  t2 uses 
4eb0: 74 68 65 20 63 75 72 73 6f 72 20 70 54 61 62 4c  the cursor pTabL
4ec0: 69 73 74 2d 3e 61 5b 31 5d 2e 69 43 75 72 73 6f  ist->a[1].iCurso
4ed0: 72 2e 0a 2a 2a 20 41 6e 64 20 73 6f 20 66 6f 72  r..** And so for
4ee0: 74 68 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  th.  This routin
4ef0: 65 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  e generates code
4f00: 20 74 6f 20 6f 70 65 6e 20 74 68 6f 73 65 20 56   to open those V
4f10: 44 42 45 20 63 75 72 73 6f 72 73 0a 2a 2a 20 61  DBE cursors.** a
4f20: 6e 64 20 73 71 6c 69 74 65 33 57 68 65 72 65 45  nd sqlite3WhereE
4f30: 6e 64 28 29 20 67 65 6e 65 72 61 74 65 73 20 74  nd() generates t
4f40: 68 65 20 63 6f 64 65 20 74 6f 20 63 6c 6f 73 65  he code to close
4f50: 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   them..**.** The
4f60: 20 63 6f 64 65 20 74 68 61 74 20 73 71 6c 69 74   code that sqlit
4f70: 65 33 57 68 65 72 65 42 65 67 69 6e 28 29 20 67  e3WhereBegin() g
4f80: 65 6e 65 72 61 74 65 73 20 6c 65 61 76 65 73 20  enerates leaves 
4f90: 74 68 65 20 63 75 72 73 6f 72 73 20 6e 61 6d 65  the cursors name
4fa0: 64 0a 2a 2a 20 69 6e 20 70 54 61 62 4c 69 73 74  d.** in pTabList
4fb0: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
4fc0: 69 72 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  ir appropriate e
4fd0: 6e 74 72 69 65 73 2e 20 20 54 68 65 20 5b 2e 2e  ntries.  The [..
4fe0: 2e 5d 20 63 6f 64 65 0a 2a 2a 20 63 61 6e 20 75  .] code.** can u
4ff0: 73 65 20 4f 50 5f 43 6f 6c 75 6d 6e 20 61 6e 64  se OP_Column and
5000: 20 4f 50 5f 52 65 63 6e 6f 20 6f 70 63 6f 64 65   OP_Recno opcode
5010: 73 20 6f 6e 20 74 68 65 73 65 20 63 75 72 73 6f  s on these curso
5020: 72 73 20 74 6f 20 65 78 74 72 61 63 74 0a 2a 2a  rs to extract.**
5030: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 76   data from the v
5040: 61 72 69 6f 75 73 20 74 61 62 6c 65 73 20 6f 66  arious tables of
5050: 20 74 68 65 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a   the loop..**.**
5060: 20 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c   If the WHERE cl
5070: 61 75 73 65 20 69 73 20 65 6d 70 74 79 2c 20 74  ause is empty, t
5080: 68 65 20 66 6f 72 65 61 63 68 20 6c 6f 6f 70 73  he foreach loops
5090: 20 6d 75 73 74 20 65 61 63 68 20 73 63 61 6e 20   must each scan 
50a0: 74 68 65 69 72 0a 2a 2a 20 65 6e 74 69 72 65 20  their.** entire 
50b0: 74 61 62 6c 65 73 2e 20 20 54 68 75 73 20 61 20  tables.  Thus a 
50c0: 74 68 72 65 65 2d 77 61 79 20 6a 6f 69 6e 20 69  three-way join i
50d0: 73 20 61 6e 20 4f 28 4e 5e 33 29 20 6f 70 65 72  s an O(N^3) oper
50e0: 61 74 69 6f 6e 2e 20 20 42 75 74 20 69 66 0a 2a  ation.  But if.*
50f0: 2a 20 74 68 65 20 74 61 62 6c 65 73 20 68 61 76  * the tables hav
5100: 65 20 69 6e 64 69 63 65 73 20 61 6e 64 20 74 68  e indices and th
5110: 65 72 65 20 61 72 65 20 74 65 72 6d 73 20 69 6e  ere are terms in
5120: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5130: 65 20 74 68 61 74 0a 2a 2a 20 72 65 66 65 72 20  e that.** refer 
5140: 74 6f 20 74 68 6f 73 65 20 69 6e 64 69 63 65 73  to those indices
5150: 2c 20 61 20 63 6f 6d 70 6c 65 74 65 20 74 61 62  , a complete tab
5160: 6c 65 20 73 63 61 6e 20 63 61 6e 20 62 65 20 61  le scan can be a
5170: 76 6f 69 64 65 64 20 61 6e 64 20 74 68 65 0a 2a  voided and the.*
5180: 2a 20 63 6f 64 65 20 77 69 6c 6c 20 72 75 6e 20  * code will run 
5190: 6d 75 63 68 20 66 61 73 74 65 72 2e 20 20 4d 6f  much faster.  Mo
51a0: 73 74 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 6f  st of the work o
51b0: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
51c0: 73 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 74 6f  s checking.** to
51d0: 20 73 65 65 20 69 66 20 74 68 65 72 65 20 61 72   see if there ar
51e0: 65 20 69 6e 64 69 63 65 73 20 74 68 61 74 20 63  e indices that c
51f0: 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73 70  an be used to sp
5200: 65 65 64 20 75 70 20 74 68 65 20 6c 6f 6f 70 2e  eed up the loop.
5210: 0a 2a 2a 0a 2a 2a 20 54 65 72 6d 73 20 6f 66 20  .**.** Terms of 
5220: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5230: 20 61 72 65 20 61 6c 73 6f 20 75 73 65 64 20 74   are also used t
5240: 6f 20 6c 69 6d 69 74 20 77 68 69 63 68 20 72 6f  o limit which ro
5250: 77 73 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 6d  ws actually.** m
5260: 61 6b 65 20 69 74 20 74 6f 20 74 68 65 20 22 2e  ake it to the ".
5270: 2e 2e 22 20 69 6e 20 74 68 65 20 6d 69 64 64 6c  .." in the middl
5280: 65 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20  e of the loop.  
5290: 41 66 74 65 72 20 65 61 63 68 20 22 66 6f 72 65  After each "fore
52a0: 61 63 68 22 2c 0a 2a 2a 20 74 65 72 6d 73 20 6f  ach",.** terms o
52b0: 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  f the WHERE clau
52c0: 73 65 20 74 68 61 74 20 75 73 65 20 6f 6e 6c 79  se that use only
52d0: 20 74 65 72 6d 73 20 69 6e 20 74 68 61 74 20 6c   terms in that l
52e0: 6f 6f 70 20 61 6e 64 20 6f 75 74 65 72 0a 2a 2a  oop and outer.**
52f0: 20 6c 6f 6f 70 73 20 61 72 65 20 65 76 61 6c 75   loops are evalu
5300: 61 74 65 64 20 61 6e 64 20 69 66 20 66 61 6c 73  ated and if fals
5310: 65 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  e a jump is made
5320: 20 61 72 6f 75 6e 64 20 61 6c 6c 20 73 75 62 73   around all subs
5330: 65 71 75 65 6e 74 0a 2a 2a 20 69 6e 6e 65 72 20  equent.** inner 
5340: 6c 6f 6f 70 73 20 28 6f 72 20 61 72 6f 75 6e 64  loops (or around
5350: 20 74 68 65 20 22 2e 2e 2e 22 20 69 66 20 74 68   the "..." if th
5360: 65 20 74 65 73 74 20 6f 63 63 75 72 73 20 77 69  e test occurs wi
5370: 74 68 69 6e 20 74 68 65 20 69 6e 6e 65 72 2d 0a  thin the inner-.
5380: 2a 2a 20 6d 6f 73 74 20 6c 6f 6f 70 29 0a 2a 2a  ** most loop).**
5390: 0a 2a 2a 20 4f 55 54 45 52 20 4a 4f 49 4e 53 0a  .** OUTER JOINS.
53a0: 2a 2a 0a 2a 2a 20 41 6e 20 6f 75 74 65 72 20 6a  **.** An outer j
53b0: 6f 69 6e 20 6f 66 20 74 61 62 6c 65 73 20 74 31  oin of tables t1
53c0: 20 61 6e 64 20 74 32 20 69 73 20 63 6f 6e 63 65   and t2 is conce
53d0: 70 74 61 6c 6c 79 20 63 6f 64 65 64 20 61 73 20  ptally coded as 
53e0: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
53f0: 20 20 66 6f 72 65 61 63 68 20 72 6f 77 31 20 69    foreach row1 i
5400: 6e 20 74 31 20 64 6f 0a 2a 2a 20 20 20 20 20 20  n t1 do.**      
5410: 66 6c 61 67 20 3d 20 30 0a 2a 2a 20 20 20 20 20  flag = 0.**     
5420: 20 66 6f 72 65 61 63 68 20 72 6f 77 32 20 69 6e   foreach row2 in
5430: 20 74 32 20 64 6f 0a 2a 2a 20 20 20 20 20 20 20   t2 do.**       
5440: 20 73 74 61 72 74 3a 0a 2a 2a 20 20 20 20 20 20   start:.**      
5450: 20 20 20 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20      ....**      
5460: 20 20 20 20 66 6c 61 67 20 3d 20 31 0a 2a 2a 20      flag = 1.** 
5470: 20 20 20 20 20 65 6e 64 0a 2a 2a 20 20 20 20 20       end.**     
5480: 20 69 66 20 66 6c 61 67 3d 3d 30 20 74 68 65 6e   if flag==0 then
5490: 0a 2a 2a 20 20 20 20 20 20 20 20 6d 6f 76 65 20  .**        move 
54a0: 74 68 65 20 72 6f 77 32 20 63 75 72 73 6f 72 20  the row2 cursor 
54b0: 74 6f 20 61 20 6e 75 6c 6c 20 72 6f 77 0a 2a 2a  to a null row.**
54c0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 74 61          goto sta
54d0: 72 74 0a 2a 2a 20 20 20 20 20 20 66 69 0a 2a 2a  rt.**      fi.**
54e0: 20 20 20 20 65 6e 64 0a 2a 2a 0a 2a 2a 20 4f 52      end.**.** OR
54f0: 44 45 52 20 42 59 20 43 4c 41 55 53 45 20 50 52  DER BY CLAUSE PR
5500: 4f 43 45 53 53 49 4e 47 0a 2a 2a 0a 2a 2a 20 2a  OCESSING.**.** *
5510: 70 70 4f 72 64 65 72 42 79 20 69 73 20 61 20 70  ppOrderBy is a p
5520: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 4f 52  ointer to the OR
5530: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f 66  DER BY clause of
5540: 20 61 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d   a SELECT statem
5550: 65 6e 74 2c 0a 2a 2a 20 69 66 20 74 68 65 72 65  ent,.** if there
5560: 20 69 73 20 6f 6e 65 2e 20 20 49 66 20 74 68 65   is one.  If the
5570: 72 65 20 69 73 20 6e 6f 20 4f 52 44 45 52 20 42  re is no ORDER B
5580: 59 20 63 6c 61 75 73 65 20 6f 72 20 69 66 20 74  Y clause or if t
5590: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69  his routine.** i
55a0: 73 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 6e  s called from an
55b0: 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54   UPDATE or DELET
55c0: 45 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65  E statement, the
55d0: 6e 20 70 70 4f 72 64 65 72 42 79 20 69 73 20 4e  n ppOrderBy is N
55e0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ULL..**.** If an
55f0: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
5600: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  ed so that the n
5610: 61 74 75 72 61 6c 20 6f 75 74 70 75 74 20 6f 72  atural output or
5620: 64 65 72 20 6f 66 20 74 68 65 20 74 61 62 6c 65  der of the table
5630: 0a 2a 2a 20 73 63 61 6e 20 69 73 20 63 6f 72 72  .** scan is corr
5640: 65 63 74 20 66 6f 72 20 74 68 65 20 4f 52 44 45  ect for the ORDE
5650: 52 20 42 59 20 63 6c 61 75 73 65 2c 20 74 68 65  R BY clause, the
5660: 6e 20 74 68 61 74 20 69 6e 64 65 78 20 69 73 20  n that index is 
5670: 75 73 65 64 20 61 6e 64 0a 2a 2a 20 2a 70 70 4f  used and.** *ppO
5680: 72 64 65 72 42 79 20 69 73 20 73 65 74 20 74 6f  rderBy is set to
5690: 20 4e 55 4c 4c 2e 20 20 54 68 69 73 20 69 73 20   NULL.  This is 
56a0: 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  an optimization 
56b0: 74 68 61 74 20 70 72 65 76 65 6e 74 73 20 61 6e  that prevents an
56c0: 0a 2a 2a 20 75 6e 6e 65 63 65 73 73 61 72 79 20  .** unnecessary 
56d0: 73 6f 72 74 20 6f 66 20 74 68 65 20 72 65 73 75  sort of the resu
56e0: 6c 74 20 73 65 74 20 69 66 20 61 6e 20 69 6e 64  lt set if an ind
56f0: 65 78 20 61 70 70 72 6f 70 72 69 61 74 65 20 66  ex appropriate f
5700: 6f 72 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  or the.** ORDER 
5710: 42 59 20 63 6c 61 75 73 65 20 61 6c 72 65 61 64  BY clause alread
5720: 79 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  y exists..**.** 
5730: 49 66 20 74 68 65 20 77 68 65 72 65 20 63 6c 61  If the where cla
5740: 75 73 65 20 6c 6f 6f 70 73 20 63 61 6e 6e 6f 74  use loops cannot
5750: 20 62 65 20 61 72 72 61 6e 67 65 64 20 74 6f 20   be arranged to 
5760: 70 72 6f 76 69 64 65 20 74 68 65 20 63 6f 72 72  provide the corr
5770: 65 63 74 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 72  ect.** output or
5780: 64 65 72 2c 20 74 68 65 6e 20 74 68 65 20 2a 70  der, then the *p
5790: 70 4f 72 64 65 72 42 79 20 69 73 20 75 6e 63 68  pOrderBy is unch
57a0: 61 6e 67 65 64 2e 0a 2a 2f 0a 57 68 65 72 65 49  anged..*/.WhereI
57b0: 6e 66 6f 20 2a 73 71 6c 69 74 65 33 57 68 65 72  nfo *sqlite3Wher
57c0: 65 42 65 67 69 6e 28 0a 20 20 50 61 72 73 65 20  eBegin(.  Parse 
57d0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
57e0: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
57f0: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
5800: 73 74 20 2a 70 54 61 62 4c 69 73 74 2c 20 20 20  st *pTabList,   
5810: 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61 6c   /* A list of al
5820: 6c 20 74 61 62 6c 65 73 20 74 6f 20 62 65 20 73  l tables to be s
5830: 63 61 6e 6e 65 64 20 2a 2f 0a 20 20 45 78 70 72  canned */.  Expr
5840: 20 2a 70 57 68 65 72 65 2c 20 20 20 20 20 20 20   *pWhere,       
5850: 20 20 2f 2a 20 54 68 65 20 57 48 45 52 45 20 63    /* The WHERE c
5860: 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c  lause */.  ExprL
5870: 69 73 74 20 2a 2a 70 70 4f 72 64 65 72 42 79 2c  ist **ppOrderBy,
5880: 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59 20   /* An ORDER BY 
5890: 63 6c 61 75 73 65 2c 20 6f 72 20 4e 55 4c 4c 20  clause, or NULL 
58a0: 2a 2f 0a 20 20 46 65 74 63 68 20 2a 70 46 65 74  */.  Fetch *pFet
58b0: 63 68 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ch         /* In
58c0: 69 74 69 61 6c 20 6c 6f 63 61 74 69 6f 6e 20 6f  itial location o
58d0: 66 20 63 75 72 73 6f 72 73 2e 20 20 4e 55 4c 4c  f cursors.  NULL
58e0: 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 29 7b   otherwise */.){
58f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
5900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5910: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
5920: 0a 20 20 57 68 65 72 65 49 6e 66 6f 20 2a 70 57  .  WhereInfo *pW
5930: 49 6e 66 6f 3b 20 20 20 20 20 20 20 20 20 2f 2a  Info;         /*
5940: 20 57 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   Will become the
5950: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
5960: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2a   this function *
5970: 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  /.  Vdbe *v = pP
5980: 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 20 2f  arse->pVdbe;   /
5990: 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 64 61  * The virtual da
59a0: 74 61 62 61 73 65 20 65 6e 67 69 6e 65 20 2a 2f  tabase engine */
59b0: 0a 20 20 69 6e 74 20 62 72 6b 2c 20 63 6f 6e 74  .  int brk, cont
59c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
59d0: 20 41 64 64 72 65 73 73 65 73 20 75 73 65 64 20   Addresses used 
59e0: 64 75 72 69 6e 67 20 63 6f 64 65 20 67 65 6e 65  during code gene
59f0: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
5a00: 6e 45 78 70 72 3b 20 20 20 20 20 20 20 20 20 20  nExpr;          
5a10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
5a20: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20  bexpressions in 
5a30: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5a40: 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6c 6f   */.  Bitmask lo
5a50: 6f 70 4d 61 73 6b 3b 20 20 20 20 2f 2a 20 4f 6e  opMask;    /* On
5a60: 65 20 62 69 74 20 73 65 74 20 66 6f 72 20 65 61  e bit set for ea
5a70: 63 68 20 6f 75 74 65 72 20 6c 6f 6f 70 20 2a 2f  ch outer loop */
5a80: 0a 20 20 45 78 70 72 49 6e 66 6f 20 2a 70 54 65  .  ExprInfo *pTe
5a90: 72 6d 3b 20 20 20 20 20 2f 2a 20 41 20 73 69 6e  rm;     /* A sin
5aa0: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 20  gle term in the 
5ab0: 57 48 45 52 45 20 63 6c 61 75 73 65 3b 20 70 74  WHERE clause; pt
5ac0: 72 20 74 6f 20 61 45 78 70 72 5b 5d 20 2a 2f 0a  r to aExpr[] */.
5ad0: 20 20 45 78 70 72 4d 61 73 6b 53 65 74 20 6d 61    ExprMaskSet ma
5ae0: 73 6b 53 65 74 3b 20 2f 2a 20 54 68 65 20 65 78  skSet; /* The ex
5af0: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
5b00: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44 69 72 65  t */.  int iDire
5b10: 63 74 45 71 5b 42 4d 53 5d 3b 20 20 2f 2a 20 54  ctEq[BMS];  /* T
5b20: 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  erm of the form 
5b30: 52 4f 57 49 44 3d 3d 58 20 66 6f 72 20 74 68 65  ROWID==X for the
5b40: 20 4e 2d 74 68 20 74 61 62 6c 65 20 2a 2f 0a 20   N-th table */. 
5b50: 20 69 6e 74 20 69 44 69 72 65 63 74 4c 74 5b 42   int iDirectLt[B
5b60: 4d 53 5d 3b 20 20 2f 2a 20 54 65 72 6d 20 6f 66  MS];  /* Term of
5b70: 20 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3c   the form ROWID<
5b80: 58 20 6f 72 20 52 4f 57 49 44 3c 3d 58 20 2a 2f  X or ROWID<=X */
5b90: 0a 20 20 69 6e 74 20 69 44 69 72 65 63 74 47 74  .  int iDirectGt
5ba0: 5b 42 4d 53 5d 3b 20 20 2f 2a 20 54 65 72 6d 20  [BMS];  /* Term 
5bb0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 52 4f 57 49  of the form ROWI
5bc0: 44 3e 58 20 6f 72 20 52 4f 57 49 44 3e 3d 58 20  D>X or ROWID>=X 
5bd0: 2a 2f 0a 20 20 45 78 70 72 49 6e 66 6f 20 61 45  */.  ExprInfo aE
5be0: 78 70 72 5b 31 30 31 5d 3b 20 2f 2a 20 54 68 65  xpr[101]; /* The
5bf0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
5c00: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 74 68   divided into th
5c10: 65 73 65 20 74 65 72 6d 73 20 2a 2f 0a 20 20 73  ese terms */.  s
5c20: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
5c30: 65 6d 20 2a 70 54 61 62 49 74 65 6d 3b 20 20 2f  em *pTabItem;  /
5c40: 2a 20 41 20 73 69 6e 67 6c 65 20 65 6e 74 72 79  * A single entry
5c50: 20 66 72 6f 6d 20 70 54 61 62 4c 69 73 74 20 2a   from pTabList *
5c60: 2f 0a 20 20 57 68 65 72 65 4c 65 76 65 6c 20 2a  /.  WhereLevel *
5c70: 70 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  pLevel;         
5c80: 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
5c90: 6c 65 76 65 6c 20 69 6e 20 74 68 65 20 70 57 49  level in the pWI
5ca0: 6e 66 6f 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f  nfo list */..  /
5cb0: 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
5cc0: 74 65 72 6d 73 20 69 6e 20 74 68 65 20 46 52 4f  terms in the FRO
5cd0: 4d 20 63 6c 61 75 73 65 20 69 73 20 6c 69 6d 69  M clause is limi
5ce0: 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
5cf0: 72 20 6f 66 0a 20 20 2a 2a 20 62 69 74 73 20 69  r of.  ** bits i
5d00: 6e 20 61 20 42 69 74 6d 61 73 6b 20 0a 20 20 2a  n a Bitmask .  *
5d10: 2f 0a 20 20 69 66 28 20 70 54 61 62 4c 69 73 74  /.  if( pTabList
5d20: 2d 3e 6e 53 72 63 3e 73 69 7a 65 6f 66 28 42 69  ->nSrc>sizeof(Bi
5d30: 74 6d 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20  tmask)*8 ){.    
5d40: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5d50: 70 50 61 72 73 65 2c 20 22 61 74 20 6d 6f 73 74  pParse, "at most
5d60: 20 25 64 20 74 61 62 6c 65 73 20 69 6e 20 61 20   %d tables in a 
5d70: 6a 6f 69 6e 22 2c 0a 20 20 20 20 20 20 20 73 69  join",.       si
5d80: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 29  zeof(Bitmask)*8)
5d90: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
5da0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 70 6c 69 74 20    }..  /* Split 
5db0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5dc0: 20 69 6e 74 6f 20 73 65 70 61 72 61 74 65 20 73   into separate s
5dd0: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 20 77 68  ubexpressions wh
5de0: 65 72 65 20 65 61 63 68 0a 20 20 2a 2a 20 73 75  ere each.  ** su
5df0: 62 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73  bexpression is s
5e00: 65 70 61 72 61 74 65 64 20 62 79 20 61 6e 20 41  eparated by an A
5e10: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
5e20: 20 74 68 65 20 61 45 78 70 72 5b 5d 0a 20 20 2a   the aExpr[].  *
5e30: 2a 20 61 72 72 61 79 20 66 69 6c 6c 73 20 75 70  * array fills up
5e40: 2c 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  , the last entry
5e50: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
5e60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
5e70: 69 63 68 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  ich.  ** contain
5e80: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 75 6e 66  s additional unf
5e90: 61 63 74 6f 72 65 64 20 41 4e 44 20 6f 70 65 72  actored AND oper
5ea0: 61 74 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 6e  ators..  */.  in
5eb0: 69 74 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b 53  itMaskSet(&maskS
5ec0: 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  et);.  memset(aE
5ed0: 78 70 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  xpr, 0, sizeof(a
5ee0: 45 78 70 72 29 29 3b 0a 20 20 6e 45 78 70 72 20  Expr));.  nExpr 
5ef0: 3d 20 65 78 70 72 53 70 6c 69 74 28 41 52 52 41  = exprSplit(ARRA
5f00: 59 53 49 5a 45 28 61 45 78 70 72 29 2c 20 61 45  YSIZE(aExpr), aE
5f10: 78 70 72 2c 20 70 57 68 65 72 65 29 3b 0a 20 20  xpr, pWhere);.  
5f20: 69 66 28 20 6e 45 78 70 72 3d 3d 41 52 52 41 59  if( nExpr==ARRAY
5f30: 53 49 5a 45 28 61 45 78 70 72 29 20 29 7b 0a 20  SIZE(aExpr) ){. 
5f40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
5f50: 73 67 28 70 50 61 72 73 65 2c 20 22 57 48 45 52  sg(pParse, "WHER
5f60: 45 20 63 6c 61 75 73 65 20 74 6f 6f 20 63 6f 6d  E clause too com
5f70: 70 6c 65 78 20 2d 20 6e 6f 20 6d 6f 72 65 20 22  plex - no more "
5f80: 0a 20 20 20 20 20 20 20 22 74 68 61 6e 20 25 64  .       "than %d
5f90: 20 74 65 72 6d 73 20 61 6c 6c 6f 77 65 64 22 2c   terms allowed",
5fa0: 20 28 69 6e 74 29 41 52 52 41 59 53 49 5a 45 28   (int)ARRAYSIZE(
5fb0: 61 45 78 70 72 29 2d 31 29 3b 0a 20 20 20 20 72  aExpr)-1);.    r
5fc0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 20  eturn 0;.  }.   
5fd0: 20 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20   .  /* Allocate 
5fe0: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
5ff0: 68 65 20 57 68 65 72 65 49 6e 66 6f 20 73 74 72  he WhereInfo str
6000: 75 63 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c  ucture that will
6010: 20 62 65 63 6f 6d 65 20 74 68 65 0a 20 20 2a 2a   become the.  **
6020: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 20   return value.. 
6030: 20 2a 2f 0a 20 20 70 57 49 6e 66 6f 20 3d 20 73   */.  pWInfo = s
6040: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
6050: 65 6f 66 28 57 68 65 72 65 49 6e 66 6f 29 20 2b  eof(WhereInfo) +
6060: 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2a   pTabList->nSrc*
6070: 73 69 7a 65 6f 66 28 57 68 65 72 65 4c 65 76 65  sizeof(WhereLeve
6080: 6c 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  l));.  if( sqlit
6090: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
60a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   ){.    /* sqlit
60b0: 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b 20 2f  eFree(pWInfo); /
60c0: 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 77 68  / Leak memory wh
60d0: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
60e0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
60f0: 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 70  .  }.  pWInfo->p
6100: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
6110: 20 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c 69    pWInfo->pTabLi
6120: 73 74 20 3d 20 70 54 61 62 4c 69 73 74 3b 0a 20  st = pTabList;. 
6130: 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b 20   pWInfo->iBreak 
6140: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
6150: 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20 2f 2a  eLabel(v);..  /*
6160: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 61   Special case: a
6170: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68   WHERE clause th
6180: 61 74 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  at is constant. 
6190: 20 45 76 61 6c 75 61 74 65 20 74 68 65 0a 20 20   Evaluate the.  
61a0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
61b0: 64 20 65 69 74 68 65 72 20 6a 75 6d 70 20 6f 76  d either jump ov
61c0: 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 63 6f  er all of the co
61d0: 64 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 75 2e  de or fall thru.
61e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 68 65  .  */.  if( pWhe
61f0: 72 65 20 26 26 20 28 70 54 61 62 4c 69 73 74 2d  re && (pTabList-
6200: 3e 6e 53 72 63 3d 3d 30 20 7c 7c 20 73 71 6c 69  >nSrc==0 || sqli
6210: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6220: 74 28 70 57 68 65 72 65 29 29 20 29 7b 0a 20 20  t(pWhere)) ){.  
6230: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
6240: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 57 68  alse(pParse, pWh
6250: 65 72 65 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72  ere, pWInfo->iBr
6260: 65 61 6b 2c 20 31 29 3b 0a 20 20 20 20 70 57 68  eak, 1);.    pWh
6270: 65 72 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ere = 0;.  }..  
6280: 2f 2a 20 41 6e 61 6c 79 7a 65 20 61 6c 6c 20 6f  /* Analyze all o
6290: 66 20 74 68 65 20 73 75 62 65 78 70 72 65 73 73  f the subexpress
62a0: 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
62b0: 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74  (i=0; i<pTabList
62c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
62d0: 20 20 63 72 65 61 74 65 4d 61 73 6b 28 26 6d 61    createMask(&ma
62e0: 73 6b 53 65 74 2c 20 70 54 61 62 4c 69 73 74 2d  skSet, pTabList-
62f0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 29 3b 0a  >a[i].iCursor);.
6300: 20 20 7d 0a 20 20 66 6f 72 28 70 54 65 72 6d 3d    }.  for(pTerm=
6310: 61 45 78 70 72 2c 20 69 3d 30 3b 20 69 3c 6e 45  aExpr, i=0; i<nE
6320: 78 70 72 3b 20 69 2b 2b 2c 20 70 54 65 72 6d 2b  xpr; i++, pTerm+
6330: 2b 29 7b 0a 20 20 20 20 65 78 70 72 41 6e 61 6c  +){.    exprAnal
6340: 79 7a 65 28 70 54 61 62 4c 69 73 74 2c 20 26 6d  yze(pTabList, &m
6350: 61 73 6b 53 65 74 2c 20 70 54 65 72 6d 29 3b 0a  askSet, pTerm);.
6360: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65    }..  /* Figure
6370: 20 6f 75 74 20 77 68 61 74 20 69 6e 64 65 78 20   out what index 
6380: 74 6f 20 75 73 65 20 28 69 66 20 61 6e 79 29 20  to use (if any) 
6390: 66 6f 72 20 65 61 63 68 20 6e 65 73 74 65 64 20  for each nested 
63a0: 6c 6f 6f 70 2e 0a 20 20 2a 2a 20 4d 61 6b 65 20  loop..  ** Make 
63b0: 70 57 49 6e 66 6f 2d 3e 61 5b 69 5d 2e 70 49 64  pWInfo->a[i].pId
63c0: 78 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 69  x point to the i
63d0: 6e 64 65 78 20 74 6f 20 75 73 65 20 66 6f 72 20  ndex to use for 
63e0: 74 68 65 20 69 2d 74 68 20 6e 65 73 74 65 64 0a  the i-th nested.
63f0: 20 20 2a 2a 20 6c 6f 6f 70 20 77 68 65 72 65 20    ** loop where 
6400: 69 3d 3d 30 20 69 73 20 74 68 65 20 6f 75 74 65  i==0 is the oute
6410: 72 20 6c 6f 6f 70 20 61 6e 64 20 69 3d 3d 70 54  r loop and i==pT
6420: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 2d 31 20 69  abList->nSrc-1 i
6430: 73 20 74 68 65 20 69 6e 6e 65 72 0a 20 20 2a 2a  s the inner.  **
6440: 20 6c 6f 6f 70 2e 20 0a 20 20 2a 2a 0a 20 20 2a   loop. .  **.  *
6450: 2a 20 49 66 20 74 65 72 6d 73 20 65 78 69 73 74  * If terms exist
6460: 20 74 68 61 74 20 75 73 65 20 74 68 65 20 52 4f   that use the RO
6470: 57 49 44 20 6f 66 20 61 6e 79 20 74 61 62 6c 65  WID of any table
6480: 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 0a 20  , then set the. 
6490: 20 2a 2a 20 69 44 69 72 65 63 74 45 71 5b 5d 2c   ** iDirectEq[],
64a0: 20 69 44 69 72 65 63 74 4c 74 5b 5d 2c 20 6f 72   iDirectLt[], or
64b0: 20 69 44 69 72 65 63 74 47 74 5b 5d 20 65 6c 65   iDirectGt[] ele
64c0: 6d 65 6e 74 73 20 66 6f 72 20 74 68 61 74 20 74  ments for that t
64d0: 61 62 6c 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  able.  ** to the
64e0: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 74 65   index of the te
64f0: 72 6d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  rm containing th
6500: 65 20 52 4f 57 49 44 2e 20 20 57 65 20 61 6c 77  e ROWID.  We alw
6510: 61 79 73 20 70 72 65 66 65 72 0a 20 20 2a 2a 20  ays prefer.  ** 
6520: 74 6f 20 75 73 65 20 61 20 52 4f 57 49 44 20 77  to use a ROWID w
6530: 68 69 63 68 20 63 61 6e 20 64 69 72 65 63 74 6c  hich can directl
6540: 79 20 61 63 63 65 73 73 20 61 20 74 61 62 6c 65  y access a table
6550: 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 6e 0a   rather than an.
6560: 20 20 2a 2a 20 69 6e 64 65 78 20 77 68 69 63 68    ** index which
6570: 20 72 65 71 75 69 72 65 73 20 72 65 61 64 69 6e   requires readin
6580: 67 20 61 6e 20 69 6e 64 65 78 20 66 69 72 73 74  g an index first
6590: 20 74 6f 20 67 65 74 20 74 68 65 20 72 6f 77 69   to get the rowi
65a0: 64 20 74 68 65 6e 0a 20 20 2a 2a 20 64 6f 69 6e  d then.  ** doin
65b0: 67 20 61 20 73 65 63 6f 6e 64 20 72 65 61 64 20  g a second read 
65c0: 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 64 61  of the actual da
65d0: 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 20 20  tabase table..  
65e0: 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79  **.  ** Actually
65f0: 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6d  , if there are m
6600: 6f 72 65 20 74 68 61 6e 20 33 32 20 74 61 62 6c  ore than 32 tabl
6610: 65 73 20 69 6e 20 74 68 65 20 6a 6f 69 6e 2c 20  es in the join, 
6620: 6f 6e 6c 79 20 74 68 65 0a 20 20 2a 2a 20 66 69  only the.  ** fi
6630: 72 73 74 20 33 32 20 74 61 62 6c 65 73 20 61 72  rst 32 tables ar
6640: 65 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72  e candidates for
6650: 20 69 6e 64 69 63 65 73 2e 20 20 54 68 69 73 20   indices.  This 
6660: 69 73 20 28 61 67 61 69 6e 29 20 64 75 65 0a 20  is (again) due. 
6670: 20 2a 2a 20 74 6f 20 74 68 65 20 6c 69 6d 69 74   ** to the limit
6680: 20 6f 66 20 33 32 20 62 69 74 73 20 69 6e 20 61   of 32 bits in a
6690: 6e 20 69 6e 74 65 67 65 72 20 62 69 74 6d 61 73  n integer bitmas
66a0: 6b 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 6f 70 4d 61  k..  */.  loopMa
66b0: 73 6b 20 3d 20 30 3b 0a 20 20 70 54 61 62 49 74  sk = 0;.  pTabIt
66c0: 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  em = pTabList->a
66d0: 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70 57 49  ;.  pLevel = pWI
66e0: 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d  nfo->a;.  for(i=
66f0: 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e  0; i<pTabList->n
6700: 53 72 63 20 26 26 20 69 3c 41 52 52 41 59 53 49  Src && i<ARRAYSI
6710: 5a 45 28 69 44 69 72 65 63 74 45 71 29 3b 20 69  ZE(iDirectEq); i
6720: 2b 2b 2c 70 54 61 62 49 74 65 6d 2b 2b 2c 70 4c  ++,pTabItem++,pL
6730: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  evel++){.    int
6740: 20 6a 3b 0a 20 20 20 20 69 6e 74 20 69 43 75 72   j;.    int iCur
6750: 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75   = pTabItem->iCu
6760: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
6770: 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 66   /* The cursor f
6780: 6f 72 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f  or this table */
6790: 0a 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 61 73  .    Bitmask mas
67a0: 6b 20 3d 20 67 65 74 4d 61 73 6b 28 26 6d 61 73  k = getMask(&mas
67b0: 6b 53 65 74 2c 20 69 43 75 72 29 3b 20 20 2f 2a  kSet, iCur);  /*
67c0: 20 43 75 72 73 6f 72 20 6d 61 73 6b 20 66 6f 72   Cursor mask for
67d0: 20 74 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20   this table */. 
67e0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
67f0: 20 70 54 61 62 49 74 65 6d 2d 3e 70 54 61 62 3b   pTabItem->pTab;
6800: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
6810: 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 42 65  ;.    Index *pBe
6820: 73 74 49 64 78 20 3d 20 30 3b 0a 20 20 20 20 69  stIdx = 0;.    i
6830: 6e 74 20 62 65 73 74 53 63 6f 72 65 20 3d 20 30  nt bestScore = 0
6840: 3b 0a 20 20 20 20 69 6e 74 20 62 65 73 74 52 65  ;.    int bestRe
6850: 76 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  v = 0;..    /* C
6860: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
6870: 68 65 72 65 20 69 73 20 61 6e 20 65 78 70 72 65  here is an expre
6880: 73 73 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ssion that uses 
6890: 6f 6e 6c 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  only the.    ** 
68a0: 52 4f 57 49 44 20 66 69 65 6c 64 20 6f 66 20 74  ROWID field of t
68b0: 68 69 73 20 74 61 62 6c 65 2e 20 20 46 6f 72 20  his table.  For 
68c0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 66 6f 72  terms of the for
68d0: 6d 20 52 4f 57 49 44 3d 3d 65 78 70 72 0a 20 20  m ROWID==expr.  
68e0: 20 20 2a 2a 20 73 65 74 20 69 44 69 72 65 63 74    ** set iDirect
68f0: 45 71 5b 69 5d 20 74 6f 20 74 68 65 20 69 6e 64  Eq[i] to the ind
6900: 65 78 20 6f 66 20 74 68 65 20 74 65 72 6d 2e 20  ex of the term. 
6910: 20 46 6f 72 20 74 65 72 6d 73 20 6f 66 20 74 68   For terms of th
6920: 65 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 20 52 4f  e.    ** form RO
6930: 57 49 44 3c 65 78 70 72 20 6f 72 20 52 4f 57 49  WID<expr or ROWI
6940: 44 3c 3d 65 78 70 72 20 73 65 74 20 69 44 69 72  D<=expr set iDir
6950: 65 63 74 4c 74 5b 69 5d 20 74 6f 20 74 68 65 20  ectLt[i] to the 
6960: 74 65 72 6d 20 69 6e 64 65 78 2e 0a 20 20 20 20  term index..    
6970: 2a 2a 20 46 6f 72 20 74 65 72 6d 73 20 6c 69 6b  ** For terms lik
6980: 65 20 52 4f 57 49 44 3e 65 78 70 72 20 6f 72 20  e ROWID>expr or 
6990: 52 4f 57 49 44 3e 3d 65 78 70 72 20 73 65 74 20  ROWID>=expr set 
69a0: 69 44 69 72 65 63 74 47 74 5b 69 5d 2e 0a 20 20  iDirectGt[i]..  
69b0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 28 41 64 64    **.    ** (Add
69c0: 65 64 3a 29 20 54 72 65 61 74 20 52 4f 57 49 44  ed:) Treat ROWID
69d0: 20 49 4e 20 65 78 70 72 20 6c 69 6b 65 20 52 4f   IN expr like RO
69e0: 57 49 44 3d 65 78 70 72 2e 0a 20 20 20 20 2a 2f  WID=expr..    */
69f0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64  .    pLevel->iId
6a00: 78 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 69  xCur = -1;.    i
6a10: 44 69 72 65 63 74 45 71 5b 69 5d 20 3d 20 2d 31  DirectEq[i] = -1
6a20: 3b 0a 20 20 20 20 69 44 69 72 65 63 74 4c 74 5b  ;.    iDirectLt[
6a30: 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 69 44 69  i] = -1;.    iDi
6a40: 72 65 63 74 47 74 5b 69 5d 20 3d 20 2d 31 3b 0a  rectGt[i] = -1;.
6a50: 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 61 45      for(pTerm=aE
6a60: 78 70 72 2c 20 6a 3d 30 3b 20 6a 3c 6e 45 78 70  xpr, j=0; j<nExp
6a70: 72 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29  r; j++, pTerm++)
6a80: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  {.      Expr *pX
6a90: 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20   = pTerm->p;.   
6aa0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64     if( pTerm->id
6ab0: 78 4c 65 66 74 3d 3d 69 43 75 72 20 26 26 20 70  xLeft==iCur && p
6ac0: 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d  X->pLeft->iColum
6ad0: 6e 3c 30 0a 20 20 20 20 20 20 20 20 20 20 20 20  n<0.            
6ae0: 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65  && (pTerm->prere
6af0: 71 52 69 67 68 74 20 26 20 6c 6f 6f 70 4d 61 73  qRight & loopMas
6b00: 6b 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65  k)==pTerm->prere
6b10: 71 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  qRight ){.      
6b20: 20 20 73 77 69 74 63 68 28 20 70 58 2d 3e 6f 70    switch( pX->op
6b30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
6b40: 73 65 20 54 4b 5f 49 4e 3a 0a 20 20 20 20 20 20  se TK_IN:.      
6b50: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
6b60: 69 44 69 72 65 63 74 45 71 5b 69 5d 20 3d 20 6a  iDirectEq[i] = j
6b70: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ; break;.       
6b80: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
6b90: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b           case TK
6ba0: 5f 4c 54 3a 20 69 44 69 72 65 63 74 4c 74 5b 69  _LT: iDirectLt[i
6bb0: 5d 20 3d 20 6a 3b 20 62 72 65 61 6b 3b 0a 20 20  ] = j; break;.  
6bc0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
6bd0: 47 45 3a 0a 20 20 20 20 20 20 20 20 20 20 63 61  GE:.          ca
6be0: 73 65 20 54 4b 5f 47 54 3a 20 69 44 69 72 65 63  se TK_GT: iDirec
6bf0: 74 47 74 5b 69 5d 20 3d 20 6a 3b 20 20 62 72 65  tGt[i] = j;  bre
6c00: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
6c10: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
6c20: 20 2f 2a 20 49 66 20 77 65 20 66 6f 75 6e 64 20   /* If we found 
6c30: 61 20 74 65 72 6d 20 74 68 61 74 20 74 65 73 74  a term that test
6c40: 73 20 52 4f 57 49 44 20 77 69 74 68 20 3d 3d 20  s ROWID with == 
6c50: 6f 72 20 49 4e 2c 20 74 68 61 74 20 74 65 72 6d  or IN, that term
6c60: 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  .    ** will be 
6c70: 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74  used to locate t
6c80: 68 65 20 72 6f 77 73 20 69 6e 20 74 68 65 20 64  he rows in the d
6c90: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 20 20  atabase table.  
6ca0: 54 68 65 72 65 0a 20 20 20 20 2a 2a 20 69 73 20  There.    ** is 
6cb0: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 63 6f 6e 74  not need to cont
6cc0: 69 6e 75 65 20 69 6e 74 6f 20 74 68 65 20 63 6f  inue into the co
6cd0: 64 65 20 62 65 6c 6f 77 20 74 68 61 74 20 6c 6f  de below that lo
6ce0: 6f 6b 73 20 66 6f 72 0a 20 20 20 20 2a 2a 20 61  oks for.    ** a
6cf0: 6e 20 69 6e 64 65 78 2e 20 20 57 65 20 77 69 6c  n index.  We wil
6d00: 6c 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  l always use the
6d10: 20 52 4f 57 49 44 20 6f 76 65 72 20 61 6e 20 69   ROWID over an i
6d20: 6e 64 65 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ndex..    */.   
6d30: 20 69 66 28 20 69 44 69 72 65 63 74 45 71 5b 69   if( iDirectEq[i
6d40: 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f  ]>=0 ){.      lo
6d50: 6f 70 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  opMask |= mask;.
6d60: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49        pLevel->pI
6d70: 64 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f  dx = 0;.      co
6d80: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
6d90: 20 20 20 2f 2a 20 44 6f 20 61 20 73 65 61 72 63     /* Do a searc
6da0: 68 20 66 6f 72 20 75 73 61 62 6c 65 20 69 6e 64  h for usable ind
6db0: 69 63 65 73 2e 20 20 4c 65 61 76 65 20 70 42 65  ices.  Leave pBe
6dc0: 73 74 49 64 78 20 70 6f 69 6e 74 69 6e 67 20 74  stIdx pointing t
6dd0: 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 22 62 65  o.    ** the "be
6de0: 73 74 22 20 69 6e 64 65 78 2e 20 20 70 42 65 73  st" index.  pBes
6df0: 74 49 64 78 20 69 73 20 6c 65 66 74 20 73 65 74  tIdx is left set
6e00: 20 74 6f 20 4e 55 4c 4c 20 69 66 20 6e 6f 20 69   to NULL if no i
6e10: 6e 64 69 63 65 73 0a 20 20 20 20 2a 2a 20 61 72  ndices.    ** ar
6e20: 65 20 75 73 61 62 6c 65 2e 0a 20 20 20 20 2a 2a  e usable..    **
6e30: 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 65 73 74  .    ** The best
6e40: 20 69 6e 64 65 78 20 69 73 20 74 68 65 20 6f 6e   index is the on
6e50: 65 20 77 69 74 68 20 74 68 65 20 68 69 67 68 65  e with the highe
6e60: 73 74 20 73 63 6f 72 65 2e 20 20 54 68 65 20 73  st score.  The s
6e70: 63 6f 72 65 0a 20 20 20 20 2a 2a 20 66 6f 72 20  core.    ** for 
6e80: 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 65 74  the index is det
6e90: 65 72 6d 69 6e 65 64 20 61 73 20 66 6f 6c 6c 6f  ermined as follo
6ea0: 77 73 2e 20 20 46 6f 72 20 65 61 63 68 20 6f 66  ws.  For each of
6eb0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
6ec0: 2d 6d 6f 73 74 20 74 65 72 6d 73 20 74 68 61 74  -most terms that
6ed0: 20 69 73 20 66 69 78 65 64 20 62 79 20 61 6e 20   is fixed by an 
6ee0: 65 71 75 61 6c 69 74 79 20 6f 70 65 72 61 74 6f  equality operato
6ef0: 72 2c 20 61 64 64 0a 20 20 20 20 2a 2a 20 33 32  r, add.    ** 32
6f00: 20 74 6f 20 74 68 65 20 73 63 6f 72 65 2e 20 20   to the score.  
6f10: 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 74  The right-most t
6f20: 65 72 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78  erm of the index
6f30: 20 6d 61 79 20 62 65 0a 20 20 20 20 2a 2a 20 63   may be.    ** c
6f40: 6f 6e 73 74 72 61 69 6e 65 64 20 62 79 20 61 6e  onstrained by an
6f50: 20 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 41 64   inequality.  Ad
6f60: 64 20 34 20 69 66 20 66 6f 72 20 61 6e 20 22 78  d 4 if for an "x
6f70: 3c 2e 2e 2e 22 20 63 6f 6e 73 74 72 61 69 6e 74  <..." constraint
6f80: 0a 20 20 20 20 2a 2a 20 61 6e 64 20 61 64 64 20  .    ** and add 
6f90: 38 20 66 6f 72 20 61 6e 20 22 78 3e 2e 2e 2e 22  8 for an "x>..."
6fa0: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 49 66   constraint.  If
6fb0: 20 62 6f 74 68 20 63 6f 6e 73 74 72 61 69 6e 74   both constraint
6fc0: 73 0a 20 20 20 20 2a 2a 20 61 72 65 20 70 72 65  s.    ** are pre
6fd0: 73 65 6e 74 2c 20 61 64 64 20 31 32 2e 0a 20 20  sent, add 12..  
6fe0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
6ff0: 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 74 65 72  he left-most ter
7000: 6d 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 75  m of the index u
7010: 73 65 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74  ses an IN operat
7020: 6f 72 0a 20 20 20 20 2a 2a 20 28 65 78 3a 20 20  or.    ** (ex:  
7030: 22 78 20 49 4e 20 28 2e 2e 2e 29 22 29 20 20 74  "x IN (...)")  t
7040: 68 65 6e 20 61 64 64 20 31 36 20 74 6f 20 74 68  hen add 16 to th
7050: 65 20 73 63 6f 72 65 2e 0a 20 20 20 20 2a 2a 0a  e score..    **.
7060: 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 69 6e 64      ** If an ind
7070: 65 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  ex can be used f
7080: 6f 72 20 73 6f 72 74 69 6e 67 2c 20 61 64 64 20  or sorting, add 
7090: 32 20 74 6f 20 74 68 65 20 73 63 6f 72 65 2e 0a  2 to the score..
70a0: 20 20 20 20 2a 2a 20 49 66 20 61 6e 20 69 6e 64      ** If an ind
70b0: 65 78 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  ex contains all 
70c0: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 61 20 74  the terms of a t
70d0: 61 62 6c 65 20 74 68 61 74 20 61 72 65 20 65 76  able that are ev
70e0: 65 72 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  er.    ** used b
70f0: 79 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f 6e  y any expression
7100: 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74   in the SQL stat
7110: 65 6d 65 6e 74 2c 20 74 68 65 6e 20 61 64 64 20  ement, then add 
7120: 31 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  1 to.    ** the 
7130: 73 63 6f 72 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  score..    **.  
7140: 20 20 2a 2a 20 54 68 69 73 20 73 63 6f 72 69 6e    ** This scorin
7150: 67 20 73 79 73 74 65 6d 20 69 73 20 64 65 73 69  g system is desi
7160: 67 6e 65 64 20 73 6f 20 74 68 61 74 20 74 68 65  gned so that the
7170: 20 73 63 6f 72 65 20 63 61 6e 20 6c 61 74 65 72   score can later
7180: 20 62 65 0a 20 20 20 20 2a 2a 20 75 73 65 64 20   be.    ** used 
7190: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77  to determine how
71a0: 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 75 73   the index is us
71b0: 65 64 2e 20 20 49 66 20 74 68 65 20 73 63 6f 72  ed.  If the scor
71c0: 65 26 30 78 31 63 20 69 73 20 30 0a 20 20 20 20  e&0x1c is 0.    
71d0: 2a 2a 20 74 68 65 6e 20 61 6c 6c 20 63 6f 6e 73  ** then all cons
71e0: 74 72 61 69 6e 74 73 20 61 72 65 20 65 71 75 61  traints are equa
71f0: 6c 69 74 69 65 73 2e 20 20 49 66 20 73 63 6f 72  lities.  If scor
7200: 65 26 30 78 34 20 69 73 20 6e 6f 74 20 30 20 74  e&0x4 is not 0 t
7210: 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 72 65  hen.    ** there
7220: 20 69 73 20 61 6e 20 69 6e 65 71 75 61 6c 69 74   is an inequalit
7230: 79 20 75 73 65 64 20 61 73 20 61 20 74 65 72 6d  y used as a term
7240: 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 20 20 28 65  ination key.  (e
7250: 78 3a 20 22 78 3c 2e 2e 2e 22 29 0a 20 20 20 20  x: "x<...").    
7260: 2a 2a 20 49 66 20 73 63 6f 72 65 26 30 78 38 20  ** If score&0x8 
7270: 69 73 20 6e 6f 74 20 30 20 74 68 65 6e 20 74 68  is not 0 then th
7280: 65 72 65 20 69 73 20 61 6e 20 69 6e 65 71 75 61  ere is an inequa
7290: 6c 69 74 79 20 75 73 65 64 20 61 73 20 74 68 65  lity used as the
72a0: 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6b 65  .    ** start ke
72b0: 79 2e 20 20 28 65 78 3a 20 22 78 3e 2e 2e 2e 22  y.  (ex: "x>..."
72c0: 29 2e 20 20 41 20 73 63 6f 72 65 20 6f 72 20 30  ).  A score or 0
72d0: 78 31 30 20 69 73 20 74 68 65 20 73 70 65 63 69  x10 is the speci
72e0: 61 6c 20 63 61 73 65 0a 20 20 20 20 2a 2a 20 6f  al case.    ** o
72f0: 66 20 61 6e 20 49 4e 20 6f 70 65 72 61 74 6f 72  f an IN operator
7300: 20 63 6f 6e 73 74 72 61 69 6e 74 2e 20 20 28 65   constraint.  (e
7310: 78 3a 20 20 22 78 20 49 4e 20 2e 2e 2e 22 29 2e  x:  "x IN ...").
7320: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
7330: 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 28  he IN operator (
7340: 61 73 20 69 6e 20 22 3c 65 78 70 72 3e 20 49 4e  as in "<expr> IN
7350: 20 28 2e 2e 2e 29 22 29 20 69 73 20 74 72 65 61   (...)") is trea
7360: 74 65 64 20 74 68 65 20 73 61 6d 65 20 61 73 0a  ted the same as.
7370: 20 20 20 20 2a 2a 20 61 6e 20 65 71 75 61 6c 69      ** an equali
7380: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78  ty comparison ex
7390: 63 65 70 74 20 74 68 61 74 20 69 74 20 63 61 6e  cept that it can
73a0: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 6f 6e   only be used on
73b0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6c 65 66 74   the.    ** left
73c0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20  -most column of 
73d0: 61 6e 20 69 6e 64 65 78 20 61 6e 64 20 6f 74 68  an index and oth
73e0: 65 72 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  er terms of the 
73f0: 57 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20  WHERE clause.   
7400: 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 75 73   ** cannot be us
7410: 65 64 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f  ed in conjunctio
7420: 6e 20 77 69 74 68 20 74 68 65 20 49 4e 20 6f 70  n with the IN op
7430: 65 72 61 74 6f 72 20 74 6f 20 68 65 6c 70 20 73  erator to help s
7440: 61 74 69 73 66 79 0a 20 20 20 20 2a 2a 20 6f 74  atisfy.    ** ot
7450: 68 65 72 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  her columns of t
7460: 68 65 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2f  he index..    */
7470: 0a 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54  .    for(pIdx=pT
7480: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
7490: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
74a0: 78 74 29 7b 0a 20 20 20 20 20 20 42 69 74 6d 61  xt){.      Bitma
74b0: 73 6b 20 65 71 4d 61 73 6b 20 3d 20 30 3b 20 20  sk eqMask = 0;  
74c0: 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  /* Index columns
74d0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20 78   covered by an x
74e0: 3d 2e 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20 20  =... term */.   
74f0: 20 20 20 42 69 74 6d 61 73 6b 20 6c 74 4d 61 73     Bitmask ltMas
7500: 6b 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65 78  k = 0;  /* Index
7510: 20 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65 64   columns covered
7520: 20 62 79 20 61 6e 20 78 3c 2e 2e 2e 20 74 65 72   by an x<... ter
7530: 6d 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d 61  m */.      Bitma
7540: 73 6b 20 67 74 4d 61 73 6b 20 3d 20 30 3b 20 20  sk gtMask = 0;  
7550: 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e 73  /* Index columns
7560: 20 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20 78   covered by an x
7570: 3e 2e 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20 20  >... term */.   
7580: 20 20 20 42 69 74 6d 61 73 6b 20 69 6e 4d 61 73     Bitmask inMas
7590: 6b 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65 78  k = 0;  /* Index
75a0: 20 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65 64   columns covered
75b0: 20 62 79 20 61 6e 20 78 20 49 4e 20 2e 2e 20 74   by an x IN .. t
75c0: 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 42 69 74  erm */.      Bit
75d0: 6d 61 73 6b 20 6d 3b 0a 20 20 20 20 20 20 69 6e  mask m;.      in
75e0: 74 20 6e 45 71 2c 20 73 63 6f 72 65 2c 20 62 52  t nEq, score, bR
75f0: 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  ev = 0;..      i
7600: 66 28 20 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e  f( pIdx->nColumn
7610: 3e 73 69 7a 65 6f 66 28 65 71 4d 61 73 6b 29 2a  >sizeof(eqMask)*
7620: 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  8 ){.        con
7630: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72  tinue;  /* Ignor
7640: 65 20 69 6e 64 69 63 65 73 20 77 69 74 68 20 74  e indices with t
7650: 6f 6f 20 6d 61 6e 79 20 63 6f 6c 75 6d 6e 73 20  oo many columns 
7660: 74 6f 20 61 6e 61 6c 79 7a 65 20 2a 2f 0a 20 20  to analyze */.  
7670: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
7680: 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a 3d 30  pTerm=aExpr, j=0
7690: 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20  ; j<nExpr; j++, 
76a0: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
76b0: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
76c0: 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 43  rm->p;.        C
76d0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
76e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53  sqlite3ExprCollS
76f0: 65 71 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  eq(pParse, pX->p
7700: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 69  Left);.        i
7710: 66 28 20 21 70 43 6f 6c 6c 20 26 26 20 70 58 2d  f( !pColl && pX-
7720: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
7730: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
7740: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
7750: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
7760: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ht);.        }. 
7770: 20 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c         if( !pCol
7780: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  l ){.          p
7790: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
77a0: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20  b->pDfltColl;.  
77b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
77c0: 69 66 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65  if( pTerm->idxLe
77d0: 66 74 3d 3d 69 43 75 72 20 0a 20 20 20 20 20 20  ft==iCur .      
77e0: 20 20 20 20 20 20 20 26 26 20 28 70 54 65 72 6d         && (pTerm
77f0: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 26 20  ->prereqRight & 
7800: 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65 72 6d  loopMask)==pTerm
7810: 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20 29 7b  ->prereqRight ){
7820: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
7830: 43 6f 6c 75 6d 6e 20 3d 20 70 58 2d 3e 70 4c 65  Column = pX->pLe
7840: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  ft->iColumn;.   
7850: 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20         int k;.  
7860: 20 20 20 20 20 20 20 20 63 68 61 72 20 69 64 78          char idx
7870: 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54 61 62  aff = pIdx->pTab
7880: 6c 65 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 75 6d 6e  le->aCol[iColumn
7890: 5d 2e 61 66 66 69 6e 69 74 79 3b 20 0a 20 20 20  ].affinity; .   
78a0: 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20         for(k=0; 
78b0: 6b 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b  k<pIdx->nColumn;
78c0: 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   k++){.         
78d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6c     /* If the col
78e0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 73  lating sequences
78f0: 20 6f 72 20 61 66 66 69 6e 69 74 69 65 73 20 64   or affinities d
7900: 6f 6e 27 74 20 6d 61 74 63 68 2c 20 0a 20 20 20  on't match, .   
7910: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 67 6e 6f           ** igno
7920: 72 65 20 74 68 69 73 20 69 6e 64 65 78 2e 20 20  re this index.  
7930: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  */.            i
7940: 66 28 20 70 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e  f( pColl!=pIdx->
7950: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d  keyInfo.aColl[k]
7960: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
7970: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
7980: 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69  lite3IndexAffini
7990: 74 79 4f 6b 28 70 58 2c 20 69 64 78 61 66 66 29  tyOk(pX, idxaff)
79a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
79b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 64           if( pId
79c0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6b 5d 3d 3d  x->aiColumn[k]==
79d0: 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20  iColumn ){.     
79e0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
79f0: 20 70 58 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 20   pX->op ){.     
7a00: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
7a10: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 20  TK_IN: {.       
7a20: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6b             if( k
7a30: 3d 3d 30 20 29 20 69 6e 4d 61 73 6b 20 7c 3d 20  ==0 ) inMask |= 
7a40: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
7a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7a60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
7a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
7a80: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 71                eq
7aa0: 4d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  Mask |= ((Bitmas
7ab0: 6b 29 31 29 3c 3c 6b 3b 0a 20 20 20 20 20 20 20  k)1)<<k;.       
7ac0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
7ad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
7ae0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
7af0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 7b 0a 20 20  case TK_LT: {.  
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b30: 6c 74 4d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d  ltMask |= ((Bitm
7b40: 61 73 6b 29 31 29 3c 3c 6b 3b 0a 20 20 20 20 20  ask)1)<<k;.     
7b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
7b60: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7b70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7b80: 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45        case TK_GE
7b90: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
7ba0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 7b 0a    case TK_GT: {.
7bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bc0: 20 20 67 74 4d 61 73 6b 20 7c 3d 20 28 28 42 69    gtMask |= ((Bi
7bd0: 74 6d 61 73 6b 29 31 29 3c 3c 6b 3b 0a 20 20 20  tmask)1)<<k;.   
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
7bf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7c10: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
7c20: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7c30: 20 20 20 20 20 2f 2a 20 43 41 4e 54 5f 48 41 50       /* CANT_HAP
7c40: 50 45 4e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  PEN */.         
7c50: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
7c60: 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0 );.          
7c70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
7c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
7cb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
7cc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
7cd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7ce0: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  }..      /* The 
7cf0: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 65  following loop e
7d00: 6e 64 73 20 77 69 74 68 20 6e 45 71 20 73 65 74  nds with nEq set
7d10: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
7d20: 66 20 63 6f 6c 75 6d 6e 73 0a 20 20 20 20 20 20  f columns.      
7d30: 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74 20 6f  ** on the left o
7d40: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
7d50: 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 2e   == constraints.
7d60: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
7d70: 66 6f 72 28 6e 45 71 3d 30 3b 20 6e 45 71 3c 70  for(nEq=0; nEq<p
7d80: 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45  Idx->nColumn; nE
7d90: 71 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6d 20  q++){.        m 
7da0: 3d 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29 3c  = (((Bitmask)1)<
7db0: 3c 28 6e 45 71 2b 31 29 29 2d 31 3b 0a 20 20 20  <(nEq+1))-1;.   
7dc0: 20 20 20 20 20 69 66 28 20 28 6d 20 26 20 65 71       if( (m & eq
7dd0: 4d 61 73 6b 29 21 3d 6d 20 29 20 62 72 65 61 6b  Mask)!=m ) break
7de0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
7df0: 20 2f 2a 20 42 65 67 69 6e 20 61 73 73 65 6d 62   /* Begin assemb
7e00: 6c 79 69 6e 67 20 74 68 65 20 73 63 6f 72 65 0a  lying the score.
7e10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
7e20: 63 6f 72 65 20 3d 20 6e 45 71 2a 33 32 3b 20 20  core = nEq*32;  
7e30: 20 2f 2a 20 42 61 73 65 20 73 63 6f 72 65 20 69   /* Base score i
7e40: 73 20 33 32 20 74 69 6d 65 73 20 6e 75 6d 62 65  s 32 times numbe
7e50: 72 20 6f 66 20 3d 3d 20 63 6f 6e 73 74 72 61 69  r of == constrai
7e60: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 6d 20 3d  nts */.      m =
7e70: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e   ((Bitmask)1)<<n
7e80: 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 20  Eq;.      if( m 
7e90: 26 20 6c 74 4d 61 73 6b 20 29 20 73 63 6f 72 65  & ltMask ) score
7ea0: 2b 3d 34 3b 20 20 20 20 2f 2a 20 49 6e 63 72 65  +=4;    /* Incre
7eb0: 61 73 65 20 73 63 6f 72 65 20 66 6f 72 20 61 20  ase score for a 
7ec0: 3c 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a  < constraint */.
7ed0: 20 20 20 20 20 20 69 66 28 20 6d 20 26 20 67 74        if( m & gt
7ee0: 4d 61 73 6b 20 29 20 73 63 6f 72 65 2b 3d 38 3b  Mask ) score+=8;
7ef0: 20 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20      /* Increase 
7f00: 73 63 6f 72 65 20 66 6f 72 20 61 20 3e 20 63 6f  score for a > co
7f10: 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20  nstraint */.    
7f20: 20 20 69 66 28 20 73 63 6f 72 65 3d 3d 30 20 26    if( score==0 &
7f30: 26 20 69 6e 4d 61 73 6b 20 29 20 73 63 6f 72 65  & inMask ) score
7f40: 20 3d 20 31 36 3b 20 2f 2a 20 44 65 66 61 75 6c   = 16; /* Defaul
7f50: 74 20 73 63 6f 72 65 20 66 6f 72 20 49 4e 20 63  t score for IN c
7f60: 6f 6e 73 74 72 61 69 6e 74 20 2a 2f 0a 0a 20 20  onstraint */..  
7f70: 20 20 20 20 2f 2a 20 47 69 76 65 20 62 6f 6e 75      /* Give bonu
7f80: 73 20 70 6f 69 6e 74 73 20 69 66 20 74 68 69 73  s points if this
7f90: 20 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73   index can be us
7fa0: 65 64 20 66 6f 72 20 73 6f 72 74 69 6e 67 0a 20  ed for sorting. 
7fb0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
7fc0: 28 20 69 3d 3d 30 20 26 26 20 73 63 6f 72 65 21  ( i==0 && score!
7fd0: 3d 31 36 20 26 26 20 70 70 4f 72 64 65 72 42 79  =16 && ppOrderBy
7fe0: 20 26 26 20 2a 70 70 4f 72 64 65 72 42 79 20 29   && *ppOrderBy )
7ff0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 62 61  {.        int ba
8000: 73 65 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61  se = pTabList->a
8010: 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20 20  [0].iCursor;.   
8020: 20 20 20 20 20 69 66 28 20 69 73 53 6f 72 74 69       if( isSorti
8030: 6e 67 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  ngIndex(pParse, 
8040: 70 49 64 78 2c 20 70 54 61 62 2c 20 62 61 73 65  pIdx, pTab, base
8050: 2c 20 2a 70 70 4f 72 64 65 72 42 79 2c 20 6e 45  , *ppOrderBy, nE
8060: 71 2c 20 26 62 52 65 76 29 20 29 7b 0a 20 20 20  q, &bRev) ){.   
8070: 20 20 20 20 20 20 20 73 63 6f 72 65 20 2b 3d 20         score += 
8080: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
8090: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
80a0: 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77  heck to see if w
80b0: 65 20 63 61 6e 20 67 65 74 20 61 77 61 79 20 77  e can get away w
80c0: 69 74 68 20 75 73 69 6e 67 20 6a 75 73 74 20 74  ith using just t
80d0: 68 65 20 69 6e 64 65 78 20 77 69 74 68 6f 75 74  he index without
80e0: 0a 20 20 20 20 20 20 2a 2a 20 65 76 65 72 20 72  .      ** ever r
80f0: 65 61 64 69 6e 67 20 74 68 65 20 74 61 62 6c 65  eading the table
8100: 2e 20 20 49 66 20 74 68 61 74 20 69 73 20 74 68  .  If that is th
8110: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 61 64 64  e case, then add
8120: 20 6f 6e 65 20 62 6f 6e 75 73 0a 20 20 20 20 20   one bonus.     
8130: 20 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   ** point to the
8140: 20 73 63 6f 72 65 2e 0a 20 20 20 20 20 20 2a 2f   score..      */
8150: 0a 20 20 20 20 20 20 69 66 28 20 73 63 6f 72 65  .      if( score
8160: 20 26 26 20 70 54 61 62 49 74 65 6d 2d 3e 63 6f   && pTabItem->co
8170: 6c 55 73 65 64 20 3c 20 28 28 28 42 69 74 6d 61  lUsed < (((Bitma
8180: 73 6b 29 31 29 3c 3c 28 42 4d 53 2d 31 29 29 20  sk)1)<<(BMS-1)) 
8190: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6d  ){.        for(m
81a0: 3d 30 2c 20 6a 3d 30 3b 20 6a 3c 70 49 64 78 2d  =0, j=0; j<pIdx-
81b0: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a  >nColumn; j++){.
81c0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
81d0: 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e  = pIdx->aiColumn
81e0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  [j];.          i
81f0: 66 28 20 78 3c 42 4d 53 2d 31 20 29 7b 0a 20 20  f( x<BMS-1 ){.  
8200: 20 20 20 20 20 20 20 20 20 20 6d 20 7c 3d 20 28            m |= (
8210: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 78 3b 0a  (Bitmask)1)<<x;.
8220: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
8240: 28 20 28 70 54 61 62 49 74 65 6d 2d 3e 63 6f 6c  ( (pTabItem->col
8250: 55 73 65 64 20 26 20 6d 29 3d 3d 70 54 61 62 49  Used & m)==pTabI
8260: 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 29 7b 0a  tem->colUsed ){.
8270: 20 20 20 20 20 20 20 20 20 20 73 63 6f 72 65 2b            score+
8280: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
8290: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49     }..      /* I
82a0: 66 20 74 68 65 20 73 63 6f 72 65 20 66 6f 72 20  f the score for 
82b0: 74 68 69 73 20 69 6e 64 65 78 20 69 73 20 74 68  this index is th
82c0: 65 20 62 65 73 74 20 77 65 20 68 61 76 65 20 73  e best we have s
82d0: 65 65 6e 20 73 6f 20 66 61 72 2c 20 74 68 65 6e  een so far, then
82e0: 0a 20 20 20 20 20 20 2a 2a 20 73 61 76 65 20 69  .      ** save i
82f0: 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  t.      */.     
8300: 20 69 66 28 20 73 63 6f 72 65 3e 62 65 73 74 53   if( score>bestS
8310: 63 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  core ){.        
8320: 70 42 65 73 74 49 64 78 20 3d 20 70 49 64 78 3b  pBestIdx = pIdx;
8330: 0a 20 20 20 20 20 20 20 20 62 65 73 74 53 63 6f  .        bestSco
8340: 72 65 20 3d 20 73 63 6f 72 65 3b 0a 20 20 20 20  re = score;.    
8350: 20 20 20 20 62 65 73 74 52 65 76 20 3d 20 62 52      bestRev = bR
8360: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
8370: 7d 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 49  }.    pLevel->pI
8380: 64 78 20 3d 20 70 42 65 73 74 49 64 78 3b 0a 20  dx = pBestIdx;. 
8390: 20 20 20 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65     pLevel->score
83a0: 20 3d 20 62 65 73 74 53 63 6f 72 65 3b 0a 20 20   = bestScore;.  
83b0: 20 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 3d    pLevel->bRev =
83c0: 20 62 65 73 74 52 65 76 3b 0a 20 20 20 20 6c 6f   bestRev;.    lo
83d0: 6f 70 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  opMask |= mask;.
83e0: 20 20 20 20 69 66 28 20 70 42 65 73 74 49 64 78      if( pBestIdx
83f0: 20 29 7b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c   ){.      pLevel
8400: 2d 3e 69 49 64 78 43 75 72 20 3d 20 70 50 61 72  ->iIdxCur = pPar
8410: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
8420: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  }.  }..  /* Chec
8430: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
8440: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8450: 69 73 20 6f 72 20 63 61 6e 20 62 65 20 73 61 74  is or can be sat
8460: 69 73 66 69 65 64 20 62 79 20 74 68 65 0a 20 20  isfied by the.  
8470: 2a 2a 20 75 73 65 20 6f 66 20 61 6e 20 69 6e 64  ** use of an ind
8480: 65 78 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20  ex on the first 
8490: 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  table..  */.  if
84a0: 28 20 70 70 4f 72 64 65 72 42 79 20 26 26 20 2a  ( ppOrderBy && *
84b0: 70 70 4f 72 64 65 72 42 79 20 26 26 20 70 54 61  ppOrderBy && pTa
84c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3e 30 20 29 7b  bList->nSrc>0 ){
84d0: 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78  .    Index *pIdx
84e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
84f0: 20 49 6e 64 65 78 20 64 65 72 69 76 65 64 20 66   Index derived f
8500: 72 6f 6d 20 74 68 65 20 57 48 45 52 45 20 63 6c  rom the WHERE cl
8510: 61 75 73 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c  ause */.    Tabl
8520: 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20 20  e *pTab;        
8530: 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f 73       /* Left-mos
8540: 74 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46  t table in the F
8550: 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  ROM clause */.  
8560: 20 20 69 6e 74 20 62 52 65 76 20 3d 20 30 3b 20    int bRev = 0; 
8570: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8580: 75 65 20 74 6f 20 72 65 76 65 72 73 65 20 74 68  ue to reverse th
8590: 65 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 2a  e output order *
85a0: 2f 0a 20 20 20 20 69 6e 74 20 69 43 75 72 3b 20  /.    int iCur; 
85b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
85c0: 2a 20 42 74 72 65 65 2d 63 75 72 73 6f 72 20 74  * Btree-cursor t
85d0: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
85e0: 20 62 79 20 70 54 61 62 20 2a 2f 0a 20 20 20 20   by pTab */.    
85f0: 57 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76  WhereLevel *pLev
8600: 65 6c 30 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61  el0 = &pWInfo->a
8610: 5b 30 5d 3b 0a 0a 20 20 20 20 70 54 61 62 20 3d  [0];..    pTab =
8620: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e   pTabList->a[0].
8630: 70 54 61 62 3b 0a 20 20 20 20 70 49 64 78 20 3d  pTab;.    pIdx =
8640: 20 70 4c 65 76 65 6c 30 2d 3e 70 49 64 78 3b 0a   pLevel0->pIdx;.
8650: 20 20 20 20 69 43 75 72 20 3d 20 70 54 61 62 4c      iCur = pTabL
8660: 69 73 74 2d 3e 61 5b 30 5d 2e 69 43 75 72 73 6f  ist->a[0].iCurso
8670: 72 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 3d  r;.    if( pIdx=
8680: 3d 30 20 26 26 20 73 6f 72 74 61 62 6c 65 42 79  =0 && sortableBy
8690: 52 6f 77 69 64 28 69 43 75 72 2c 20 2a 70 70 4f  Rowid(iCur, *ppO
86a0: 72 64 65 72 42 79 2c 20 26 62 52 65 76 29 20 29  rderBy, &bRev) )
86b0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 4f  {.      /* The O
86c0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 73  RDER BY clause s
86d0: 70 65 63 69 66 69 65 73 20 52 4f 57 49 44 20 6f  pecifies ROWID o
86e0: 72 64 65 72 2c 20 77 68 69 63 68 20 69 73 20 77  rder, which is w
86f0: 68 61 74 20 77 65 0a 20 20 20 20 20 20 2a 2a 20  hat we.      ** 
8700: 77 65 72 65 20 67 6f 69 6e 67 20 74 6f 20 62 65  were going to be
8710: 20 64 6f 69 6e 67 20 61 6e 79 77 61 79 2e 2e 2e   doing anyway...
8720: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
8730: 2a 70 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  *ppOrderBy = 0;.
8740: 20 20 20 20 20 20 70 4c 65 76 65 6c 30 2d 3e 62        pLevel0->b
8750: 52 65 76 20 3d 20 62 52 65 76 3b 0a 20 20 20 20  Rev = bRev;.    
8760: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c  }else if( pLevel
8770: 30 2d 3e 73 63 6f 72 65 3d 3d 31 36 20 29 7b 0a  0->score==16 ){.
8780: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
8790: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
87a0: 49 4e 20 69 6e 64 65 78 20 6f 6e 20 74 68 65 20  IN index on the 
87b0: 6c 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 2c  left-most table,
87c0: 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 77 69 6c  .      ** it wil
87d0: 6c 20 6e 6f 74 20 67 69 76 65 20 74 68 65 20 63  l not give the c
87e0: 6f 72 72 65 63 74 20 73 6f 72 74 20 6f 72 64 65  orrect sort orde
87f0: 72 2e 0a 20 20 20 20 20 20 2a 2a 20 53 6f 2c 20  r..      ** So, 
8800: 70 72 65 74 65 6e 64 20 74 68 61 74 20 6e 6f 20  pretend that no 
8810: 73 75 69 74 61 62 6c 65 20 69 6e 64 65 78 20 69  suitable index i
8820: 73 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a  s found..      *
8830: 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
8840: 69 44 69 72 65 63 74 45 71 5b 30 5d 3e 3d 30 20  iDirectEq[0]>=0 
8850: 7c 7c 20 69 44 69 72 65 63 74 4c 74 5b 30 5d 3e  || iDirectLt[0]>
8860: 3d 30 20 7c 7c 20 69 44 69 72 65 63 74 47 74 5b  =0 || iDirectGt[
8870: 30 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  0]>=0 ){.      /
8880: 2a 20 49 66 20 74 68 65 20 6c 65 66 74 2d 6d 6f  * If the left-mo
8890: 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 61 63 63  st column is acc
88a0: 65 73 73 65 64 20 75 73 69 6e 67 20 69 74 73 20  essed using its 
88b0: 52 4f 57 49 44 2c 20 74 68 65 6e 20 64 6f 0a 20  ROWID, then do. 
88c0: 20 20 20 20 20 2a 2a 20 6e 6f 74 20 74 72 79 20       ** not try 
88d0: 74 6f 20 73 6f 72 74 20 62 79 20 69 6e 64 65 78  to sort by index
88e0: 2e 20 20 42 75 74 20 64 6f 20 64 65 6c 65 74 65  .  But do delete
88f0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   the ORDER BY cl
8900: 61 75 73 65 0a 20 20 20 20 20 20 2a 2a 20 69 66  ause.      ** if
8910: 20 69 74 20 69 73 20 72 65 64 75 6e 64 61 6e 74   it is redundant
8920: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
8930: 65 6c 73 65 20 69 66 28 20 28 70 4c 65 76 65 6c  else if( (pLevel
8940: 30 2d 3e 73 63 6f 72 65 26 32 29 21 3d 30 20 29  0->score&2)!=0 )
8950: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69  {.      /* The i
8960: 6e 64 65 78 20 74 68 61 74 20 77 61 73 20 73 65  ndex that was se
8970: 6c 65 63 74 65 64 20 66 6f 72 20 73 65 61 72 63  lected for searc
8980: 68 69 6e 67 20 77 69 6c 6c 20 63 61 75 73 65 20  hing will cause 
8990: 72 6f 77 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  rows to.      **
89a0: 20 61 70 70 65 61 72 20 69 6e 20 73 6f 72 74 65   appear in sorte
89b0: 64 20 6f 72 64 65 72 2e 0a 20 20 20 20 20 20 2a  d order..      *
89c0: 2f 0a 20 20 20 20 20 20 2a 70 70 4f 72 64 65 72  /.      *ppOrder
89d0: 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  By = 0;.    }.  
89e0: 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 61 6c 6c  }..  /* Open all
89f0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70   tables in the p
8a00: 54 61 62 4c 69 73 74 20 61 6e 64 20 61 6e 79 20  TabList and any 
8a10: 69 6e 64 69 63 65 73 20 73 65 6c 65 63 74 65 64  indices selected
8a20: 20 66 6f 72 0a 20 20 2a 2a 20 73 65 61 72 63 68   for.  ** search
8a30: 69 6e 67 20 74 68 6f 73 65 20 74 61 62 6c 65 73  ing those tables
8a40: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
8a50: 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d 61  CodeVerifySchema
8a60: 28 70 50 61 72 73 65 2c 20 2d 31 29 3b 20 2f 2a  (pParse, -1); /*
8a70: 20 49 6e 73 65 72 74 20 74 68 65 20 63 6f 6f 6b   Insert the cook
8a80: 69 65 20 76 65 72 69 66 69 65 72 20 47 6f 74 6f  ie verifier Goto
8a90: 20 2a 2f 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70   */.  pLevel = p
8aa0: 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 66 6f 72 28  WInfo->a;.  for(
8ab0: 69 3d 30 2c 20 70 54 61 62 49 74 65 6d 3d 70 54  i=0, pTabItem=pT
8ac0: 61 62 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 54 61  abList->a; i<pTa
8ad0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  bList->nSrc; i++
8ae0: 2c 20 70 54 61 62 49 74 65 6d 2b 2b 2c 20 70 4c  , pTabItem++, pL
8af0: 65 76 65 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62  evel++){.    Tab
8b00: 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 49 6e  le *pTab;.    In
8b10: 64 65 78 20 2a 70 49 78 3b 0a 20 20 20 20 69 6e  dex *pIx;.    in
8b20: 74 20 69 49 64 78 43 75 72 20 3d 20 70 4c 65 76  t iIdxCur = pLev
8b30: 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 0a 20 20  el->iIdxCur;..  
8b40: 20 20 70 54 61 62 20 3d 20 70 54 61 62 49 74 65    pTab = pTabIte
8b50: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66 28  m->pTab;.    if(
8b60: 20 70 54 61 62 2d 3e 69 73 54 72 61 6e 73 69 65   pTab->isTransie
8b70: 6e 74 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  nt || pTab->pSel
8b80: 65 63 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ect ) continue;.
8b90: 20 20 20 20 69 66 28 20 28 70 4c 65 76 65 6c 2d      if( (pLevel-
8ba0: 3e 73 63 6f 72 65 20 26 20 31 29 3d 3d 30 20 29  >score & 1)==0 )
8bb0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8bc0: 70 65 6e 54 61 62 6c 65 46 6f 72 52 65 61 64 69  penTableForReadi
8bd0: 6e 67 28 76 2c 20 70 54 61 62 49 74 65 6d 2d 3e  ng(v, pTabItem->
8be0: 69 43 75 72 73 6f 72 2c 20 70 54 61 62 29 3b 0a  iCursor, pTab);.
8bf0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 65 76 65 6c      }.    pLevel
8c00: 2d 3e 69 54 61 62 43 75 72 20 3d 20 70 54 61 62  ->iTabCur = pTab
8c10: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
8c20: 20 20 20 69 66 28 20 28 70 49 78 20 3d 20 70 4c     if( (pIx = pL
8c30: 65 76 65 6c 2d 3e 70 49 64 78 29 21 3d 30 20 29  evel->pIdx)!=0 )
8c40: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
8c50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
8c60: 6e 74 65 67 65 72 2c 20 70 49 78 2d 3e 69 44 62  nteger, pIx->iDb
8c70: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8c80: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
8c90: 5f 4f 70 65 6e 52 65 61 64 2c 20 69 49 64 78 43  _OpenRead, iIdxC
8ca0: 75 72 2c 20 70 49 78 2d 3e 74 6e 75 6d 2c 0a 20  ur, pIx->tnum,. 
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 28 63 68 61 72 2a 29 26 70 49 78 2d      (char*)&pIx-
8cd0: 3e 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  >keyInfo, P3_KEY
8ce0: 49 4e 46 4f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  INFO);.    }.   
8cf0: 20 69 66 28 20 28 70 4c 65 76 65 6c 2d 3e 73 63   if( (pLevel->sc
8d00: 6f 72 65 20 26 20 31 29 21 3d 30 20 29 7b 0a 20  ore & 1)!=0 ){. 
8d10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65 79 41  AddOp(v, OP_KeyA
8d30: 73 44 61 74 61 2c 20 69 49 64 78 43 75 72 2c 20  sData, iIdxCur, 
8d40: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
8d50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8d60: 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20  _SetNumColumns, 
8d70: 69 49 64 78 43 75 72 2c 20 70 49 78 2d 3e 6e 43  iIdxCur, pIx->nC
8d80: 6f 6c 75 6d 6e 2b 31 29 3b 0a 20 20 20 20 7d 0a  olumn+1);.    }.
8d90: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56      sqlite3CodeV
8da0: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
8db0: 73 65 2c 20 70 54 61 62 2d 3e 69 44 62 29 3b 0a  se, pTab->iDb);.
8dc0: 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d 3e 69 54    }.  pWInfo->iT
8dd0: 6f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  op = sqlite3Vdbe
8de0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
8df0: 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
8e00: 68 65 20 63 6f 64 65 20 74 6f 20 64 6f 20 74 68  he code to do th
8e10: 65 20 73 65 61 72 63 68 0a 20 20 2a 2f 0a 20 20  e search.  */.  
8e20: 6c 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b 0a 20 20  loopMask = 0;.  
8e30: 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d  pLevel = pWInfo-
8e40: 3e 61 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d  >a;.  pTabItem =
8e50: 20 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20   pTabList->a;.  
8e60: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c  for(i=0; i<pTabL
8e70: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
8e80: 70 54 61 62 49 74 65 6d 2b 2b 2c 20 70 4c 65 76  pTabItem++, pLev
8e90: 65 6c 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a  el++){.    int j
8ea0: 2c 20 6b 3b 0a 20 20 20 20 69 6e 74 20 69 43 75  , k;.    int iCu
8eb0: 72 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 69 43  r = pTabItem->iC
8ec0: 75 72 73 6f 72 3b 20 20 2f 2a 20 54 68 65 20 56  ursor;  /* The V
8ed0: 44 42 45 20 63 75 72 73 6f 72 20 66 6f 72 20 74  DBE cursor for t
8ee0: 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
8ef0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
8f00: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
8f10: 77 65 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67  we will be using
8f20: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
8f30: 43 75 72 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Cur;       /* Th
8f40: 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 66 6f  e VDBE cursor fo
8f50: 72 20 74 68 65 20 69 6e 64 65 78 20 2a 2f 0a 20  r the index */. 
8f60: 20 20 20 69 6e 74 20 6f 6d 69 74 54 61 62 6c 65     int omitTable
8f70: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8f80: 20 77 65 20 75 73 65 20 74 68 65 20 69 6e 64 65   we use the inde
8f90: 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 20 20 20 20 70  x only */..    p
8fa0: 49 64 78 20 3d 20 70 4c 65 76 65 6c 2d 3e 70 49  Idx = pLevel->pI
8fb0: 64 78 3b 0a 20 20 20 20 69 49 64 78 43 75 72 20  dx;.    iIdxCur 
8fc0: 3d 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  = pLevel->iIdxCu
8fd0: 72 3b 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69  r;.    pLevel->i
8fe0: 6e 4f 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 0a  nOp = OP_Noop;..
8ff0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
9000: 73 65 65 20 69 66 20 69 74 20 69 73 20 61 70 70  see if it is app
9010: 72 6f 70 72 69 61 74 65 20 74 6f 20 6f 6d 69 74  ropriate to omit
9020: 20 74 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   the use of the 
9030: 74 61 62 6c 65 0a 20 20 20 20 2a 2a 20 68 65 72  table.    ** her
9040: 65 20 61 6e 64 20 75 73 65 20 69 74 73 20 69 6e  e and use its in
9050: 64 65 78 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  dex instead..   
9060: 20 2a 2f 0a 20 20 20 20 6f 6d 69 74 54 61 62 6c   */.    omitTabl
9070: 65 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 73 63 6f  e = (pLevel->sco
9080: 72 65 26 31 29 21 3d 30 3b 0a 0a 20 20 20 20 2f  re&1)!=0;..    /
9090: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
90a0: 20 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20   right table of 
90b0: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
90c0: 4e 2c 20 61 6c 6c 6f 63 61 74 65 20 61 6e 64 0a  N, allocate and.
90d0: 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a      ** initializ
90e0: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  e a memory cell 
90f0: 74 68 61 74 20 72 65 63 6f 72 64 73 20 69 66 20  that records if 
9100: 74 68 69 73 20 74 61 62 6c 65 20 6d 61 74 63 68  this table match
9110: 65 73 20 61 6e 79 0a 20 20 20 20 2a 2a 20 72 6f  es any.    ** ro
9120: 77 20 6f 66 20 74 68 65 20 6c 65 66 74 20 74 61  w of the left ta
9130: 62 6c 65 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e  ble of the join.
9140: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
9150: 69 3e 30 20 26 26 20 28 70 54 61 62 4c 69 73 74  i>0 && (pTabList
9160: 2d 3e 61 5b 69 2d 31 5d 2e 6a 6f 69 6e 74 79 70  ->a[i-1].jointyp
9170: 65 20 26 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20  e & JT_LEFT)!=0 
9180: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50  ){.      if( !pP
9190: 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 20 70 50 61  arse->nMem ) pPa
91a0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
91b0: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74     pLevel->iLeft
91c0: 4a 6f 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  Join = pParse->n
91d0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  Mem++;.      sql
91e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
91f0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
9200: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9210: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9220: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
9230: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c 20 31 29  l->iLeftJoin, 1)
9240: 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d  ;.      VdbeComm
9250: 65 6e 74 28 28 76 2c 20 22 23 20 69 6e 69 74 20  ent((v, "# init 
9260: 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d 6d 61 74  LEFT JOIN no-mat
9270: 63 68 20 66 6c 61 67 22 29 29 3b 0a 20 20 20 20  ch flag"));.    
9280: 7d 0a 0a 20 20 20 20 69 66 28 20 69 3c 41 52 52  }..    if( i<ARR
9290: 41 59 53 49 5a 45 28 69 44 69 72 65 63 74 45 71  AYSIZE(iDirectEq
92a0: 29 20 26 26 20 28 6b 20 3d 20 69 44 69 72 65 63  ) && (k = iDirec
92b0: 74 45 71 5b 69 5d 29 3e 3d 30 20 29 7b 0a 20 20  tEq[i])>=0 ){.  
92c0: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
92d0: 57 65 20 63 61 6e 20 64 69 72 65 63 74 6c 79 20  We can directly 
92e0: 72 65 66 65 72 65 6e 63 65 20 61 20 73 69 6e 67  reference a sing
92f0: 6c 65 20 72 6f 77 20 75 73 69 6e 67 20 61 6e 0a  le row using an.
9300: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
9310: 20 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70 61    equality compa
9320: 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20 74 68  rison against th
9330: 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e 20 20  e ROWID field.  
9340: 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  Or.      **     
9350: 20 20 20 20 20 77 65 20 72 65 66 65 72 65 6e 63       we referenc
9360: 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f 77 73 20  e multiple rows 
9370: 75 73 69 6e 67 20 61 20 22 72 6f 77 69 64 20 49  using a "rowid I
9380: 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20 20 20 2a  N (...)".      *
9390: 2a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  *          const
93a0: 72 75 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ruct..      */. 
93b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
93c0: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 70 54  Expr );.      pT
93d0: 65 72 6d 20 3d 20 26 61 45 78 70 72 5b 6b 5d 3b  erm = &aExpr[k];
93e0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
93f0: 54 65 72 6d 2d 3e 70 21 3d 30 20 29 3b 0a 20 20  Term->p!=0 );.  
9400: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72      assert( pTer
9410: 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72  m->idxLeft==iCur
9420: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9430: 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29  ( omitTable==0 )
9440: 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c  ;.      brk = pL
9450: 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69  evel->brk = sqli
9460: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
9470: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 45  (v);.      codeE
9480: 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50 61 72  qualityTerm(pPar
9490: 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b 2c 20  se, pTerm, brk, 
94a0: 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 63  pLevel);.      c
94b0: 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f  ont = pLevel->co
94c0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  nt = sqlite3Vdbe
94d0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
94e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
94f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 75 73 74 42  ddOp(v, OP_MustB
9500: 65 49 6e 74 2c 20 31 2c 20 62 72 6b 29 3b 0a 20  eInt, 1, brk);. 
9510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9520: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 45  AddOp(v, OP_NotE
9530: 78 69 73 74 73 2c 20 69 43 75 72 2c 20 62 72 6b  xists, iCur, brk
9540: 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 6d  );.      VdbeCom
9550: 6d 65 6e 74 28 28 76 2c 20 22 70 6b 22 29 29 3b  ment((v, "pk"));
9560: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f  .      pLevel->o
9570: 70 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20  p = OP_Noop;.   
9580: 20 7d 65 6c 73 65 20 69 66 28 20 70 49 64 78 21   }else if( pIdx!
9590: 3d 30 20 26 26 20 70 4c 65 76 65 6c 2d 3e 73 63  =0 && pLevel->sc
95a0: 6f 72 65 3e 33 20 26 26 20 28 70 4c 65 76 65 6c  ore>3 && (pLevel
95b0: 2d 3e 73 63 6f 72 65 26 30 78 30 63 29 3d 3d 30  ->score&0x0c)==0
95c0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73   ){.      /* Cas
95d0: 65 20 32 3a 20 20 54 68 65 72 65 20 69 73 20 61  e 2:  There is a
95e0: 6e 20 69 6e 64 65 78 20 61 6e 64 20 61 6c 6c 20  n index and all 
95f0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45  terms of the WHE
9600: 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20  RE clause that. 
9610: 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20       **         
9620: 20 72 65 66 65 72 20 74 6f 20 74 68 65 20 69 6e   refer to the in
9630: 64 65 78 20 75 73 69 6e 67 20 74 68 65 20 22 3d  dex using the "=
9640: 3d 22 20 6f 72 20 22 49 4e 22 20 6f 70 65 72 61  =" or "IN" opera
9650: 74 6f 72 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tors..      */. 
9660: 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 3b 0a       int start;.
9670: 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 75 6d        int nColum
9680: 6e 20 3d 20 28 70 4c 65 76 65 6c 2d 3e 73 63 6f  n = (pLevel->sco
9690: 72 65 2b 31 36 29 2f 33 32 3b 0a 20 20 20 20 20  re+16)/32;.     
96a0: 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
96b0: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
96c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20  MakeLabel(v);.. 
96d0: 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
96e0: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 69   column of the i
96f0: 6e 64 65 78 2c 20 66 69 6e 64 20 74 68 65 20 74  ndex, find the t
9700: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
9710: 20 63 6c 61 75 73 65 20 74 68 61 74 0a 20 20 20   clause that.   
9720: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74     ** constraint
9730: 73 20 74 68 61 74 20 63 6f 6c 75 6d 6e 2e 20 20  s that column.  
9740: 49 66 20 74 68 65 20 57 48 45 52 45 20 63 6c 61  If the WHERE cla
9750: 75 73 65 20 74 65 72 6d 20 69 73 20 58 3d 65 78  use term is X=ex
9760: 70 72 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  pr, then.      *
9770: 2a 20 65 76 61 6c 75 61 74 69 6f 6e 20 65 78 70  * evaluation exp
9780: 72 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  r and leave the 
9790: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 73 74  result on the st
97a0: 61 63 6b 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72  ack */.      for
97b0: 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c 75 6d 6e 3b  (j=0; j<nColumn;
97c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
97d0: 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20  or(pTerm=aExpr, 
97e0: 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b  k=0; k<nExpr; k+
97f0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
9800: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20         Expr *pX 
9810: 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20  = pTerm->p;.    
9820: 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20        if( pX==0 
9830: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
9840: 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d        if( pTerm-
9850: 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20  >idxLeft==iCur. 
9860: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
9870: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
9880: 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d  ht & loopMask)==
9890: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
98a0: 68 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht .            
98b0: 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69   && pX->pLeft->i
98c0: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
98d0: 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20  Column[j].      
98e0: 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e 6f         && (pX->o
98f0: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 58 2d 3e  p==TK_EQ || pX->
9900: 6f 70 3d 3d 54 4b 5f 49 4e 29 0a 20 20 20 20 20  op==TK_IN).     
9910: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
9920: 20 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20      char idxaff 
9930: 3d 20 70 49 64 78 2d 3e 70 54 61 62 6c 65 2d 3e  = pIdx->pTable->
9940: 61 43 6f 6c 5b 70 58 2d 3e 70 4c 65 66 74 2d 3e  aCol[pX->pLeft->
9950: 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69 74  iColumn].affinit
9960: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
9970: 66 28 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  f( sqlite3IndexA
9980: 66 66 69 6e 69 74 79 4f 6b 28 70 58 2c 20 69 64  ffinityOk(pX, id
9990: 78 61 66 66 29 20 29 7b 0a 20 20 20 20 20 20 20  xaff) ){.       
99a0: 20 20 20 20 20 20 20 63 6f 64 65 45 71 75 61 6c         codeEqual
99b0: 69 74 79 54 65 72 6d 28 70 50 61 72 73 65 2c 20  ityTerm(pParse, 
99c0: 70 54 65 72 6d 2c 20 62 72 6b 2c 20 70 4c 65 76  pTerm, brk, pLev
99d0: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  el);.           
99e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
99f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9a00: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
9a10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76      }.      pLev
9a20: 65 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73  el->iMem = pPars
9a30: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20  e->nMem++;.     
9a40: 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e   cont = pLevel->
9a50: 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 64  cont = sqlite3Vd
9a60: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
9a70: 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64 65 78        buildIndex
9a80: 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 75 6d 6e  Probe(v, nColumn
9a90: 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20  , brk, pIdx);.  
9aa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ab0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74  ddOp(v, OP_MemSt
9ac0: 6f 72 65 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  ore, pLevel->iMe
9ad0: 6d 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  m, 0);..      /*
9ae0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28   Generate code (
9af0: 31 29 20 74 6f 20 6d 6f 76 65 20 74 6f 20 74 68  1) to move to th
9b00: 65 20 66 69 72 73 74 20 6d 61 74 63 68 69 6e 67  e first matching
9b10: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
9b20: 74 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20  table..      ** 
9b30: 54 68 65 6e 20 67 65 6e 65 72 61 74 65 20 63 6f  Then generate co
9b40: 64 65 20 28 32 29 20 74 68 61 74 20 6a 75 6d 70  de (2) that jump
9b50: 73 20 74 6f 20 22 62 72 6b 22 20 61 66 74 65 72  s to "brk" after
9b60: 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 70   the cursor is p
9b70: 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ast.      ** the
9b80: 20 6c 61 73 74 20 6d 61 74 63 68 69 6e 67 20 65   last matching e
9b90: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 74 61  lement of the ta
9ba0: 62 6c 65 2e 20 20 54 68 65 20 63 6f 64 65 20 28  ble.  The code (
9bb0: 31 29 20 69 73 20 65 78 65 63 75 74 65 64 0a 20  1) is executed. 
9bc0: 20 20 20 20 20 2a 2a 20 6f 6e 63 65 20 74 6f 20       ** once to 
9bd0: 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73  initialize the s
9be0: 65 61 72 63 68 2c 20 74 68 65 20 63 6f 64 65 20  earch, the code 
9bf0: 28 32 29 20 69 73 20 65 78 65 63 75 74 65 64 20  (2) is executed 
9c00: 62 65 66 6f 72 65 20 65 61 63 68 0a 20 20 20 20  before each.    
9c10: 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 6f    ** iteration o
9c20: 66 20 74 68 65 20 73 63 61 6e 20 74 6f 20 73 65  f the scan to se
9c30: 65 20 69 66 20 74 68 65 20 73 63 61 6e 20 68 61  e if the scan ha
9c40: 73 20 66 69 6e 69 73 68 65 64 2e 20 2a 2f 0a 20  s finished. */. 
9c50: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
9c60: 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
9c70: 20 2f 2a 20 53 63 61 6e 20 69 6e 20 72 65 76 65   /* Scan in reve
9c80: 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  rse order */.   
9c90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9ca0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
9cb0: 4c 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Le, iIdxCur, brk
9cc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
9cd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9ce0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
9cf0: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
9d00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
9d10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9d20: 20 4f 50 5f 49 64 78 4c 54 2c 20 69 49 64 78 43   OP_IdxLT, iIdxC
9d30: 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20  ur, brk);.      
9d40: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
9d50: 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  P_Prev;.      }e
9d60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
9d70: 53 63 61 6e 20 69 6e 20 74 68 65 20 66 6f 72 77  Scan in the forw
9d80: 61 72 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  ard order */.   
9d90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9da0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65  AddOp(v, OP_Move
9db0: 47 65 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b  Ge, iIdxCur, brk
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
9dd0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
9de0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
9df0: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
9e00: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
9e10: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
9e20: 50 5f 49 64 78 47 45 2c 20 69 49 64 78 43 75 72  P_IdxGE, iIdxCur
9e30: 2c 20 62 72 6b 2c 20 22 2b 22 2c 20 50 33 5f 53  , brk, "+", P3_S
9e40: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
9e50: 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f  pLevel->op = OP_
9e60: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
9e70: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9e80: 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 4b 65  ddOp(v, OP_RowKe
9e90: 79 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a  y, iIdxCur, 0);.
9ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9eb0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78  eAddOp(v, OP_Idx
9ec0: 49 73 4e 75 6c 6c 2c 20 6e 43 6f 6c 75 6d 6e 2c  IsNull, nColumn,
9ed0: 20 63 6f 6e 74 29 3b 0a 20 20 20 20 20 20 69 66   cont);.      if
9ee0: 28 20 21 6f 6d 69 74 54 61 62 6c 65 20 29 7b 0a  ( !omitTable ){.
9ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9f00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
9f10: 64 78 52 65 63 6e 6f 2c 20 69 49 64 78 43 75 72  dxRecno, iIdxCur
9f20: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
9f30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9f40: 2c 20 4f 50 5f 4d 6f 76 65 47 65 2c 20 69 43 75  , OP_MoveGe, iCu
9f50: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
9f60: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20       pLevel->p1 
9f70: 3d 20 69 49 64 78 43 75 72 3b 0a 20 20 20 20 20  = iIdxCur;.     
9f80: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
9f90: 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  art;.    }else i
9fa0: 66 28 20 69 3c 41 52 52 41 59 53 49 5a 45 28 69  f( i<ARRAYSIZE(i
9fb0: 44 69 72 65 63 74 4c 74 29 20 26 26 20 28 69 44  DirectLt) && (iD
9fc0: 69 72 65 63 74 4c 74 5b 69 5d 3e 3d 30 20 7c 7c  irectLt[i]>=0 ||
9fd0: 20 69 44 69 72 65 63 74 47 74 5b 69 5d 3e 3d 30   iDirectGt[i]>=0
9fe0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61  ) ){.      /* Ca
9ff0: 73 65 20 33 3a 20 20 57 65 20 68 61 76 65 20 61  se 3:  We have a
a000: 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 63 6f 6d  n inequality com
a010: 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74 20  parison against 
a020: 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64 2e  the ROWID field.
a030: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a040: 69 6e 74 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f  int testOp = OP_
a050: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Noop;.      int 
a060: 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74  start;.      int
a070: 20 62 52 65 76 20 3d 20 70 4c 65 76 65 6c 2d 3e   bRev = pLevel->
a080: 62 52 65 76 3b 0a 0a 20 20 20 20 20 20 61 73 73  bRev;..      ass
a090: 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65 3d 3d  ert( omitTable==
a0a0: 30 20 29 3b 0a 20 20 20 20 20 20 62 72 6b 20 3d  0 );.      brk =
a0b0: 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d 20 73   pLevel->brk = s
a0c0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a0d0: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 63 6f  bel(v);.      co
a0e0: 6e 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e  nt = pLevel->con
a0f0: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  t = sqlite3VdbeM
a100: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
a110: 20 20 20 69 66 28 20 62 52 65 76 20 29 7b 0a 20     if( bRev ){. 
a120: 20 20 20 20 20 20 20 69 6e 74 20 74 20 3d 20 69         int t = i
a130: 44 69 72 65 63 74 47 74 5b 69 5d 3b 0a 20 20 20  DirectGt[i];.   
a140: 20 20 20 20 20 69 44 69 72 65 63 74 47 74 5b 69       iDirectGt[i
a150: 5d 20 3d 20 69 44 69 72 65 63 74 4c 74 5b 69 5d  ] = iDirectLt[i]
a160: 3b 0a 20 20 20 20 20 20 20 20 69 44 69 72 65 63  ;.        iDirec
a170: 74 4c 74 5b 69 5d 20 3d 20 74 3b 0a 20 20 20 20  tLt[i] = t;.    
a180: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 44    }.      if( iD
a190: 69 72 65 63 74 47 74 5b 69 5d 3e 3d 30 20 29 7b  irectGt[i]>=0 ){
a1a0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
a1b0: 58 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 69  X;.        k = i
a1c0: 44 69 72 65 63 74 47 74 5b 69 5d 3b 0a 20 20 20  DirectGt[i];.   
a1d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e       assert( k<n
a1e0: 45 78 70 72 20 29 3b 0a 20 20 20 20 20 20 20 20  Expr );.        
a1f0: 70 54 65 72 6d 20 3d 20 26 61 45 78 70 72 5b 6b  pTerm = &aExpr[k
a200: 5d 3b 0a 20 20 20 20 20 20 20 20 70 58 20 3d 20  ];.        pX = 
a210: 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20  pTerm->p;.      
a220: 20 20 61 73 73 65 72 74 28 20 70 58 21 3d 30 20    assert( pX!=0 
a230: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a240: 74 28 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66  t( pTerm->idxLef
a250: 74 3d 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20  t==iCur );.     
a260: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a270: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
a280: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
a290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2a0: 28 76 2c 20 4f 50 5f 46 6f 72 63 65 49 6e 74 2c  (v, OP_ForceInt,
a2b0: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c   pX->op==TK_LE |
a2c0: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 2c  | pX->op==TK_GT,
a2d0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 73   brk);.        s
a2e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a2f0: 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f 4d 6f 76  v, bRev ? OP_Mov
a300: 65 4c 74 20 3a 20 4f 50 5f 4d 6f 76 65 47 65 2c  eLt : OP_MoveGe,
a310: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
a320: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
a330: 28 28 76 2c 20 22 70 6b 22 29 29 3b 0a 20 20 20  ((v, "pk"));.   
a340: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
a350: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
a360: 3e 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  >p);.      }else
a370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a380: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 62 52  3VdbeAddOp(v, bR
a390: 65 76 20 3f 20 4f 50 5f 4c 61 73 74 20 3a 20 4f  ev ? OP_Last : O
a3a0: 50 5f 52 65 77 69 6e 64 2c 20 69 43 75 72 2c 20  P_Rewind, iCur, 
a3b0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
a3c0: 20 20 20 20 69 66 28 20 69 44 69 72 65 63 74 4c      if( iDirectL
a3d0: 74 5b 69 5d 3e 3d 30 20 29 7b 0a 20 20 20 20 20  t[i]>=0 ){.     
a3e0: 20 20 20 45 78 70 72 20 2a 70 58 3b 0a 20 20 20     Expr *pX;.   
a3f0: 20 20 20 20 20 6b 20 3d 20 69 44 69 72 65 63 74       k = iDirect
a400: 4c 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 61  Lt[i];.        a
a410: 73 73 65 72 74 28 20 6b 3c 6e 45 78 70 72 20 29  ssert( k<nExpr )
a420: 3b 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20  ;.        pTerm 
a430: 3d 20 26 61 45 78 70 72 5b 6b 5d 3b 0a 20 20 20  = &aExpr[k];.   
a440: 20 20 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d       pX = pTerm-
a450: 3e 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  >p;.        asse
a460: 72 74 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20  rt( pX!=0 );.   
a470: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 65       assert( pTe
a480: 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75  rm->idxLeft==iCu
a490: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  r );.        sql
a4a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a4b0: 72 73 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29  rse, pX->pRight)
a4c0: 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c  ;.        pLevel
a4d0: 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d  ->iMem = pParse-
a4e0: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 20  >nMem++;.       
a4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a500: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
a510: 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20  , pLevel->iMem, 
a520: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
a530: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c  pX->op==TK_LT ||
a540: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29   pX->op==TK_GT )
a550: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74  {.          test
a560: 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 4c  Op = bRev ? OP_L
a570: 65 20 3a 20 4f 50 5f 47 65 3b 0a 20 20 20 20 20  e : OP_Ge;.     
a580: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a590: 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62 52 65      testOp = bRe
a5a0: 76 20 3f 20 4f 50 5f 4c 74 20 3a 20 4f 50 5f 47  v ? OP_Lt : OP_G
a5b0: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
a5c0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
a5d0: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
a5e0: 3e 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >p);.      }.   
a5f0: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
a600: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a610: 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  r(v);.      pLev
a620: 65 6c 2d 3e 6f 70 20 3d 20 62 52 65 76 20 3f 20  el->op = bRev ? 
a630: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
a640: 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
a650: 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20  >p1 = iCur;.    
a660: 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73    pLevel->p2 = s
a670: 74 61 72 74 3b 0a 20 20 20 20 20 20 69 66 28 20  tart;.      if( 
a680: 74 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  testOp!=OP_Noop 
a690: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a6a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a6b0: 50 5f 52 65 63 6e 6f 2c 20 69 43 75 72 2c 20 30  P_Recno, iCur, 0
a6c0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
a6d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a6e0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65  P_MemLoad, pLeve
a6f0: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20  l->iMem, 0);.   
a700: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a710: 41 64 64 4f 70 28 76 2c 20 74 65 73 74 4f 70 2c  AddOp(v, testOp,
a720: 20 30 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20   0, brk);.      
a730: 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
a740: 70 49 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pIdx==0 ){.     
a750: 20 2f 2a 20 43 61 73 65 20 34 3a 20 20 54 68 65   /* Case 4:  The
a760: 72 65 20 69 73 20 6e 6f 20 75 73 61 62 6c 65 20  re is no usable 
a770: 69 6e 64 65 78 2e 20 20 57 65 20 6d 75 73 74 20  index.  We must 
a780: 64 6f 20 61 20 63 6f 6d 70 6c 65 74 65 0a 20 20  do a complete.  
a790: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20      **          
a7a0: 73 63 61 6e 20 6f 66 20 74 68 65 20 65 6e 74 69  scan of the enti
a7b0: 72 65 20 64 61 74 61 62 61 73 65 20 74 61 62 6c  re database tabl
a7c0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
a7d0: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
a7e0: 20 20 20 69 6e 74 20 6f 70 52 65 77 69 6e 64 3b     int opRewind;
a7f0: 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
a800: 6f 6d 69 74 54 61 62 6c 65 3d 3d 30 20 29 3b 0a  omitTable==0 );.
a810: 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76        brk = pLev
a820: 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65  el->brk = sqlite
a830: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a840: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 74 20 3d 20  );.      cont = 
a850: 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73  pLevel->cont = s
a860: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
a870: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66  bel(v);.      if
a880: 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29  ( pLevel->bRev )
a890: 7b 0a 20 20 20 20 20 20 20 20 6f 70 52 65 77 69  {.        opRewi
a8a0: 6e 64 20 3d 20 4f 50 5f 4c 61 73 74 3b 0a 20 20  nd = OP_Last;.  
a8b0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
a8c0: 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20 20 20   = OP_Prev;.    
a8d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a8e0: 20 6f 70 52 65 77 69 6e 64 20 3d 20 4f 50 5f 52   opRewind = OP_R
a8f0: 65 77 69 6e 64 3b 0a 20 20 20 20 20 20 20 20 70  ewind;.        p
a900: 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e  Level->op = OP_N
a910: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
a920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a930: 64 4f 70 28 76 2c 20 6f 70 52 65 77 69 6e 64 2c  dOp(v, opRewind,
a940: 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20 20   iCur, brk);.   
a950: 20 20 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74     start = sqlit
a960: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
a970: 72 28 76 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  r(v);.      pLev
a980: 65 6c 2d 3e 70 31 20 3d 20 69 43 75 72 3b 0a 20  el->p1 = iCur;. 
a990: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
a9a0: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 65 6c  = start;.    }el
a9b0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 43 61 73  se{.      /* Cas
a9c0: 65 20 35 3a 20 54 68 65 20 57 48 45 52 45 20 63  e 5: The WHERE c
a9d0: 6c 61 75 73 65 20 74 65 72 6d 20 74 68 61 74 20  lause term that 
a9e0: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 72 69  refers to the ri
a9f0: 67 68 74 2d 6d 6f 73 74 0a 20 20 20 20 20 20 2a  ght-most.      *
aa00: 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e  *         column
aa10: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 69 73   of the index is
aa20: 20 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 2e 20   an inequality. 
aa30: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
aa40: 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20  .      **       
aa50: 20 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 6f    the index is o
aa60: 6e 20 28 78 2c 79 2c 7a 29 20 61 6e 64 20 74 68  n (x,y,z) and th
aa70: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
aa80: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
aa90: 2a 20 20 20 20 20 20 20 20 20 66 6f 72 6d 20 22  *         form "
aaa0: 78 3d 35 20 41 4e 44 20 79 3c 31 30 22 20 74 68  x=5 AND y<10" th
aab0: 65 6e 20 74 68 69 73 20 63 61 73 65 20 69 73 20  en this case is 
aac0: 75 73 65 64 2e 20 20 4f 6e 6c 79 20 74 68 65 0a  used.  Only the.
aad0: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
aae0: 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 6f 6c 75   right-most colu
aaf0: 6d 6e 20 63 61 6e 20 62 65 20 61 6e 20 69 6e 65  mn can be an ine
ab00: 71 75 61 6c 69 74 79 20 2d 20 74 68 65 20 72 65  quality - the re
ab10: 73 74 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  st must.      **
ab20: 20 20 20 20 20 20 20 20 20 75 73 65 20 74 68 65           use the
ab30: 20 22 3d 3d 22 20 6f 70 65 72 61 74 6f 72 2e 0a   "==" operator..
ab40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
ab50: 2a 20 20 20 20 20 20 20 20 20 54 68 69 73 20 63  *         This c
ab60: 61 73 65 20 69 73 20 61 6c 73 6f 20 75 73 65 64  ase is also used
ab70: 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
ab80: 6e 6f 20 57 48 45 52 45 20 63 6c 61 75 73 65 0a  no WHERE clause.
ab90: 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20        **        
aba0: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 62 75 74   constraints but
abb0: 20 61 6e 20 69 6e 64 65 78 20 69 73 20 73 65 6c   an index is sel
abc0: 65 63 74 65 64 20 61 6e 79 77 61 79 2c 20 69 6e  ected anyway, in
abd0: 20 6f 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20   order.      ** 
abe0: 20 20 20 20 20 20 20 20 74 6f 20 66 6f 72 63 65          to force
abf0: 20 74 68 65 20 6f 75 74 70 75 74 20 6f 72 64 65   the output orde
ac00: 72 20 74 6f 20 63 6f 6e 66 6f 72 6d 20 74 6f 20  r to conform to 
ac10: 61 6e 20 4f 52 44 45 52 20 42 59 2e 0a 20 20 20  an ORDER BY..   
ac20: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
ac30: 73 63 6f 72 65 20 3d 20 70 4c 65 76 65 6c 2d 3e  score = pLevel->
ac40: 73 63 6f 72 65 3b 0a 20 20 20 20 20 20 69 6e 74  score;.      int
ac50: 20 6e 45 71 43 6f 6c 75 6d 6e 20 3d 20 73 63 6f   nEqColumn = sco
ac60: 72 65 2f 33 32 3b 0a 20 20 20 20 20 20 69 6e 74  re/32;.      int
ac70: 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69 6e   start;.      in
ac80: 74 20 6c 65 46 6c 61 67 3d 30 2c 20 67 65 46 6c  t leFlag=0, geFl
ac90: 61 67 3d 30 3b 0a 20 20 20 20 20 20 69 6e 74 20  ag=0;.      int 
aca0: 74 65 73 74 4f 70 3b 0a 0a 20 20 20 20 20 20 2f  testOp;..      /
acb0: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
acc0: 71 75 61 6c 69 74 79 20 63 6f 6e 73 74 72 61 69  quality constrai
acd0: 6e 74 73 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nts.      */.   
ace0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45     for(j=0; j<nE
acf0: 71 43 6f 6c 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20  qColumn; j++){. 
ad00: 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 78 43         int iIdxC
ad10: 6f 6c 20 3d 20 70 49 64 78 2d 3e 61 69 43 6f 6c  ol = pIdx->aiCol
ad20: 75 6d 6e 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  umn[j];.        
ad30: 66 6f 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c  for(pTerm=aExpr,
ad40: 20 6b 3d 30 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b   k=0; k<nExpr; k
ad50: 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20  ++, pTerm++){.  
ad60: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 58          Expr *pX
ad70: 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20   = pTerm->p;.   
ad80: 20 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30         if( pX==0
ad90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ada0: 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72 6d         if( pTerm
adb0: 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a  ->idxLeft==iCur.
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
add0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20  pX->op==TK_EQ.  
ade0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
adf0: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ae00: 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70  t & loopMask)==p
ae10: 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68  Term->prereqRigh
ae20: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
ae30: 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43  && pX->pLeft->iC
ae40: 6f 6c 75 6d 6e 3d 3d 69 49 64 78 43 6f 6c 0a 20  olumn==iIdxCol. 
ae50: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
ae60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ae70: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ae80: 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pX->pRight);.   
ae90: 20 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65           disable
aea0: 54 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54  Term(pLevel, &pT
aeb0: 65 72 6d 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20  erm->p);.       
aec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
aed0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
aee0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
aef0: 20 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68   /* Duplicate th
af00: 65 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20  e equality term 
af10: 76 61 6c 75 65 73 20 62 65 63 61 75 73 65 20 74  values because t
af20: 68 65 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a  hey will all be.
af30: 20 20 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77        ** used tw
af40: 69 63 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b  ice: once to mak
af50: 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
af60: 6e 20 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74  n key and once t
af70: 6f 20 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20  o make the.     
af80: 20 2a 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20   ** start key.. 
af90: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f       */.      fo
afa0: 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 43 6f 6c 75  r(j=0; j<nEqColu
afb0: 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  mn; j++){.      
afc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
afd0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45  Op(v, OP_Dup, nE
afe0: 71 43 6f 6c 75 6d 6e 2d 31 2c 20 30 29 3b 0a 20  qColumn-1, 0);. 
aff0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
b000: 20 4c 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20   Labels for the 
b010: 62 65 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e  beginning and en
b020: 64 20 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20  d of the loop.  
b030: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e      */.      con
b040: 74 20 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74  t = pLevel->cont
b050: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
b060: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
b070: 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e    brk = pLevel->
b080: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
b090: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a  eMakeLabel(v);..
b0a0: 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74        /* Generat
b0b0: 65 20 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f  e the terminatio
b0c0: 6e 20 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20  n key.  This is 
b0d0: 74 68 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68  the key value th
b0e0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c  at.      ** will
b0f0: 20 65 6e 64 20 74 68 65 20 73 65 61 72 63 68 2e   end the search.
b100: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65    There is no te
b110: 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69 66  rmination key if
b120: 20 74 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20   there.      ** 
b130: 61 72 65 20 6e 6f 20 65 71 75 61 6c 69 74 79 20  are no equality 
b140: 74 65 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58 3c  terms and no "X<
b150: 2e 2e 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20 20  ..." term..     
b160: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30   **.      ** 200
b170: 32 2d 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20 72  2-Dec-04: On a r
b180: 65 76 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61  everse-order sca
b190: 6e 2c 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64  n, the so-called
b1a0: 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a 20   "termination". 
b1b0: 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d 70       ** key comp
b1c0: 75 74 65 64 20 68 65 72 65 20 72 65 61 6c 6c 79  uted here really
b1d0: 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
b1e0: 68 65 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20  he start key..  
b1f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
b200: 20 28 73 63 6f 72 65 20 26 20 34 29 21 3d 30 20   (score & 4)!=0 
b210: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  ){.        for(p
b220: 54 65 72 6d 3d 61 45 78 70 72 2c 20 6b 3d 30 3b  Term=aExpr, k=0;
b230: 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b 2b 2c 20 70   k<nExpr; k++, p
b240: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
b250: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
b260: 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  erm->p;.        
b270: 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
b280: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
b290: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64 78    if( pTerm->idx
b2a0: 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20 20 20 20  Left==iCur.     
b2b0: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e          && (pX->
b2c0: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
b2d0: 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 0a 20 20 20 20  >op==TK_LE).    
b2e0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
b2f0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b300: 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65  & loopMask)==pTe
b310: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
b330: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
b340: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
b350: 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20 20 20 20  umn[j].         
b360: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
b370: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b380: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
b390: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
b3a0: 20 6c 65 46 6c 61 67 20 3d 20 70 58 2d 3e 6f 70   leFlag = pX->op
b3b0: 3d 3d 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 20  ==TK_LE;.       
b3c0: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
b3d0: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
b3e0: 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  >p);.           
b3f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b400: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
b410: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
b420: 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d  P_IdxGE;.      }
b430: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
b440: 73 74 4f 70 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e  stOp = nEqColumn
b450: 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20  >0 ? OP_IdxGE : 
b460: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
b470: 20 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20   leFlag = 1;.   
b480: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
b490: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
b4a0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
b4b0: 6f 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20 2b  ol = nEqColumn +
b4c0: 20 28 28 73 63 6f 72 65 20 26 20 34 29 21 3d 30   ((score & 4)!=0
b4d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
b4e0: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
b4f0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
b500: 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
b510: 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c 20  e(v, nCol, brk, 
b520: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
b530: 66 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20  f( pLevel->bRev 
b540: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
b550: 20 6f 70 20 3d 20 6c 65 46 6c 61 67 20 3f 20 4f   op = leFlag ? O
b560: 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f  P_MoveLe : OP_Mo
b570: 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veLt;.          
b580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b590: 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
b5a0: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d   brk);.        }
b5b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b5c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b5d0: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
b5e0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
b5f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b600: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
b610: 76 65 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  vel->bRev ){.   
b620: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b630: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
b640: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
b650: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
b660: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
b670: 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73  start key.  This
b680: 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74   is the key that
b690: 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77   defines the low
b6a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e  er.      ** boun
b6b0: 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e  d on the search.
b6c0: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74    There is no st
b6d0: 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65  art key if there
b6e0: 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a   are no.      **
b6f0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
b700: 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
b710: 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e  no "X>..." term.
b720: 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68    In.      ** th
b730: 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  at case, generat
b740: 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73  e a "Rewind" ins
b750: 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63  truction in plac
b760: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
b770: 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72  * start key sear
b780: 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ch..      **.   
b790: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
b7a0: 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  4: In the case o
b7b0: 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  f a reverse-orde
b7c0: 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f  r search, the so
b7d0: 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a  -called.      **
b7e0: 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61   "start" key rea
b7f0: 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e  lly ends up bein
b800: 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65  g used as the te
b810: 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20  rmination key.. 
b820: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
b830: 28 20 28 73 63 6f 72 65 20 26 20 38 29 21 3d 30  ( (score & 8)!=0
b840: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b850: 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6b 3d 30  pTerm=aExpr, k=0
b860: 3b 20 6b 3c 6e 45 78 70 72 3b 20 6b 2b 2b 2c 20  ; k<nExpr; k++, 
b870: 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
b880: 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70      Expr *pX = p
b890: 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 20  Term->p;.       
b8a0: 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63     if( pX==0 ) c
b8b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
b8c0: 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64     if( pTerm->id
b8d0: 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20 20 20  xLeft==iCur.    
b8e0: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 58 2d           && (pX-
b8f0: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 58  >op==TK_GT || pX
b900: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 0a 20 20 20  ->op==TK_GE).   
b910: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54            && (pT
b920: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
b930: 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54   & loopMask)==pT
b940: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
b950: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26   .             &
b960: 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f  & pX->pLeft->iCo
b970: 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f  lumn==pIdx->aiCo
b980: 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20 20 20  lumn[j].        
b990: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
b9a0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b9b0: 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69  (pParse, pX->pRi
b9c0: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
b9d0: 20 20 67 65 46 6c 61 67 20 3d 20 70 58 2d 3e 6f    geFlag = pX->o
b9e0: 70 3d 3d 54 4b 5f 47 45 3b 0a 20 20 20 20 20 20  p==TK_GE;.      
b9f0: 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72        disableTer
ba00: 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d  m(pLevel, &pTerm
ba10: 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ->p);.          
ba20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
ba30: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
ba40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ba50: 20 20 20 20 67 65 46 6c 61 67 20 3d 20 31 3b 0a      geFlag = 1;.
ba60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ba70: 28 20 6e 45 71 43 6f 6c 75 6d 6e 3e 30 20 7c 7c  ( nEqColumn>0 ||
ba80: 20 28 73 63 6f 72 65 26 38 29 21 3d 30 20 29 7b   (score&8)!=0 ){
ba90: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  .        int nCo
baa0: 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20 2b 20  l = nEqColumn + 
bab0: 28 28 73 63 6f 72 65 26 38 29 21 3d 30 29 3b 0a  ((score&8)!=0);.
bac0: 20 20 20 20 20 20 20 20 62 75 69 6c 64 49 6e 64          buildInd
bad0: 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f 6c 2c  exProbe(v, nCol,
bae0: 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20 20 20   brk, pIdx);.   
baf0: 20 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d       if( pLevel-
bb00: 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
bb10: 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20     pLevel->iMem 
bb20: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
bb30: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
bb40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bb50: 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65  OP_MemStore, pLe
bb60: 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20  vel->iMem, 1);. 
bb70: 20 20 20 20 20 20 20 20 20 74 65 73 74 4f 70 20           testOp 
bb80: 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20 20 20  = OP_IdxLT;.    
bb90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bba0: 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 67 65       int op = ge
bbb0: 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65 47 65  Flag ? OP_MoveGe
bbc0: 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a 20 20   : OP_MoveGt;.  
bbd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bbe0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
bbf0: 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a 20  iIdxCur, brk);. 
bc00: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bc10: 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65 6c 2d  else if( pLevel-
bc20: 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
bc30: 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e 6f 6f   testOp = OP_Noo
bc40: 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
bc50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
bc60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
bc70: 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72 2c 20  ewind, iIdxCur, 
bc80: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  brk);.      }.. 
bc90: 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65       /* Generate
bca0: 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f 66 20   the the top of 
bcb0: 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20 74 68  the loop.  If th
bcc0: 65 72 65 20 69 73 20 61 20 74 65 72 6d 69 6e 61  ere is a termina
bcd0: 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 6b 65  tion.      ** ke
bce0: 79 20 77 65 20 68 61 76 65 20 74 6f 20 74 65 73  y we have to tes
bcf0: 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79 20 61  t for that key a
bd00: 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68 65 20  nd abort at the 
bd10: 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20 20 20  top of the.     
bd20: 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20   ** loop..      
bd30: 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74 20 3d  */.      start =
bd40: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
bd50: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
bd60: 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d 4f 50    if( testOp!=OP
bd70: 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20 20 20  _Noop ){.       
bd80: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bd90: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
bda0: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 30   pLevel->iMem, 0
bdb0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
bdc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 74  e3VdbeAddOp(v, t
bdd0: 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72 2c 20  estOp, iIdxCur, 
bde0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  brk);.        if
bdf0: 28 20 28 6c 65 46 6c 61 67 20 26 26 20 21 70 4c  ( (leFlag && !pL
be00: 65 76 65 6c 2d 3e 62 52 65 76 29 20 7c 7c 20 28  evel->bRev) || (
be10: 21 67 65 46 6c 61 67 20 26 26 20 70 4c 65 76 65  !geFlag && pLeve
be20: 6c 2d 3e 62 52 65 76 29 20 29 7b 0a 20 20 20 20  l->bRev) ){.    
be30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
be40: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c  eChangeP3(v, -1,
be50: 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49 43 29   "+", P3_STATIC)
be60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
be70: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
be80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
be90: 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72  _RowKey, iIdxCur
bea0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
beb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bec0: 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 45  OP_IdxIsNull, nE
bed0: 71 43 6f 6c 75 6d 6e 20 2b 20 28 28 73 63 6f 72  qColumn + ((scor
bee0: 65 26 34 29 21 3d 30 29 2c 20 63 6f 6e 74 29 3b  e&4)!=0), cont);
bef0: 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d 69 74  .      if( !omit
bf00: 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  Table ){.       
bf10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bf20: 70 28 76 2c 20 4f 50 5f 49 64 78 52 65 63 6e 6f  p(v, OP_IdxRecno
bf30: 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20  , iIdxCur, 0);. 
bf40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
bf50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f  beAddOp(v, OP_Mo
bf60: 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a  veGe, iCur, 0);.
bf70: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
bf80: 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69 6e 73  * Record the ins
bf90: 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20 74 6f  truction used to
bfa0: 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65 20 6c   terminate the l
bfb0: 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  oop..      */.  
bfc0: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d      pLevel->op =
bfd0: 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20 3f 20   pLevel->bRev ? 
bfe0: 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e 65 78  OP_Prev : OP_Nex
bff0: 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  t;.      pLevel-
c000: 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b 0a 20  >p1 = iIdxCur;. 
c010: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70 32 20       pLevel->p2 
c020: 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d 0a 20  = start;.    }. 
c030: 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c 3d 20 67     loopMask |= g
c040: 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c  etMask(&maskSet,
c050: 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f 2a 20   iCur);..    /* 
c060: 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f 20 74  Insert code to t
c070: 65 73 74 20 65 76 65 72 79 20 73 75 62 65 78 70  est every subexp
c080: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 61 6e  ression that can
c090: 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 20   be completely. 
c0a0: 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 75     ** computed u
c0b0: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
c0c0: 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73 2e 0a   set of tables..
c0d0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
c0e0: 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a 3d 30 3b  Term=aExpr, j=0;
c0f0: 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b 2c 20 70   j<nExpr; j++, p
c100: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Term++){.      i
c110: 66 28 20 70 54 65 72 6d 2d 3e 70 3d 3d 30 20 29  f( pTerm->p==0 )
c120: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c130: 20 69 66 28 20 28 70 54 65 72 6d 2d 3e 70 72 65   if( (pTerm->pre
c140: 72 65 71 41 6c 6c 20 26 20 6c 6f 6f 70 4d 61 73  reqAll & loopMas
c150: 6b 29 21 3d 70 54 65 72 6d 2d 3e 70 72 65 72 65  k)!=pTerm->prere
c160: 71 41 6c 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  qAll ) continue;
c170: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65  .      if( pLeve
c180: 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 20 26 26 20  l->iLeftJoin && 
c190: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
c1a0: 28 70 54 65 72 6d 2d 3e 70 2c 45 50 5f 46 72 6f  (pTerm->p,EP_Fro
c1b0: 6d 4a 6f 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  mJoin) ){.      
c1c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
c1d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
c1e0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
c1f0: 72 73 65 2c 20 70 54 65 72 6d 2d 3e 70 2c 20 63  rse, pTerm->p, c
c200: 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ont, 1);.      p
c210: 54 65 72 6d 2d 3e 70 20 3d 20 30 3b 0a 20 20 20  Term->p = 0;.   
c220: 20 7d 0a 20 20 20 20 62 72 6b 20 3d 20 63 6f 6e   }.    brk = con
c230: 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61  t;..    /* For a
c240: 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e   LEFT OUTER JOIN
c250: 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65 20  , generate code 
c260: 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72 64  that will record
c270: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a 20   the fact that. 
c280: 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f     ** at least o
c290: 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72 69  ne row of the ri
c2a0: 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d 61  ght table has ma
c2b0: 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20 74  tched the left t
c2c0: 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a 20  able.  .    */. 
c2d0: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
c2e0: 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20  LeftJoin ){.    
c2f0: 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d 20    pLevel->top = 
c300: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
c310: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
c320: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c330: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
c340: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
c350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c360: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
c370: 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e  Level->iLeftJoin
c380: 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 1);.      Vdbe
c390: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 72  Comment((v, "# r
c3a0: 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e 20  ecord LEFT JOIN 
c3b0: 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66 6f  hit"));.      fo
c3c0: 72 28 70 54 65 72 6d 3d 61 45 78 70 72 2c 20 6a  r(pTerm=aExpr, j
c3d0: 3d 30 3b 20 6a 3c 6e 45 78 70 72 3b 20 6a 2b 2b  =0; j<nExpr; j++
c3e0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
c3f0: 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 70      if( pTerm->p
c400: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
c410: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54 65          if( (pTe
c420: 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c 20 26 20  rm->prereqAll & 
c430: 6c 6f 6f 70 4d 61 73 6b 29 21 3d 70 54 65 72 6d  loopMask)!=pTerm
c440: 2d 3e 70 72 65 72 65 71 41 6c 6c 20 29 20 63 6f  ->prereqAll ) co
c450: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
c460: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
c470: 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d  se(pParse, pTerm
c480: 2d 3e 70 2c 20 63 6f 6e 74 2c 20 31 29 3b 0a 20  ->p, cont, 1);. 
c490: 20 20 20 20 20 20 20 70 54 65 72 6d 2d 3e 70 20         pTerm->p 
c4a0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
c4b0: 20 7d 0a 20 20 7d 0a 20 20 70 57 49 6e 66 6f 2d   }.  }.  pWInfo-
c4c0: 3e 69 43 6f 6e 74 69 6e 75 65 20 3d 20 63 6f 6e  >iContinue = con
c4d0: 74 3b 0a 20 20 66 72 65 65 4d 61 73 6b 53 65 74  t;.  freeMaskSet
c4e0: 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20 20 72 65  (&maskSet);.  re
c4f0: 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 7d 0a 0a  turn pWInfo;.}..
c500: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
c510: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
c520: 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
c530: 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
c540: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
c550: 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
c560: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
c570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
c580: 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
c590: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62   *pWInfo){.  Vdb
c5a0: 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
c5b0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
c5c0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
c5d0: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
c5e0: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
c5f0: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
c600: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
c610: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
c620: 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Item;..  /* Gene
c630: 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
c640: 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
c650: 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
c660: 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
c670: 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
c680: 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
c690: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
c6a0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c6b0: 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
c6c0: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
c6d0: 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
c6e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c6f0: 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
c700: 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
c710: 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
c720: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
c730: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c740: 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29  (v, pLevel->brk)
c750: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
c760: 2d 3e 69 6e 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  ->inOp!=OP_Noop 
c770: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
c780: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65  VdbeAddOp(v, pLe
c790: 76 65 6c 2d 3e 69 6e 4f 70 2c 20 70 4c 65 76 65  vel->inOp, pLeve
c7a0: 6c 2d 3e 69 6e 50 31 2c 20 70 4c 65 76 65 6c 2d  l->inP1, pLevel-
c7b0: 3e 69 6e 50 32 29 3b 0a 20 20 20 20 7d 0a 20 20  >inP2);.    }.  
c7c0: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
c7d0: 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
c7e0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c7f0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c800: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
c810: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
c820: 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20  iLeftJoin, 0);. 
c830: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c840: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
c850: 75 6c 6c 2c 20 31 2c 20 61 64 64 72 2b 34 20 2b  ull, 1, addr+4 +
c860: 20 28 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75   (pLevel->iIdxCu
c870: 72 3e 3d 30 29 29 3b 0a 20 20 20 20 20 20 73 71  r>=0));.      sq
c880: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c890: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
c8a0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
c8b0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rsor, 0);.      
c8c0: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
c8d0: 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
c8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c8f0: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
c900: 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
c910: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
c920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c930: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c940: 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70  , 0, pLevel->top
c950: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c960: 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
c970: 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
c980: 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
c990: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
c9a0: 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
c9b0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
c9c0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c9d0: 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
c9e0: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
c9f0: 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
ca00: 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
ca10: 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
ca20: 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  eBegin..  */.  p
ca30: 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
ca40: 61 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  a;.  pTabItem = 
ca50: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  pTabList->a;.  f
ca60: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
ca70: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
ca80: 54 61 62 49 74 65 6d 2b 2b 2c 20 70 4c 65 76 65  TabItem++, pLeve
ca90: 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
caa0: 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
cab0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
cac0: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
cad0: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
cae0: 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62  ransient || pTab
caf0: 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
cb00: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
cb10: 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20 31  Level->score & 1
cb20: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
cb30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
cb40: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
cb50: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
cb60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
cb70: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30   pLevel->pIdx!=0
cb80: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
cb90: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cba0: 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
cbb0: 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
cbc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
cbd0: 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74  cursor substitut
cbe0: 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77  ions for cases w
cbf0: 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20  here we want to 
cc00: 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  use.    ** just 
cc10: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65  the index and ne
cc20: 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68  ver reference th
cc30: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
cc40: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
cc50: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
cc60: 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
cc70: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
cc80: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
cc90: 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
cca0: 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
ccb0: 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
ccc0: 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
ccd0: 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
cce0: 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
ccf0: 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
cd00: 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
cd10: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
cd20: 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
cd30: 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
cd40: 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
cd50: 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
cd60: 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
cd70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
cd80: 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20  pLevel->score & 
cd90: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
cda0: 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
cdb0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
cdc0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
cdd0: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a  = pLevel->pIdx;.
cde0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cdf0: 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
ce00: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
ce10: 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
ce20: 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
ce30: 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
ce40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
ce50: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 57 49  .      for(i=pWI
ce60: 6e 66 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73  nfo->iTop; i<las
ce70: 74 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; i++, pOp++){.
ce80: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
ce90: 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
cea0: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
ceb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
cec0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
ced0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
cee0: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
cef0: 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
cf00: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
cf10: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
cf20: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
cf30: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
cf40: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
cf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
cf60: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
cf80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
cf90: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
cfa0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
cfb0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
cfc0: 52 65 63 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  Recno ){.       
cfd0: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
cfe0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
cff0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
d000: 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 65 63 6e  ode = OP_IdxRecn
d010: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  o;.        }else
d020: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
d030: 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a  ==OP_NullRow ){.
d040: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
d050: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
d060: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d070: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
d080: 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
d090: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
d0a0: 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
d0b0: 74 75 72 6e 3b 0a 7d 0a                          turn;.}.