/ Hex Artifact Content
Login

Artifact 9b02e75ef86f057cee5e93150b10cbc1092d7de6:


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 34 35   where.c,v 1.145
0340: 20 32 30 30 35 2f 30 37 2f 31 36 20 31 33 3a 33   2005/07/16 13:3
0350: 33 3a 32 31 20 64 72 68 20 45 78 70 20 24 0a 2a  3:21 drh Exp $.*
0360: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0370: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0380: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69  The number of bi
0390: 74 73 20 69 6e 20 61 20 42 69 74 6d 61 73 6b 2e  ts in a Bitmask.
03a0: 20 20 22 42 4d 53 22 20 6d 65 61 6e 73 20 22 42    "BMS" means "B
03b0: 69 74 4d 61 73 6b 20 53 69 7a 65 22 2e 0a 2a 2f  itMask Size"..*/
03c0: 0a 23 64 65 66 69 6e 65 20 42 4d 53 20 20 28 73  .#define BMS  (s
03d0: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
03e0: 2d 31 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  -1)../*.** Deter
03f0: 6d 69 6e 65 20 74 68 65 20 6e 75 6d 62 65 72 20  mine the number 
0400: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61  of elements in a
0410: 6e 20 61 72 72 61 79 2e 0a 2a 2f 0a 23 64 65 66  n array..*/.#def
0420: 69 6e 65 20 41 52 52 41 59 53 49 5a 45 28 58 29  ine ARRAYSIZE(X)
0430: 20 20 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a    (sizeof(X)/siz
0440: 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 0a 2f 2a 0a  eof(X[0])).../*.
0450: 2a 2a 20 54 68 65 20 71 75 65 72 79 20 67 65 6e  ** The query gen
0460: 65 72 61 74 6f 72 20 75 73 65 73 20 61 6e 20 61  erator uses an a
0470: 72 72 61 79 20 6f 66 20 69 6e 73 74 61 6e 63 65  rray of instance
0480: 73 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  s of this struct
0490: 75 72 65 20 74 6f 0a 2a 2a 20 68 65 6c 70 20 69  ure to.** help i
04a0: 74 20 61 6e 61 6c 79 7a 65 20 74 68 65 20 73 75  t analyze the su
04b0: 62 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20  bexpressions of 
04c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
04d0: 2e 20 20 45 61 63 68 20 57 48 45 52 45 0a 2a 2a  .  Each WHERE.**
04e0: 20 63 6c 61 75 73 65 20 73 75 62 65 78 70 72 65   clause subexpre
04f0: 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74  ssion is separat
0500: 65 64 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ed from the othe
0510: 72 73 20 62 79 20 61 6e 20 41 4e 44 20 6f 70 65  rs by an AND ope
0520: 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rator..**.** The
0530: 20 69 64 78 4c 65 66 74 20 61 6e 64 20 69 64 78   idxLeft and idx
0540: 52 69 67 68 74 20 66 69 65 6c 64 73 20 61 72 65  Right fields are
0550: 20 74 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   the VDBE cursor
0560: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 74 68 65   numbers for the
0570: 0a 2a 2a 20 74 61 62 6c 65 20 74 68 61 74 20 63  .** table that c
0580: 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6c 75  ontains the colu
0590: 6d 6e 20 74 68 61 74 20 61 70 70 65 61 72 73 20  mn that appears 
05a0: 6f 6e 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  on the left-hand
05b0: 20 61 6e 64 0a 2a 2a 20 72 69 67 68 74 2d 68 61   and.** right-ha
05c0: 6e 64 20 73 69 64 65 20 6f 66 20 57 68 65 72 65  nd side of Where
05d0: 54 65 72 6d 2e 70 2e 20 20 49 66 20 65 69 74 68  Term.p.  If eith
05e0: 65 72 20 73 69 64 65 20 6f 66 20 57 68 65 72 65  er side of Where
05f0: 54 65 72 6d 2e 70 20 69 73 0a 2a 2a 20 73 6f 6d  Term.p is.** som
0600: 65 74 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61  ething other tha
0610: 6e 20 61 20 73 69 6d 70 6c 65 20 63 6f 6c 75 6d  n a simple colum
0620: 6e 20 72 65 66 65 72 65 6e 63 65 2c 20 74 68 65  n reference, the
0630: 6e 20 69 64 78 4c 65 66 74 20 6f 72 0a 2a 2a 20  n idxLeft or.** 
0640: 69 64 78 52 69 67 68 74 20 61 72 65 20 2d 31 2e  idxRight are -1.
0650: 20 20 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 74    .**.** It is t
0660: 68 65 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  he VDBE cursor n
0670: 75 6d 62 65 72 20 69 73 20 74 68 65 20 76 61 6c  umber is the val
0680: 75 65 20 73 74 6f 72 65 64 20 69 6e 20 45 78 70  ue stored in Exp
0690: 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 77 68 65 6e  r.iTable.** when
06a0: 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c   Expr.op==TK_COL
06b0: 55 4d 4e 20 61 6e 64 20 74 68 65 20 76 61 6c 75  UMN and the valu
06c0: 65 20 73 74 6f 72 65 64 20 69 6e 20 53 72 63 4c  e stored in SrcL
06d0: 69 73 74 2e 61 5b 5d 2e 69 43 75 72 73 6f 72 2e  ist.a[].iCursor.
06e0: 0a 2a 2a 0a 2a 2a 20 70 72 65 72 65 71 4c 65 66  .**.** prereqLef
06f0: 74 2c 20 70 72 65 72 65 71 52 69 67 68 74 2c 20  t, prereqRight, 
0700: 61 6e 64 20 70 72 65 72 65 71 41 6c 6c 20 72 65  and prereqAll re
0710: 63 6f 72 64 20 73 65 74 73 20 6f 66 20 63 75 72  cord sets of cur
0720: 73 6f 72 20 6e 75 6d 62 65 72 73 2c 0a 2a 2a 20  sor numbers,.** 
0730: 62 75 74 20 74 68 65 79 20 64 6f 20 73 6f 20 69  but they do so i
0740: 6e 64 69 72 65 63 74 6c 79 2e 20 20 41 20 73 69  ndirectly.  A si
0750: 6e 67 6c 65 20 45 78 70 72 4d 61 73 6b 53 65 74  ngle ExprMaskSet
0760: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
0770: 6c 61 74 65 73 0a 2a 2a 20 63 75 72 73 6f 72 20  lates.** cursor 
0780: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 62 69 74 73  number into bits
0790: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 6c 61   and the transla
07a0: 74 65 64 20 62 69 74 20 69 73 20 73 74 6f 72 65  ted bit is store
07b0: 64 20 69 6e 20 74 68 65 20 70 72 65 72 65 71 0a  d in the prereq.
07c0: 2a 2a 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20  ** fields.  The 
07d0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69 73 20 75  translation is u
07e0: 73 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  sed in order to 
07f0: 6d 61 78 69 6d 69 7a 65 20 74 68 65 20 6e 75 6d  maximize the num
0800: 62 65 72 20 6f 66 0a 2a 2a 20 62 69 74 73 20 74  ber of.** bits t
0810: 68 61 74 20 77 69 6c 6c 20 66 69 74 20 69 6e 20  hat will fit in 
0820: 61 20 42 69 74 6d 61 73 6b 2e 20 20 54 68 65 20  a Bitmask.  The 
0830: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
0840: 65 72 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a 20  ers might be.** 
0850: 73 70 72 65 61 64 20 6f 75 74 20 6f 76 65 72 20  spread out over 
0860: 74 68 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65  the non-negative
0870: 20 69 6e 74 65 67 65 72 73 2e 20 20 46 6f 72 20   integers.  For 
0880: 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 63 75 72  example, the cur
0890: 73 6f 72 0a 2a 2a 20 6e 75 6d 62 65 72 73 20 6d  sor.** numbers m
08a0: 69 67 68 74 20 62 65 20 33 2c 20 38 2c 20 39 2c  ight be 3, 8, 9,
08b0: 20 31 30 2c 20 32 30 2c 20 32 33 2c 20 34 31 2c   10, 20, 23, 41,
08c0: 20 61 6e 64 20 34 35 2e 20 20 54 68 65 20 45 78   and 45.  The Ex
08d0: 70 72 4d 61 73 6b 53 65 74 0a 2a 2a 20 74 72 61  prMaskSet.** tra
08e0: 6e 73 6c 61 74 65 73 20 74 68 65 73 65 20 73 70  nslates these sp
08f0: 61 72 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62  arse cursor numb
0900: 65 72 73 20 69 6e 74 6f 20 63 6f 6e 73 65 63 75  ers into consecu
0910: 74 69 76 65 20 69 6e 74 65 67 65 72 73 0a 2a 2a  tive integers.**
0920: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
0930: 30 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61  0 in order to ma
0940: 6b 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 73  ke the best poss
0950: 69 62 6c 65 20 75 73 65 20 6f 66 20 74 68 65 20  ible use of the 
0960: 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 62 69 74  available.** bit
0970: 73 20 69 6e 20 74 68 65 20 42 69 74 6d 61 73 6b  s in the Bitmask
0980: 2e 20 20 53 6f 2c 20 69 6e 20 74 68 65 20 65 78  .  So, in the ex
0990: 61 6d 70 6c 65 20 61 62 6f 76 65 2c 20 74 68 65  ample above, the
09a0: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73 0a   cursor numbers.
09b0: 2a 2a 20 77 6f 75 6c 64 20 62 65 20 6d 61 70 70  ** would be mapp
09c0: 65 64 20 69 6e 74 6f 20 69 6e 74 65 67 65 72 73  ed into integers
09d0: 20 30 20 74 68 72 6f 75 67 68 20 37 2e 0a 2a 2a   0 through 7..**
09e0: 0a 2a 2a 20 70 72 65 72 65 71 4c 65 66 74 20 74  .** prereqLeft t
09f0: 65 6c 6c 73 20 75 73 20 65 76 65 72 79 20 56 44  ells us every VD
0a00: 42 45 20 63 75 72 73 6f 72 20 74 68 61 74 20 69  BE cursor that i
0a10: 73 20 72 65 66 65 72 65 6e 63 65 64 20 6f 6e 20  s referenced on 
0a20: 74 68 65 0a 2a 2a 20 6c 65 66 74 2d 68 61 6e 64  the.** left-hand
0a30: 20 73 69 64 65 20 6f 66 20 57 68 65 72 65 54 65   side of WhereTe
0a40: 72 6d 2e 70 2e 20 20 70 72 65 72 65 71 52 69 67  rm.p.  prereqRig
0a50: 68 74 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  ht does the same
0a60: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 72 69 67 68   for the.** righ
0a70: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74  t-hand side of t
0a80: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20  he expression.  
0a90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 64  The following id
0aa0: 65 6e 74 69 74 79 20 61 6c 77 61 79 73 0a 2a 2a  entity always.**
0ab0: 20 68 6f 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   holds:.**.**   
0ac0: 20 20 20 20 70 72 65 72 65 71 41 6c 6c 20 3d 20      prereqAll = 
0ad0: 70 72 65 72 65 71 4c 65 66 74 20 7c 20 70 72 65  prereqLeft | pre
0ae0: 72 65 71 52 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54  reqRight.**.** T
0af0: 68 65 20 57 68 65 72 65 54 65 72 6d 2e 69 6e 64  he WhereTerm.ind
0b00: 65 78 61 62 6c 65 20 66 69 65 6c 64 20 69 73 20  exable field is 
0b10: 74 72 75 65 20 69 66 20 74 68 65 20 57 68 65 72  true if the Wher
0b20: 65 54 65 72 6d 2e 70 20 65 78 70 72 65 73 73 69  eTerm.p expressi
0b30: 6f 6e 0a 2a 2a 20 69 73 20 6f 66 20 61 20 66 6f  on.** is of a fo
0b40: 72 6d 20 74 68 61 74 20 6d 69 67 68 74 20 63 6f  rm that might co
0b50: 6e 74 72 6f 6c 20 61 6e 20 69 6e 64 65 78 2e 20  ntrol an index. 
0b60: 20 49 6e 64 65 78 61 62 6c 65 20 65 78 70 72 65   Indexable expre
0b70: 73 73 69 6f 6e 73 0a 2a 2a 20 6c 6f 6f 6b 20 6c  ssions.** look l
0b80: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 63 6f               <co
0ba0: 6c 75 6d 6e 3e 20 3c 6f 70 3e 20 3c 65 78 70 72  lumn> <op> <expr
0bb0: 3e 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 63  >.**.** Where <c
0bc0: 6f 6c 75 6d 6e 3e 20 69 73 20 61 20 73 69 6d 70  olumn> is a simp
0bd0: 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 61  le column name a
0be0: 6e 64 20 3c 6f 70 3e 20 69 73 20 6f 6e 20 6f 66  nd <op> is on of
0bf0: 20 74 68 65 20 6f 70 65 72 61 74 6f 72 73 0a 2a   the operators.*
0c00: 2a 20 74 68 61 74 20 61 6c 6c 6f 77 65 64 4f 70  * that allowedOp
0c10: 28 29 20 72 65 63 6f 67 6e 69 7a 65 73 2e 20 20  () recognizes.  
0c20: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
0c30: 63 74 20 57 68 65 72 65 54 65 72 6d 20 57 68 65  ct WhereTerm Whe
0c40: 72 65 54 65 72 6d 3b 0a 73 74 72 75 63 74 20 57  reTerm;.struct W
0c50: 68 65 72 65 54 65 72 6d 20 7b 0a 20 20 45 78 70  hereTerm {.  Exp
0c60: 72 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  r *p;           
0c70: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
0c80: 74 6f 20 74 68 65 20 73 75 62 65 78 70 72 65 73  to the subexpres
0c90: 73 69 6f 6e 20 2a 2f 0a 20 20 75 31 36 20 66 6c  sion */.  u16 fl
0ca0: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
0cb0: 20 20 2f 2a 20 42 69 74 20 66 6c 61 67 73 2e 20    /* Bit flags. 
0cc0: 20 53 65 65 20 62 65 6c 6f 77 20 2a 2f 0a 20 20   See below */.  
0cd0: 75 38 20 69 6e 64 65 78 61 62 6c 65 3b 20 20 20  u8 indexable;   
0ce0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
0cf0: 69 66 20 74 68 69 73 20 73 75 62 65 78 70 72 73  if this subexprs
0d00: 73 69 6f 6e 20 69 73 20 75 73 61 62 6c 65 20 62  sion is usable b
0d10: 79 20 61 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20  y an index */.  
0d20: 73 68 6f 72 74 20 69 6e 74 20 69 64 78 4c 65 66  short int idxLef
0d30: 74 3b 20 20 20 20 20 20 2f 2a 20 70 2d 3e 70 4c  t;      /* p->pL
0d40: 65 66 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20  eft is a column 
0d50: 69 6e 20 74 68 69 73 20 74 61 62 6c 65 20 6e 75  in this table nu
0d60: 6d 62 65 72 2e 20 2d 31 20 69 66 0a 20 20 20 20  mber. -1 if.    
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 2a 2a 20 70 2d 3e 70 4c 65 66        ** p->pLef
0d90: 74 20 69 73 20 6e 6f 74 20 61 20 63 6f 6c 75 6d  t is not a colum
0da0: 6e 20 6f 66 20 61 6e 79 20 74 61 62 6c 65 20 2a  n of any table *
0db0: 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 69 64  /.  short int id
0dc0: 78 52 69 67 68 74 3b 20 20 20 20 20 2f 2a 20 70  xRight;     /* p
0dd0: 2d 3e 70 52 69 67 68 74 20 69 73 20 61 20 63 6f  ->pRight is a co
0de0: 6c 75 6d 6e 20 69 6e 20 74 68 69 73 20 74 61 62  lumn in this tab
0df0: 6c 65 20 6e 75 6d 62 65 72 2e 20 2d 31 20 69 66  le number. -1 if
0e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e10: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 2d             ** p-
0e20: 3e 70 52 69 67 68 74 20 69 73 20 6e 6f 74 20 61  >pRight is not a
0e30: 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 6e 79 20 74   column of any t
0e40: 61 62 6c 65 20 2a 2f 0a 20 20 42 69 74 6d 61 73  able */.  Bitmas
0e50: 6b 20 70 72 65 72 65 71 4c 65 66 74 3b 20 20 20  k prereqLeft;   
0e60: 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20 6f 66 20    /* Bitmask of 
0e70: 74 61 62 6c 65 73 20 72 65 66 65 72 65 6e 63 65  tables reference
0e80: 64 20 62 79 20 70 2d 3e 70 4c 65 66 74 20 2a 2f  d by p->pLeft */
0e90: 0a 20 20 42 69 74 6d 61 73 6b 20 70 72 65 72 65  .  Bitmask prere
0ea0: 71 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 42 69  qRight;    /* Bi
0eb0: 74 6d 61 73 6b 20 6f 66 20 74 61 62 6c 65 73 20  tmask of tables 
0ec0: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 70 2d  referenced by p-
0ed0: 3e 70 52 69 67 68 74 20 2a 2f 0a 20 20 42 69 74  >pRight */.  Bit
0ee0: 6d 61 73 6b 20 70 72 65 72 65 71 41 6c 6c 3b 20  mask prereqAll; 
0ef0: 20 20 20 20 20 2f 2a 20 42 69 74 6d 61 73 6b 20       /* Bitmask 
0f00: 6f 66 20 74 61 62 6c 65 73 20 72 65 66 65 72 65  of tables refere
0f10: 6e 63 65 64 20 62 79 20 70 20 2a 2f 0a 7d 3b 0a  nced by p */.};.
0f20: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
0f30: 61 6c 75 65 73 20 6f 66 20 57 68 65 72 65 54 65  alues of WhereTe
0f40: 72 6d 2e 66 6c 61 67 73 0a 2a 2f 0a 23 64 65 66  rm.flags.*/.#def
0f50: 69 6e 65 20 54 45 52 4d 5f 44 59 4e 41 4d 49 43  ine TERM_DYNAMIC
0f60: 20 20 20 20 30 78 30 30 30 31 20 20 20 2f 2a 20      0x0001   /* 
0f70: 4e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c  Need to call sql
0f80: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
0f90: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 54 45 52  ) */.#define TER
0fa0: 4d 5f 56 49 52 54 55 41 4c 20 20 20 20 30 78 30  M_VIRTUAL    0x0
0fb0: 30 30 32 20 20 20 2f 2a 20 41 64 64 65 64 20 62  002   /* Added b
0fc0: 79 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 72 2e  y the optimizer.
0fd0: 20 20 44 6f 20 6e 6f 74 20 63 6f 64 65 20 2a 2f    Do not code */
0fe0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
0ff0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1000: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 68  wing structure h
1010: 6f 6c 64 73 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  olds all informa
1020: 74 69 6f 6e 20 61 62 6f 75 74 20 61 0a 2a 2a 20  tion about a.** 
1030: 57 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 4d  WHERE clause.  M
1040: 6f 73 74 6c 79 20 74 68 69 73 20 69 73 20 61 20  ostly this is a 
1050: 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 6f 6e  container for on
1060: 65 20 6f 72 20 6d 6f 72 65 20 57 68 65 72 65 54  e or more WhereT
1070: 65 72 6d 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  erms..*/.typedef
1080: 20 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61   struct WhereCla
1090: 75 73 65 20 57 68 65 72 65 43 6c 61 75 73 65 3b  use WhereClause;
10a0: 0a 73 74 72 75 63 74 20 57 68 65 72 65 43 6c 61  .struct WhereCla
10b0: 75 73 65 20 7b 0a 20 20 69 6e 74 20 6e 54 65 72  use {.  int nTer
10c0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
10d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
10e0: 72 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 6c  rms */.  int nSl
10f0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1100: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1110: 6e 74 72 69 65 73 20 69 6e 20 61 5b 5d 20 2a 2f  ntries in a[] */
1120: 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a 61 3b  .  WhereTerm *a;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1140: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72 72  ointer to an arr
1150: 61 79 20 6f 66 20 74 65 72 6d 73 20 2a 2f 0a 20  ay of terms */. 
1160: 20 57 68 65 72 65 54 65 72 6d 20 61 53 74 61 74   WhereTerm aStat
1170: 69 63 5b 31 30 5d 3b 20 20 20 2f 2a 20 49 6e 69  ic[10];   /* Ini
1180: 74 69 61 6c 20 73 74 61 74 69 63 20 73 70 61 63  tial static spac
1190: 65 20 66 6f 72 20 74 68 65 20 74 65 72 6d 73 20  e for the terms 
11a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
11b0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
11c0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
11d0: 75 72 65 20 6b 65 65 70 73 20 74 72 61 63 6b 20  ure keeps track 
11e0: 6f 66 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20  of a mapping.** 
11f0: 62 65 74 77 65 65 6e 20 56 44 42 45 20 63 75 72  between VDBE cur
1200: 73 6f 72 20 6e 75 6d 62 65 72 73 20 61 6e 64 20  sor numbers and 
1210: 62 69 74 73 20 6f 66 20 74 68 65 20 62 69 74 6d  bits of the bitm
1220: 61 73 6b 73 20 69 6e 20 57 68 65 72 65 54 65 72  asks in WhereTer
1230: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42  m..**.** The VDB
1240: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 73  E cursor numbers
1250: 20 61 72 65 20 73 6d 61 6c 6c 20 69 6e 74 65 67   are small integ
1260: 65 72 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  ers contained in
1270: 20 0a 2a 2a 20 53 72 63 4c 69 73 74 5f 69 74 65   .** SrcList_ite
1280: 6d 2e 69 43 75 72 73 6f 72 20 61 6e 64 20 45 78  m.iCursor and Ex
1290: 70 72 2e 69 54 61 62 6c 65 20 66 69 65 6c 64 73  pr.iTable fields
12a0: 2e 20 20 46 6f 72 20 61 6e 79 20 67 69 76 65 6e  .  For any given
12b0: 20 57 48 45 52 45 20 0a 2a 2a 20 63 6c 61 75 73   WHERE .** claus
12c0: 65 2c 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  e, the cursor nu
12d0: 6d 62 65 72 73 20 6d 69 67 68 74 20 6e 6f 74 20  mbers might not 
12e0: 62 65 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64  begin with 0 and
12f0: 20 74 68 65 79 20 6d 69 67 68 74 0a 2a 2a 20 63   they might.** c
1300: 6f 6e 74 61 69 6e 20 67 61 70 73 20 69 6e 20 74  ontain gaps in t
1310: 68 65 20 6e 75 6d 62 65 72 69 6e 67 20 73 65 71  he numbering seq
1320: 75 65 6e 63 65 2e 20 20 42 75 74 20 77 65 20 77  uence.  But we w
1330: 61 6e 74 20 74 6f 20 6d 61 6b 65 20 6d 61 78 69  ant to make maxi
1340: 6d 75 6d 0a 2a 2a 20 75 73 65 20 6f 66 20 74 68  mum.** use of th
1350: 65 20 62 69 74 73 20 69 6e 20 6f 75 72 20 62 69  e bits in our bi
1360: 74 6d 61 73 6b 73 2e 20 20 54 68 69 73 20 73 74  tmasks.  This st
1370: 72 75 63 74 75 72 65 20 70 72 6f 76 69 64 65 73  ructure provides
1380: 20 61 20 6d 61 70 70 69 6e 67 0a 2a 2a 20 66 72   a mapping.** fr
1390: 6f 6d 20 74 68 65 20 73 70 61 72 73 65 20 63 75  om the sparse cu
13a0: 72 73 6f 72 20 6e 75 6d 62 65 72 73 20 69 6e 74  rsor numbers int
13b0: 6f 20 63 6f 6e 73 65 63 75 74 69 76 65 20 69 6e  o consecutive in
13c0: 74 65 67 65 72 73 20 62 65 67 69 6e 6e 69 6e 67  tegers beginning
13d0: 0a 2a 2a 20 77 69 74 68 20 30 2e 0a 2a 2a 0a 2a  .** with 0..**.*
13e0: 2a 20 49 66 20 45 78 70 72 4d 61 73 6b 53 65 74  * If ExprMaskSet
13f0: 2e 69 78 5b 41 5d 3d 3d 42 20 69 74 20 6d 65 61  .ix[A]==B it mea
1400: 6e 73 20 74 68 61 74 20 54 68 65 20 41 2d 74 68  ns that The A-th
1410: 20 62 69 74 20 6f 66 20 61 20 42 69 74 6d 61 73   bit of a Bitmas
1420: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73  k.** corresponds
1430: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
1440: 62 65 72 20 42 2e 20 20 54 68 65 20 41 2d 74 68  ber B.  The A-th
1450: 20 62 69 74 20 6f 66 20 61 20 62 69 74 6d 61 73   bit of a bitmas
1460: 6b 20 69 73 20 31 3c 3c 41 2e 0a 2a 2a 0a 2a 2a  k is 1<<A..**.**
1470: 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66   For example, if
1480: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
1490: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 75 73 65  e expression use
14a0: 64 20 74 68 65 73 65 20 56 44 42 45 0a 2a 2a 20  d these VDBE.** 
14b0: 63 75 72 73 6f 72 73 3a 20 20 34 2c 20 35 2c 20  cursors:  4, 5, 
14c0: 38 2c 20 32 39 2c 20 35 37 2c 20 37 33 2e 20 20  8, 29, 57, 73.  
14d0: 54 68 65 6e 20 74 68 65 20 20 45 78 70 72 4d 61  Then the  ExprMa
14e0: 73 6b 53 65 74 20 73 74 72 75 63 74 75 72 65 0a  skSet structure.
14f0: 2a 2a 20 77 6f 75 6c 64 20 6d 61 70 20 74 68 6f  ** would map tho
1500: 73 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  se cursor number
1510: 73 20 69 6e 74 6f 20 62 69 74 73 20 30 20 74 68  s into bits 0 th
1520: 72 6f 75 67 68 20 35 2e 0a 2a 2a 0a 2a 2a 20 4e  rough 5..**.** N
1530: 6f 74 65 20 74 68 61 74 20 74 68 65 20 6d 61 70  ote that the map
1540: 70 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  ping is not nece
1550: 73 73 61 72 69 6c 79 20 6f 72 64 65 72 65 64 2e  ssarily ordered.
1560: 20 20 49 6e 20 74 68 65 20 65 78 61 6d 70 6c 65    In the example
1570: 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 65 20 6d  .** above, the m
1580: 61 70 70 69 6e 67 20 6d 69 67 68 74 20 67 6f 20  apping might go 
1590: 6c 69 6b 65 20 74 68 69 73 3a 20 20 34 2d 3e 33  like this:  4->3
15a0: 2c 20 35 2d 3e 31 2c 20 38 2d 3e 32 2c 20 32 39  , 5->1, 8->2, 29
15b0: 2d 3e 30 2c 0a 2a 2a 20 35 37 2d 3e 35 2c 20 37  ->0,.** 57->5, 7
15c0: 33 2d 3e 34 2e 20 20 4f 72 20 6f 6e 65 20 6f 66  3->4.  Or one of
15d0: 20 37 31 39 20 6f 74 68 65 72 20 63 6f 6d 62 69   719 other combi
15e0: 6e 61 74 69 6f 6e 73 20 6d 69 67 68 74 20 62 65  nations might be
15f0: 20 75 73 65 64 2e 20 49 74 0a 2a 2a 20 64 6f 65   used. It.** doe
1600: 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6d 61 74  s not really mat
1610: 74 65 72 2e 20 20 57 68 61 74 20 69 73 20 69 6d  ter.  What is im
1620: 70 6f 72 74 61 6e 74 20 69 73 20 74 68 61 74 20  portant is that 
1630: 73 70 61 72 73 65 20 63 75 72 73 6f 72 0a 2a 2a  sparse cursor.**
1640: 20 6e 75 6d 62 65 72 73 20 61 6c 6c 20 67 65 74   numbers all get
1650: 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 62 69 74   mapped into bit
1660: 20 6e 75 6d 62 65 72 73 20 74 68 61 74 20 62 65   numbers that be
1670: 67 69 6e 20 77 69 74 68 20 30 20 61 6e 64 20 63  gin with 0 and c
1680: 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 6f 20 67 61 70  ontain.** no gap
1690: 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  s..*/.typedef st
16a0: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
16b0: 20 45 78 70 72 4d 61 73 6b 53 65 74 3b 0a 73 74   ExprMaskSet;.st
16c0: 72 75 63 74 20 45 78 70 72 4d 61 73 6b 53 65 74  ruct ExprMaskSet
16d0: 20 7b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20   {.  int n;     
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1700: 61 73 73 69 67 6e 65 64 20 63 75 72 73 6f 72 20  assigned cursor 
1710: 76 61 6c 75 65 73 20 2a 2f 0a 20 20 69 6e 74 20  values */.  int 
1720: 69 78 5b 73 69 7a 65 6f 66 28 42 69 74 6d 61 73  ix[sizeof(Bitmas
1730: 6b 29 2a 38 5d 3b 20 20 20 20 2f 2a 20 43 75 72  k)*8];    /* Cur
1740: 73 6f 72 20 61 73 73 69 67 6e 65 64 20 74 6f 20  sor assigned to 
1750: 65 61 63 68 20 62 69 74 20 2a 2f 0a 7d 3b 0a 0a  each bit */.};..
1760: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
1770: 65 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64  e a preallocated
1780: 20 57 68 65 72 65 43 6c 61 75 73 65 20 73 74 72   WhereClause str
1790: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ucture..*/.stati
17a0: 63 20 76 6f 69 64 20 77 68 65 72 65 43 6c 61 75  c void whereClau
17b0: 73 65 49 6e 69 74 28 57 68 65 72 65 43 6c 61 75  seInit(WhereClau
17c0: 73 65 20 2a 70 57 43 29 7b 0a 20 20 70 57 43 2d  se *pWC){.  pWC-
17d0: 3e 6e 54 65 72 6d 20 3d 20 30 3b 0a 20 20 70 57  >nTerm = 0;.  pW
17e0: 43 2d 3e 6e 53 6c 6f 74 20 3d 20 41 52 52 41 59  C->nSlot = ARRAY
17f0: 53 49 5a 45 28 70 57 43 2d 3e 61 53 74 61 74 69  SIZE(pWC->aStati
1800: 63 29 3b 0a 20 20 70 57 43 2d 3e 61 20 3d 20 70  c);.  pWC->a = p
1810: 57 43 2d 3e 61 53 74 61 74 69 63 3b 0a 7d 0a 0a  WC->aStatic;.}..
1820: 2f 2a 0a 2a 2a 20 44 65 61 6c 6c 6f 63 61 74 65  /*.** Deallocate
1830: 20 61 20 57 68 65 72 65 43 6c 61 75 73 65 20 73   a WhereClause s
1840: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 57  tructure.  The W
1850: 68 65 72 65 43 6c 61 75 73 65 20 73 74 72 75 63  hereClause struc
1860: 74 75 72 65 0a 2a 2a 20 69 74 73 65 6c 66 20 69  ture.** itself i
1870: 73 20 6e 6f 74 20 66 72 65 65 64 2e 20 20 54 68  s not freed.  Th
1880: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
1890: 65 20 69 6e 76 65 72 73 65 20 6f 66 20 77 68 65  e inverse of whe
18a0: 72 65 43 6c 61 75 73 65 49 6e 69 74 28 29 2e 0a  reClauseInit()..
18b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77  */.static void w
18c0: 68 65 72 65 43 6c 61 75 73 65 43 6c 65 61 72 28  hereClauseClear(
18d0: 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57 43  WhereClause *pWC
18e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 57 68  ){.  int i;.  Wh
18f0: 65 72 65 54 65 72 6d 20 2a 61 3b 0a 20 20 66 6f  ereTerm *a;.  fo
1900: 72 28 69 3d 70 57 43 2d 3e 6e 54 65 72 6d 2d 31  r(i=pWC->nTerm-1
1910: 2c 20 61 3d 70 57 43 2d 3e 61 3b 20 69 3e 3d 30  , a=pWC->a; i>=0
1920: 3b 20 69 2d 2d 2c 20 61 2b 2b 29 7b 0a 20 20 20  ; i--, a++){.   
1930: 20 69 66 28 20 61 2d 3e 66 6c 61 67 73 20 26 20   if( a->flags & 
1940: 54 45 52 4d 5f 44 59 4e 41 4d 49 43 20 29 7b 0a  TERM_DYNAMIC ){.
1950: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1960: 72 44 65 6c 65 74 65 28 61 2d 3e 70 29 3b 0a 20  rDelete(a->p);. 
1970: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
1980: 57 43 2d 3e 61 21 3d 70 57 43 2d 3e 61 53 74 61  WC->a!=pWC->aSta
1990: 74 69 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tic ){.    sqlit
19a0: 65 46 72 65 65 28 70 57 43 2d 3e 61 29 3b 0a 20  eFree(pWC->a);. 
19b0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20   }.}../*.** Add 
19c0: 61 20 6e 65 77 20 65 6e 74 72 69 65 73 20 74 6f  a new entries to
19d0: 20 74 68 65 20 57 68 65 72 65 43 6c 61 75 73 65   the WhereClause
19e0: 20 73 74 72 75 63 74 75 72 65 2e 20 20 49 6e 63   structure.  Inc
19f0: 72 65 61 73 65 20 74 68 65 20 61 6c 6c 6f 63 61  rease the alloca
1a00: 74 65 64 0a 2a 2a 20 73 70 61 63 65 20 61 73 20  ted.** space as 
1a10: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74  necessary..*/.st
1a20: 61 74 69 63 20 76 6f 69 64 20 77 68 65 72 65 43  atic void whereC
1a30: 6c 61 75 73 65 49 6e 73 65 72 74 28 57 68 65 72  lauseInsert(Wher
1a40: 65 43 6c 61 75 73 65 20 2a 70 57 43 2c 20 45 78  eClause *pWC, Ex
1a50: 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73  pr *p, int flags
1a60: 29 7b 0a 20 20 57 68 65 72 65 54 65 72 6d 20 2a  ){.  WhereTerm *
1a70: 70 54 65 72 6d 3b 0a 20 20 69 66 28 20 70 57 43  pTerm;.  if( pWC
1a80: 2d 3e 6e 54 65 72 6d 3e 3d 70 57 43 2d 3e 6e 53  ->nTerm>=pWC->nS
1a90: 6c 6f 74 20 29 7b 0a 20 20 20 20 57 68 65 72 65  lot ){.    Where
1aa0: 54 65 72 6d 20 2a 70 4f 6c 64 20 3d 20 70 57 43  Term *pOld = pWC
1ab0: 2d 3e 61 3b 0a 20 20 20 20 70 57 43 2d 3e 61 20  ->a;.    pWC->a 
1ac0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1ad0: 73 69 7a 65 6f 66 28 70 57 43 2d 3e 61 5b 30 5d  sizeof(pWC->a[0]
1ae0: 29 2a 70 57 43 2d 3e 6e 53 6c 6f 74 2a 32 20 29  )*pWC->nSlot*2 )
1af0: 3b 0a 20 20 20 20 69 66 28 20 70 57 43 2d 3e 61  ;.    if( pWC->a
1b00: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
1b10: 20 20 6d 65 6d 63 70 79 28 70 57 43 2d 3e 61 2c    memcpy(pWC->a,
1b20: 20 70 4f 6c 64 2c 20 73 69 7a 65 6f 66 28 70 57   pOld, sizeof(pW
1b30: 43 2d 3e 61 5b 30 5d 29 2a 70 57 43 2d 3e 6e 54  C->a[0])*pWC->nT
1b40: 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 4f  erm);.    if( pO
1b50: 6c 64 21 3d 70 57 43 2d 3e 61 53 74 61 74 69 63  ld!=pWC->aStatic
1b60: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1b70: 46 72 65 65 28 70 4f 6c 64 29 3b 0a 20 20 20 20  Free(pOld);.    
1b80: 7d 0a 20 20 20 20 70 57 43 2d 3e 6e 53 6c 6f 74  }.    pWC->nSlot
1b90: 20 2a 3d 20 32 3b 0a 20 20 7d 0a 20 20 70 54 65   *= 2;.  }.  pTe
1ba0: 72 6d 20 3d 20 26 70 57 43 2d 3e 61 5b 70 57 43  rm = &pWC->a[pWC
1bb0: 2d 3e 6e 54 65 72 6d 2b 2b 5d 3b 0a 20 20 70 54  ->nTerm++];.  pT
1bc0: 65 72 6d 2d 3e 70 20 3d 20 70 3b 0a 20 20 70 54  erm->p = p;.  pT
1bd0: 65 72 6d 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  erm->flags = fla
1be0: 67 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  gs;.}../*.** Thi
1bf0: 73 20 72 6f 75 74 69 6e 65 20 69 64 65 6e 74 69  s routine identi
1c00: 66 69 65 73 20 73 75 62 65 78 70 72 65 73 73 69  fies subexpressi
1c10: 6f 6e 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  ons in the WHERE
1c20: 20 63 6c 61 75 73 65 20 77 68 65 72 65 0a 2a 2a   clause where.**
1c30: 20 65 61 63 68 20 73 75 62 65 78 70 72 65 73 73   each subexpress
1c40: 69 6f 6e 20 69 73 20 73 65 70 61 72 61 74 65 20  ion is separate 
1c50: 62 79 20 74 68 65 20 41 4e 44 20 6f 70 65 72 61  by the AND opera
1c60: 74 6f 72 2e 20 20 61 53 6c 6f 74 20 69 73 20 0a  tor.  aSlot is .
1c70: 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 70  ** filled with p
1c80: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 73  ointers to the s
1c90: 75 62 65 78 70 72 65 73 73 69 6f 6e 73 2e 20 20  ubexpressions.  
1ca0: 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a  For example:.**.
1cb0: 2a 2a 20 20 20 20 57 48 45 52 45 20 20 61 3d 3d  **    WHERE  a==
1cc0: 27 68 65 6c 6c 6f 27 20 41 4e 44 20 63 6f 61 6c  'hello' AND coal
1cd0: 65 73 63 65 28 62 2c 31 31 29 3c 31 30 20 41 4e  esce(b,11)<10 AN
1ce0: 44 20 28 63 2b 31 32 21 3d 64 20 4f 52 20 63 3d  D (c+12!=d OR c=
1cf0: 3d 32 32 29 0a 2a 2a 20 20 20 20 20 20 20 20 20  =22).**         
1d00: 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 2f 20 20 20 20    \________/    
1d10: 20 5c 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   \______________
1d20: 5f 2f 20 20 20 20 20 5c 5f 5f 5f 5f 5f 5f 5f 5f  _/     \________
1d30: 5f 5f 5f 5f 5f 5f 5f 5f 2f 0a 2a 2a 20 20 20 20  ________/.**    
1d40: 20 20 20 20 20 20 20 20 73 6c 6f 74 5b 30 5d 20          slot[0] 
1d50: 20 20 20 20 20 20 20 20 20 20 20 73 6c 6f 74 5b             slot[
1d60: 31 5d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1]              
1d70: 20 73 6c 6f 74 5b 32 5d 0a 2a 2a 0a 2a 2a 20 54   slot[2].**.** T
1d80: 68 65 20 6f 72 69 67 69 6e 61 6c 20 57 48 45 52  he original WHER
1d90: 45 20 63 6c 61 75 73 65 20 69 6e 20 70 45 78 70  E clause in pExp
1da0: 72 20 69 73 20 75 6e 61 6c 74 65 72 65 64 2e 20  r is unaltered. 
1db0: 20 41 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e   All this routin
1dc0: 65 0a 2a 2a 20 64 6f 65 73 20 69 73 20 6d 61 6b  e.** does is mak
1dd0: 65 20 61 53 6c 6f 74 5b 5d 20 65 6e 74 72 69 65  e aSlot[] entrie
1de0: 73 20 70 6f 69 6e 74 20 74 6f 20 73 75 62 73 74  s point to subst
1df0: 72 75 63 74 75 72 65 20 77 69 74 68 69 6e 20 70  ructure within p
1e00: 45 78 70 72 2e 0a 2a 2a 0a 2a 2a 20 61 53 6c 6f  Expr..**.** aSlo
1e10: 74 5b 5d 20 69 73 20 61 6e 20 61 72 72 61 79 20  t[] is an array 
1e20: 6f 66 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  of subexpression
1e30: 73 20 73 74 72 75 63 74 75 72 65 73 2e 20 20 54  s structures.  T
1e40: 68 65 72 65 20 61 72 65 20 6e 53 6c 6f 74 0a 2a  here are nSlot.*
1e50: 2a 20 73 70 61 63 65 73 20 6c 65 66 74 20 69 6e  * spaces left in
1e60: 20 74 68 69 73 20 61 72 72 61 79 2e 20 20 54 68   this array.  Th
1e70: 69 73 20 72 6f 75 74 69 6e 65 20 66 69 6e 64 73  is routine finds
1e80: 20 61 73 20 6d 61 6e 79 20 41 4e 44 2d 73 65 70   as many AND-sep
1e90: 61 72 61 74 65 64 0a 2a 2a 20 73 75 62 65 78 70  arated.** subexp
1ea0: 72 65 73 73 69 6f 6e 73 20 61 73 20 69 74 20 63  ressions as it c
1eb0: 61 6e 20 61 6e 64 20 70 75 74 73 20 70 6f 69 6e  an and puts poin
1ec0: 74 65 72 73 20 74 6f 20 74 68 6f 73 65 20 73 75  ters to those su
1ed0: 62 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20  bexpressions.** 
1ee0: 69 6e 74 6f 20 61 53 6c 6f 74 5b 5d 20 65 6e 74  into aSlot[] ent
1ef0: 72 69 65 73 2e 20 20 54 68 65 20 72 65 74 75 72  ries.  The retur
1f00: 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
1f10: 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 20 66  umber of slots f
1f20: 69 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  illed..*/.static
1f30: 20 76 6f 69 64 20 77 68 65 72 65 53 70 6c 69 74   void whereSplit
1f40: 28 57 68 65 72 65 43 6c 61 75 73 65 20 2a 70 57  (WhereClause *pW
1f50: 43 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  C, Expr *pExpr){
1f60: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
1f70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1f80: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 41 4e  pExpr->op!=TK_AN
1f90: 44 20 29 7b 0a 20 20 20 20 77 68 65 72 65 43 6c  D ){.    whereCl
1fa0: 61 75 73 65 49 6e 73 65 72 74 28 70 57 43 2c 20  auseInsert(pWC, 
1fb0: 70 45 78 70 72 2c 20 30 29 3b 0a 20 20 7d 65 6c  pExpr, 0);.  }el
1fc0: 73 65 7b 0a 20 20 20 20 77 68 65 72 65 53 70 6c  se{.    whereSpl
1fd0: 69 74 28 70 57 43 2c 20 70 45 78 70 72 2d 3e 70  it(pWC, pExpr->p
1fe0: 4c 65 66 74 29 3b 0a 20 20 20 20 77 68 65 72 65  Left);.    where
1ff0: 53 70 6c 69 74 28 70 57 43 2c 20 70 45 78 70 72  Split(pWC, pExpr
2000: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 7d  ->pRight);.  }.}
2010: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
2020: 7a 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ze an expression
2030: 20 6d 61 73 6b 20 73 65 74 0a 2a 2f 0a 23 64 65   mask set.*/.#de
2040: 66 69 6e 65 20 69 6e 69 74 4d 61 73 6b 53 65 74  fine initMaskSet
2050: 28 50 29 20 20 6d 65 6d 73 65 74 28 50 2c 20 30  (P)  memset(P, 0
2060: 2c 20 73 69 7a 65 6f 66 28 2a 50 29 29 0a 0a 2f  , sizeof(*P))../
2070: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2080: 62 69 74 6d 61 73 6b 20 66 6f 72 20 74 68 65 20  bitmask for the 
2090: 67 69 76 65 6e 20 63 75 72 73 6f 72 20 6e 75 6d  given cursor num
20a0: 62 65 72 2e 20 20 52 65 74 75 72 6e 20 30 20 69  ber.  Return 0 i
20b0: 66 0a 2a 2a 20 69 43 75 72 73 6f 72 20 69 73 20  f.** iCursor is 
20c0: 6e 6f 74 20 69 6e 20 74 68 65 20 73 65 74 2e 0a  not in the set..
20d0: 2a 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73  */.static Bitmas
20e0: 6b 20 67 65 74 4d 61 73 6b 28 45 78 70 72 4d 61  k getMask(ExprMa
20f0: 73 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c  skSet *pMaskSet,
2100: 20 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20   int iCursor){. 
2110: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
2120: 30 3b 20 69 3c 70 4d 61 73 6b 53 65 74 2d 3e 6e  0; i<pMaskSet->n
2130: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2140: 70 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 69 5d 3d  pMaskSet->ix[i]=
2150: 3d 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  =iCursor ){.    
2160: 20 20 72 65 74 75 72 6e 20 28 28 42 69 74 6d 61    return ((Bitma
2170: 73 6b 29 31 29 3c 3c 69 3b 0a 20 20 20 20 7d 0a  sk)1)<<i;.    }.
2180: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2190: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
21a0: 61 20 6e 65 77 20 6d 61 73 6b 20 66 6f 72 20 63  a new mask for c
21b0: 75 72 73 6f 72 20 69 43 75 72 73 6f 72 2e 0a 2a  ursor iCursor..*
21c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72  /.static void cr
21d0: 65 61 74 65 4d 61 73 6b 28 45 78 70 72 4d 61 73  eateMask(ExprMas
21e0: 6b 53 65 74 20 2a 70 4d 61 73 6b 53 65 74 2c 20  kSet *pMaskSet, 
21f0: 69 6e 74 20 69 43 75 72 73 6f 72 29 7b 0a 20 20  int iCursor){.  
2200: 69 66 28 20 70 4d 61 73 6b 53 65 74 2d 3e 6e 3c  if( pMaskSet->n<
2210: 41 52 52 41 59 53 49 5a 45 28 70 4d 61 73 6b 53  ARRAYSIZE(pMaskS
2220: 65 74 2d 3e 69 78 29 20 29 7b 0a 20 20 20 20 70  et->ix) ){.    p
2230: 4d 61 73 6b 53 65 74 2d 3e 69 78 5b 70 4d 61 73  MaskSet->ix[pMas
2240: 6b 53 65 74 2d 3e 6e 2b 2b 5d 20 3d 20 69 43 75  kSet->n++] = iCu
2250: 72 73 6f 72 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rsor;.  }.}../*.
2260: 2a 2a 20 44 65 73 74 72 6f 79 20 61 6e 20 65 78  ** Destroy an ex
2270: 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b 20 73 65  pression mask se
2280: 74 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 72 65  t.*/.#define fre
2290: 65 4d 61 73 6b 53 65 74 28 50 29 20 20 20 2f 2a  eMaskSet(P)   /*
22a0: 20 4e 4f 2d 4f 50 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   NO-OP */../*.**
22b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
22c0: 6c 6b 73 20 28 72 65 63 75 72 73 69 76 65 6c 79  lks (recursively
22d0: 29 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  ) an expression 
22e0: 74 72 65 65 20 61 6e 64 20 67 65 6e 65 72 61 74  tree and generat
22f0: 65 73 0a 2a 2a 20 61 20 62 69 74 6d 61 73 6b 20  es.** a bitmask 
2300: 69 6e 64 69 63 61 74 69 6e 67 20 77 68 69 63 68  indicating which
2310: 20 74 61 62 6c 65 73 20 61 72 65 20 75 73 65 64   tables are used
2320: 20 69 6e 20 74 68 61 74 20 65 78 70 72 65 73 73   in that express
2330: 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 0a 2a 2a 0a  ion.** tree..**.
2340: 2a 2a 20 49 6e 20 6f 72 64 65 72 20 66 6f 72 20  ** In order for 
2350: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
2360: 77 6f 72 6b 2c 20 74 68 65 20 63 61 6c 6c 69 6e  work, the callin
2370: 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  g function must 
2380: 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75 73  have.** previous
2390: 6c 79 20 69 6e 76 6f 6b 65 64 20 73 71 6c 69 74  ly invoked sqlit
23a0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
23b0: 65 73 28 29 20 6f 6e 20 74 68 65 20 65 78 70 72  es() on the expr
23c0: 65 73 73 69 6f 6e 2e 20 20 53 65 65 0a 2a 2a 20  ession.  See.** 
23d0: 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d 65  the header comme
23e0: 6e 74 20 6f 6e 20 74 68 61 74 20 72 6f 75 74 69  nt on that routi
23f0: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
2400: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
2410: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70  * The sqlite3Exp
2420: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 20  rResolveNames() 
2430: 72 6f 75 74 69 6e 65 73 20 6c 6f 6f 6b 73 20 66  routines looks f
2440: 6f 72 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  or column names 
2450: 61 6e 64 0a 2a 2a 20 73 65 74 73 20 74 68 65 69  and.** sets thei
2460: 72 20 6f 70 63 6f 64 65 73 20 74 6f 20 54 4b 5f  r opcodes to TK_
2470: 43 4f 4c 55 4d 4e 20 61 6e 64 20 74 68 65 69 72  COLUMN and their
2480: 20 45 78 70 72 2e 69 54 61 62 6c 65 20 66 69 65   Expr.iTable fie
2490: 6c 64 73 20 74 6f 0a 2a 2a 20 74 68 65 20 56 44  lds to.** the VD
24a0: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
24b0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
24c0: 2f 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b  /.static Bitmask
24d0: 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73   exprListTableUs
24e0: 61 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20  age(ExprMaskSet 
24f0: 2a 2c 20 45 78 70 72 4c 69 73 74 20 2a 29 3b 0a  *, ExprList *);.
2500: 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20 65  static Bitmask e
2510: 78 70 72 54 61 62 6c 65 55 73 61 67 65 28 45 78  xprTableUsage(Ex
2520: 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61 73 6b  prMaskSet *pMask
2530: 53 65 74 2c 20 45 78 70 72 20 2a 70 29 7b 0a 20  Set, Expr *p){. 
2540: 20 42 69 74 6d 61 73 6b 20 6d 61 73 6b 20 3d 20   Bitmask mask = 
2550: 30 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  0;.  if( p==0 ) 
2560: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
2570: 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  p->op==TK_COLUMN
2580: 20 29 7b 0a 20 20 20 20 6d 61 73 6b 20 3d 20 67   ){.    mask = g
2590: 65 74 4d 61 73 6b 28 70 4d 61 73 6b 53 65 74 2c  etMask(pMaskSet,
25a0: 20 70 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20   p->iTable);.   
25b0: 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 20 20   return mask;.  
25c0: 7d 0a 20 20 6d 61 73 6b 20 3d 20 65 78 70 72 54  }.  mask = exprT
25d0: 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53  ableUsage(pMaskS
25e0: 65 74 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a  et, p->pRight);.
25f0: 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61    mask |= exprTa
2600: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2610: 74 2c 20 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  t, p->pLeft);.  
2620: 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c 69 73 74  mask |= exprList
2630: 54 61 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b  TableUsage(pMask
2640: 53 65 74 2c 20 70 2d 3e 70 4c 69 73 74 29 3b 0a  Set, p->pList);.
2650: 20 20 69 66 28 20 70 2d 3e 70 53 65 6c 65 63 74    if( p->pSelect
2660: 20 29 7b 0a 20 20 20 20 53 65 6c 65 63 74 20 2a   ){.    Select *
2670: 70 53 20 3d 20 70 2d 3e 70 53 65 6c 65 63 74 3b  pS = p->pSelect;
2680: 0a 20 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70  .    mask |= exp
2690: 72 4c 69 73 74 54 61 62 6c 65 55 73 61 67 65 28  rListTableUsage(
26a0: 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 45  pMaskSet, pS->pE
26b0: 4c 69 73 74 29 3b 0a 20 20 20 20 6d 61 73 6b 20  List);.    mask 
26c0: 7c 3d 20 65 78 70 72 4c 69 73 74 54 61 62 6c 65  |= exprListTable
26d0: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
26e0: 70 53 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  pS->pGroupBy);. 
26f0: 20 20 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 4c     mask |= exprL
2700: 69 73 74 54 61 62 6c 65 55 73 61 67 65 28 70 4d  istTableUsage(pM
2710: 61 73 6b 53 65 74 2c 20 70 53 2d 3e 70 4f 72 64  askSet, pS->pOrd
2720: 65 72 42 79 29 3b 0a 20 20 20 20 6d 61 73 6b 20  erBy);.    mask 
2730: 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73 61 67  |= exprTableUsag
2740: 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53 2d 3e  e(pMaskSet, pS->
2750: 70 57 68 65 72 65 29 3b 0a 20 20 20 20 6d 61 73  pWhere);.    mas
2760: 6b 20 7c 3d 20 65 78 70 72 54 61 62 6c 65 55 73  k |= exprTableUs
2770: 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20 70 53  age(pMaskSet, pS
2780: 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 7d 0a  ->pHaving);.  }.
2790: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
27a0: 0a 73 74 61 74 69 63 20 42 69 74 6d 61 73 6b 20  .static Bitmask 
27b0: 65 78 70 72 4c 69 73 74 54 61 62 6c 65 55 73 61  exprListTableUsa
27c0: 67 65 28 45 78 70 72 4d 61 73 6b 53 65 74 20 2a  ge(ExprMaskSet *
27d0: 70 4d 61 73 6b 53 65 74 2c 20 45 78 70 72 4c 69  pMaskSet, ExprLi
27e0: 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e  st *pList){.  in
27f0: 74 20 69 3b 0a 20 20 42 69 74 6d 61 73 6b 20 6d  t i;.  Bitmask m
2800: 61 73 6b 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  ask = 0;.  if( p
2810: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
2820: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2830: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2840: 20 6d 61 73 6b 20 7c 3d 20 65 78 70 72 54 61 62   mask |= exprTab
2850: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2860: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
2870: 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  xpr);.    }.  }.
2880: 20 20 72 65 74 75 72 6e 20 6d 61 73 6b 3b 0a 7d    return mask;.}
2890: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
28a0: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
28b0: 20 6f 70 65 72 61 74 6f 72 20 69 73 20 6f 6e 65   operator is one
28c0: 20 6f 66 20 74 68 65 20 6f 70 65 72 61 74 6f 72   of the operator
28d0: 73 20 74 68 61 74 20 69 73 0a 2a 2a 20 61 6c 6c  s that is.** all
28e0: 6f 77 65 64 20 66 6f 72 20 61 6e 20 69 6e 64 65  owed for an inde
28f0: 78 61 62 6c 65 20 57 48 45 52 45 20 63 6c 61 75  xable WHERE clau
2900: 73 65 20 74 65 72 6d 2e 20 20 54 68 65 20 61 6c  se term.  The al
2910: 6c 6f 77 65 64 20 6f 70 65 72 61 74 6f 72 73 20  lowed operators 
2920: 61 72 65 0a 2a 2a 20 22 3d 22 2c 20 22 3c 22 2c  are.** "=", "<",
2930: 20 22 3e 22 2c 20 22 3c 3d 22 2c 20 22 3e 3d 22   ">", "<=", ">="
2940: 2c 20 61 6e 64 20 22 49 4e 22 2e 0a 2a 2f 0a 73  , and "IN"..*/.s
2950: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 77 65  tatic int allowe
2960: 64 4f 70 28 69 6e 74 20 6f 70 29 7b 0a 20 20 61  dOp(int op){.  a
2970: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 54 4b  ssert( TK_GT==TK
2980: 5f 4c 45 2d 31 20 26 26 20 54 4b 5f 4c 45 3d 3d  _LE-1 && TK_LE==
2990: 54 4b 5f 4c 54 2d 31 20 26 26 20 54 4b 5f 4c 54  TK_LT-1 && TK_LT
29a0: 3d 3d 54 4b 5f 47 45 2d 31 20 26 26 20 54 4b 5f  ==TK_GE-1 && TK_
29b0: 45 51 3d 3d 54 4b 5f 47 54 2d 31 29 3b 0a 20 20  EQ==TK_GT-1);.  
29c0: 72 65 74 75 72 6e 20 6f 70 3d 3d 54 4b 5f 49 4e  return op==TK_IN
29d0: 20 7c 7c 20 28 6f 70 3e 3d 54 4b 5f 45 51 20 26   || (op>=TK_EQ &
29e0: 26 20 6f 70 3c 3d 54 4b 5f 47 45 29 3b 0a 7d 0a  & op<=TK_GE);.}.
29f0: 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 77 6f 20  ./*.** Swap two 
2a00: 6f 62 6a 65 63 74 73 20 6f 66 20 74 79 70 65 20  objects of type 
2a10: 54 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 57  T..*/.#define SW
2a20: 41 50 28 54 59 50 45 2c 41 2c 42 29 20 7b 54 59  AP(TYPE,A,B) {TY
2a30: 50 45 20 74 3d 41 3b 20 41 3d 42 3b 20 42 3d 74  PE t=A; A=B; B=t
2a40: 3b 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ;}../*.** Return
2a50: 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 74 68   the index in th
2a60: 65 20 53 72 63 4c 69 73 74 20 74 68 61 74 20 75  e SrcList that u
2a70: 73 65 73 20 63 75 72 73 6f 72 20 69 43 75 72 2e  ses cursor iCur.
2a80: 20 20 49 66 20 69 43 75 72 20 69 73 0a 2a 2a 20    If iCur is.** 
2a90: 75 73 65 64 20 62 79 20 74 68 65 20 66 69 72 73  used by the firs
2aa0: 74 20 65 6e 74 72 79 20 69 6e 20 53 72 63 4c 69  t entry in SrcLi
2ab0: 73 74 20 72 65 74 75 72 6e 20 30 2e 20 20 49 66  st return 0.  If
2ac0: 20 69 43 75 72 20 69 73 20 75 73 65 64 20 62 79   iCur is used by
2ad0: 0a 2a 2a 20 74 68 65 20 73 65 63 6f 6e 64 20 65  .** the second e
2ae0: 6e 74 72 79 20 72 65 74 75 72 6e 20 31 2e 20 20  ntry return 1.  
2af0: 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a  And so forth..**
2b00: 0a 2a 2a 20 53 72 63 4c 69 73 74 20 69 73 20 74  .** SrcList is t
2b10: 68 65 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  he set of tables
2b20: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
2b30: 75 73 65 20 69 6e 20 74 68 65 20 6f 72 64 65 72  use in the order
2b40: 20 74 68 61 74 0a 2a 2a 20 74 68 65 79 20 77 69   that.** they wi
2b50: 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64 2e  ll be processed.
2b60: 20 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75    The value retu
2b70: 72 6e 65 64 20 68 65 72 65 20 67 69 76 65 73 20  rned here gives 
2b80: 75 73 20 61 6e 20 69 6e 64 65 78 0a 2a 2a 20 6f  us an index.** o
2b90: 66 20 77 68 69 63 68 20 74 61 62 6c 65 73 20 77  f which tables w
2ba0: 69 6c 6c 20 62 65 20 70 72 6f 63 65 73 73 65 64  ill be processed
2bb0: 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 61 74 69   first..*/.stati
2bc0: 63 20 69 6e 74 20 74 61 62 6c 65 4f 72 64 65 72  c int tableOrder
2bd0: 28 53 72 63 4c 69 73 74 20 2a 70 4c 69 73 74 2c  (SrcList *pList,
2be0: 20 69 6e 74 20 69 43 75 72 29 7b 0a 20 20 69 6e   int iCur){.  in
2bf0: 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 53 72  t i;.  struct Sr
2c00: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
2c10: 6d 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  m;.  for(i=0, pI
2c20: 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69 3c  tem=pList->a; i<
2c30: 70 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  pList->nSrc; i++
2c40: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2c50: 69 66 28 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  if( pItem->iCurs
2c60: 6f 72 3d 3d 69 43 75 72 20 29 20 72 65 74 75 72  or==iCur ) retur
2c70: 6e 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n i;.  }.  retur
2c80: 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n -1;.}../*.** T
2c90: 68 65 20 69 6e 70 75 74 20 74 6f 20 74 68 69 73  he input to this
2ca0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 57   routine is an W
2cb0: 68 65 72 65 54 65 72 6d 20 73 74 72 75 63 74 75  hereTerm structu
2cc0: 72 65 20 77 69 74 68 20 6f 6e 6c 79 20 74 68 65  re with only the
2cd0: 0a 2a 2a 20 22 70 22 20 66 69 65 6c 64 20 66 69  .** "p" field fi
2ce0: 6c 6c 65 64 20 69 6e 2e 20 20 54 68 65 20 6a 6f  lled in.  The jo
2cf0: 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
2d00: 65 20 69 73 20 74 6f 20 61 6e 61 6c 79 7a 65 20  e is to analyze 
2d10: 74 68 65 0a 2a 2a 20 73 75 62 65 78 70 72 65 73  the.** subexpres
2d20: 73 69 6f 6e 20 61 6e 64 20 70 6f 70 75 6c 61 74  sion and populat
2d30: 65 20 61 6c 6c 20 74 68 65 20 6f 74 68 65 72 20  e all the other 
2d40: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 57 68  fields of the Wh
2d50: 65 72 65 54 65 72 6d 0a 2a 2a 20 73 74 72 75 63  ereTerm.** struc
2d60: 74 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ture..*/.static 
2d70: 76 6f 69 64 20 65 78 70 72 41 6e 61 6c 79 7a 65  void exprAnalyze
2d80: 28 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20  (SrcList *pSrc, 
2d90: 45 78 70 72 4d 61 73 6b 53 65 74 20 2a 70 4d 61  ExprMaskSet *pMa
2da0: 73 6b 53 65 74 2c 20 57 68 65 72 65 54 65 72 6d  skSet, WhereTerm
2db0: 20 2a 70 49 6e 66 6f 29 7b 0a 20 20 45 78 70 72   *pInfo){.  Expr
2dc0: 20 2a 70 45 78 70 72 20 3d 20 70 49 6e 66 6f 2d   *pExpr = pInfo-
2dd0: 3e 70 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 72 65  >p;.  pInfo->pre
2de0: 72 65 71 4c 65 66 74 20 3d 20 65 78 70 72 54 61  reqLeft = exprTa
2df0: 62 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65  bleUsage(pMaskSe
2e00: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
2e10: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 72 65 72 65  ;.  pInfo->prere
2e20: 71 52 69 67 68 74 20 3d 20 65 78 70 72 54 61 62  qRight = exprTab
2e30: 6c 65 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74  leUsage(pMaskSet
2e40: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
2e50: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 70 72 65 72 65  ;.  pInfo->prere
2e60: 71 41 6c 6c 20 3d 20 65 78 70 72 54 61 62 6c 65  qAll = exprTable
2e70: 55 73 61 67 65 28 70 4d 61 73 6b 53 65 74 2c 20  Usage(pMaskSet, 
2e80: 70 45 78 70 72 29 3b 0a 20 20 70 49 6e 66 6f 2d  pExpr);.  pInfo-
2e90: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 30 3b 0a  >indexable = 0;.
2ea0: 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4c 65 66 74    pInfo->idxLeft
2eb0: 20 3d 20 2d 31 3b 0a 20 20 70 49 6e 66 6f 2d 3e   = -1;.  pInfo->
2ec0: 69 64 78 52 69 67 68 74 20 3d 20 2d 31 3b 0a 20  idxRight = -1;. 
2ed0: 20 69 66 28 20 61 6c 6c 6f 77 65 64 4f 70 28 70   if( allowedOp(p
2ee0: 45 78 70 72 2d 3e 6f 70 29 20 26 26 20 28 70 49  Expr->op) && (pI
2ef0: 6e 66 6f 2d 3e 70 72 65 72 65 71 52 69 67 68 74  nfo->prereqRight
2f00: 20 26 20 70 49 6e 66 6f 2d 3e 70 72 65 72 65 71   & pInfo->prereq
2f10: 4c 65 66 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Left)==0 ){.    
2f20: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
2f30: 74 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  t && pExpr->pRig
2f40: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d  ht->op==TK_COLUM
2f50: 4e 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f  N ){.      pInfo
2f60: 2d 3e 69 64 78 52 69 67 68 74 20 3d 20 70 45 78  ->idxRight = pEx
2f70: 70 72 2d 3e 70 52 69 67 68 74 2d 3e 69 54 61 62  pr->pRight->iTab
2f80: 6c 65 3b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  le;.      pInfo-
2f90: 3e 69 6e 64 65 78 61 62 6c 65 20 3d 20 31 3b 0a  >indexable = 1;.
2fa0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 45      }.    if( pE
2fb0: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  xpr->pLeft->op==
2fc0: 54 4b 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20  TK_COLUMN ){.   
2fd0: 20 20 20 70 49 6e 66 6f 2d 3e 69 64 78 4c 65 66     pInfo->idxLef
2fe0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
2ff0: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20  ->iTable;.      
3000: 70 49 6e 66 6f 2d 3e 69 6e 64 65 78 61 62 6c 65  pInfo->indexable
3010: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
3020: 20 20 69 66 28 20 70 49 6e 66 6f 2d 3e 69 6e 64    if( pInfo->ind
3030: 65 78 61 62 6c 65 20 29 7b 0a 20 20 20 20 61 73  exable ){.    as
3040: 73 65 72 74 28 20 70 49 6e 66 6f 2d 3e 69 64 78  sert( pInfo->idx
3050: 4c 65 66 74 21 3d 70 49 6e 66 6f 2d 3e 69 64 78  Left!=pInfo->idx
3060: 52 69 67 68 74 20 29 3b 0a 0a 20 20 20 20 2f 2a  Right );..    /*
3070: 20 57 65 20 77 61 6e 74 20 74 68 65 20 65 78 70   We want the exp
3080: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 6f 66  ression to be of
3090: 20 74 68 65 20 66 6f 72 6d 20 22 58 20 3d 20 65   the form "X = e
30a0: 78 70 72 22 2c 20 6e 6f 74 20 22 65 78 70 72 20  xpr", not "expr 
30b0: 3d 20 58 22 2e 0a 20 20 20 20 2a 2a 20 53 6f 20  = X"..    ** So 
30c0: 66 6c 69 70 20 69 74 20 6f 76 65 72 20 69 66 20  flip it over if 
30d0: 6e 65 63 65 73 73 61 72 79 2e 20 20 49 66 20 74  necessary.  If t
30e0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
30f0: 20 22 58 20 3d 20 59 22 2c 20 74 68 65 6e 0a 20   "X = Y", then. 
3100: 20 20 20 2a 2a 20 77 65 20 77 61 6e 74 20 59 20     ** we want Y 
3110: 74 6f 20 63 6f 6d 65 20 66 72 6f 6d 20 61 6e 20  to come from an 
3120: 65 61 72 6c 69 65 72 20 74 61 62 6c 65 20 74 68  earlier table th
3130: 61 6e 20 58 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  an X..    **.   
3140: 20 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e   ** The collatin
3150: 67 20 73 65 71 75 65 6e 63 65 20 72 75 6c 65 20  g sequence rule 
3160: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 63 68 6f  is to always cho
3170: 6f 73 65 20 74 68 65 20 6c 65 66 74 20 65 78 70  ose the left exp
3180: 72 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20  ression..    ** 
3190: 53 6f 20 69 66 20 77 65 20 64 6f 20 61 20 66 6c  So if we do a fl
31a0: 69 70 2c 20 77 65 20 61 6c 73 6f 20 68 61 76 65  ip, we also have
31b0: 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 63 6f 6c   to move the col
31c0: 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 2e  lating sequence.
31d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
31e0: 74 61 62 6c 65 4f 72 64 65 72 28 70 53 72 63 2c  tableOrder(pSrc,
31f0: 70 49 6e 66 6f 2d 3e 69 64 78 4c 65 66 74 29 3c  pInfo->idxLeft)<
3200: 74 61 62 6c 65 4f 72 64 65 72 28 70 53 72 63 2c  tableOrder(pSrc,
3210: 70 49 6e 66 6f 2d 3e 69 64 78 52 69 67 68 74 29  pInfo->idxRight)
3220: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
3230: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
3240: 49 4e 20 29 3b 0a 20 20 20 20 20 20 53 57 41 50  IN );.      SWAP
3250: 28 43 6f 6c 6c 53 65 71 2a 2c 70 45 78 70 72 2d  (CollSeq*,pExpr-
3260: 3e 70 52 69 67 68 74 2d 3e 70 43 6f 6c 6c 2c 70  >pRight->pColl,p
3270: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f  Expr->pLeft->pCo
3280: 6c 6c 29 3b 0a 20 20 20 20 20 20 53 57 41 50 28  ll);.      SWAP(
3290: 45 78 70 72 2a 2c 70 45 78 70 72 2d 3e 70 52 69  Expr*,pExpr->pRi
32a0: 67 68 74 2c 70 45 78 70 72 2d 3e 70 4c 65 66 74  ght,pExpr->pLeft
32b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
32c0: 70 72 2d 3e 6f 70 3e 3d 54 4b 5f 47 54 20 29 7b  pr->op>=TK_GT ){
32d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
32e0: 20 54 4b 5f 4c 54 3d 3d 54 4b 5f 47 54 2b 32 20   TK_LT==TK_GT+2 
32f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3300: 74 28 20 54 4b 5f 47 45 3d 3d 54 4b 5f 4c 45 2b  t( TK_GE==TK_LE+
3310: 32 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  2 );.        ass
3320: 65 72 74 28 20 54 4b 5f 47 54 3e 54 4b 5f 45 51  ert( TK_GT>TK_EQ
3330: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
3340: 72 74 28 20 54 4b 5f 47 54 3c 54 4b 5f 4c 45 20  rt( TK_GT<TK_LE 
3350: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3360: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3e 3d 54 4b  t( pExpr->op>=TK
3370: 5f 47 54 20 26 26 20 70 45 78 70 72 2d 3e 6f 70  _GT && pExpr->op
3380: 3c 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20  <=TK_GE );.     
3390: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 28     pExpr->op = (
33a0: 28 70 45 78 70 72 2d 3e 6f 70 2d 54 4b 5f 47 54  (pExpr->op-TK_GT
33b0: 29 5e 32 29 2b 54 4b 5f 47 54 3b 0a 20 20 20 20  )^2)+TK_GT;.    
33c0: 20 20 7d 0a 20 20 20 20 20 20 53 57 41 50 28 75    }.      SWAP(u
33d0: 6e 73 69 67 6e 65 64 2c 20 70 49 6e 66 6f 2d 3e  nsigned, pInfo->
33e0: 70 72 65 72 65 71 4c 65 66 74 2c 20 70 49 6e 66  prereqLeft, pInf
33f0: 6f 2d 3e 70 72 65 72 65 71 52 69 67 68 74 29 3b  o->prereqRight);
3400: 0a 20 20 20 20 20 20 53 57 41 50 28 73 68 6f 72  .      SWAP(shor
3410: 74 20 69 6e 74 2c 20 70 49 6e 66 6f 2d 3e 69 64  t int, pInfo->id
3420: 78 4c 65 66 74 2c 20 70 49 6e 66 6f 2d 3e 69 64  xLeft, pInfo->id
3430: 78 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  xRight);.    }. 
3440: 20 7d 20 20 20 20 20 20 0a 0a 7d 0a 0a 2f 2a 0a   }      ..}../*.
3450: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3460: 64 65 63 69 64 65 73 20 69 66 20 70 49 64 78 20  decides if pIdx 
3470: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 73  can be used to s
3480: 61 74 69 73 66 79 20 74 68 65 20 4f 52 44 45 52  atisfy the ORDER
3490: 20 42 59 0a 2a 2a 20 63 6c 61 75 73 65 2e 20 20   BY.** clause.  
34a0: 49 66 20 69 74 20 63 61 6e 2c 20 69 74 20 72 65  If it can, it re
34b0: 74 75 72 6e 73 20 31 2e 20 20 49 66 20 70 49 64  turns 1.  If pId
34c0: 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73 66 79  x cannot satisfy
34d0: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
34e0: 20 63 6c 61 75 73 65 2c 20 74 68 69 73 20 72 6f   clause, this ro
34f0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
3500: 0a 2a 2a 0a 2a 2a 20 70 4f 72 64 65 72 42 79 20  .**.** pOrderBy 
3510: 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59 20 63  is an ORDER BY c
3520: 6c 61 75 73 65 20 66 72 6f 6d 20 61 20 53 45 4c  lause from a SEL
3530: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
3540: 70 54 61 62 20 69 73 20 74 68 65 0a 2a 2a 20 6c  pTab is the.** l
3550: 65 66 74 2d 6d 6f 73 74 20 74 61 62 6c 65 20 69  eft-most table i
3560: 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73  n the FROM claus
3570: 65 20 6f 66 20 74 68 61 74 20 73 61 6d 65 20 53  e of that same S
3580: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
3590: 61 6e 64 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65  and.** the table
35a0: 20 68 61 73 20 61 20 63 75 72 73 6f 72 20 6e 75   has a cursor nu
35b0: 6d 62 65 72 20 6f 66 20 22 62 61 73 65 22 2e 20  mber of "base". 
35c0: 20 70 49 64 78 20 69 73 20 61 6e 20 69 6e 64 65   pIdx is an inde
35d0: 78 20 6f 6e 20 70 54 61 62 2e 0a 2a 2a 0a 2a 2a  x on pTab..**.**
35e0: 20 6e 45 71 43 6f 6c 20 69 73 20 74 68 65 20 6e   nEqCol is the n
35f0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
3600: 20 6f 66 20 70 49 64 78 20 74 68 61 74 20 61 72   of pIdx that ar
3610: 65 20 75 73 65 64 20 61 73 20 65 71 75 61 6c 69  e used as equali
3620: 74 79 0a 2a 2a 20 63 6f 6e 73 74 72 61 69 6e 74  ty.** constraint
3630: 73 2e 20 20 41 6e 79 20 6f 66 20 74 68 65 73 65  s.  Any of these
3640: 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 20   columns may be 
3650: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 74 68 65  missing from the
3660: 20 4f 52 44 45 52 20 42 59 0a 2a 2a 20 63 6c 61   ORDER BY.** cla
3670: 75 73 65 20 61 6e 64 20 74 68 65 20 6d 61 74 63  use and the matc
3680: 68 20 63 61 6e 20 73 74 69 6c 6c 20 62 65 20 61  h can still be a
3690: 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
36a0: 49 66 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  If the index is 
36b0: 55 4e 49 51 55 45 2c 20 74 68 65 6e 20 74 68 65  UNIQUE, then the
36c0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
36d0: 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 68   is allowed to h
36e0: 61 76 65 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  ave.** additiona
36f0: 6c 20 74 65 72 6d 73 20 70 61 73 74 20 74 68 65  l terms past the
3700: 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
3710: 78 20 61 6e 64 20 74 68 65 20 6d 61 74 63 68 20  x and the match 
3720: 77 69 6c 6c 20 73 74 69 6c 6c 0a 2a 2a 20 62 65  will still.** be
3730: 20 61 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a   a success..**.*
3740: 2a 20 41 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74  * All terms of t
3750: 68 65 20 4f 52 44 45 52 20 42 59 20 74 68 61 74  he ORDER BY that
3760: 20 6d 61 74 63 68 20 61 67 61 69 6e 73 74 20 74   match against t
3770: 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
3780: 20 65 69 74 68 65 72 0a 2a 2a 20 41 53 43 20 6f   either.** ASC o
3790: 72 20 44 45 53 43 2e 20 20 28 54 65 72 6d 73 20  r DESC.  (Terms 
37a0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
37b0: 63 6c 61 75 73 65 20 70 61 73 74 20 74 68 65 20  clause past the 
37c0: 65 6e 64 20 6f 66 20 61 20 55 4e 49 51 55 45 0a  end of a UNIQUE.
37d0: 2a 2a 20 69 6e 64 65 78 20 64 6f 20 6e 6f 74 20  ** index do not 
37e0: 6e 65 65 64 20 74 6f 20 73 61 74 69 73 66 79 20  need to satisfy 
37f0: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 2e  this constraint.
3800: 29 20 20 54 68 65 20 2a 70 62 52 65 76 20 76 61  )  The *pbRev va
3810: 6c 75 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  lue is.** set to
3820: 20 31 20 69 66 20 74 68 65 20 4f 52 44 45 52 20   1 if the ORDER 
3830: 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 6c 6c  BY clause is all
3840: 20 44 45 53 43 20 61 6e 64 20 69 74 20 69 73 20   DESC and it is 
3850: 73 65 74 20 74 6f 20 30 20 69 66 0a 2a 2a 20 74  set to 0 if.** t
3860: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
3870: 73 65 20 69 73 20 61 6c 6c 20 41 53 43 2e 0a 2a  se is all ASC..*
3880: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 53  /.static int isS
3890: 6f 72 74 69 6e 67 49 6e 64 65 78 28 0a 20 20 50  ortingIndex(.  P
38a0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
38b0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
38c0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 49  g context */.  I
38d0: 6e 64 65 78 20 2a 70 49 64 78 2c 20 20 20 20 20  ndex *pIdx,     
38e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
38f0: 64 65 78 20 77 65 20 61 72 65 20 74 65 73 74 69  dex we are testi
3900: 6e 67 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ng */.  Table *p
3910: 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  Tab,            
3920: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 74 6f 20  /* The table to 
3930: 62 65 20 73 6f 72 74 65 64 20 2a 2f 0a 20 20 69  be sorted */.  i
3940: 6e 74 20 62 61 73 65 2c 20 20 20 20 20 20 20 20  nt base,        
3950: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72         /* Cursor
3960: 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 54 61 62   number for pTab
3970: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
3980: 70 4f 72 64 65 72 42 79 2c 20 20 20 20 20 2f 2a  pOrderBy,     /*
3990: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
39a0: 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ause */.  int nE
39b0: 71 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  qCol,           
39c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
39d0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 77 69 74  ndex columns wit
39e0: 68 20 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73  h == constraints
39f0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 52 65 76   */.  int *pbRev
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3a10: 20 53 65 74 20 74 6f 20 31 20 69 66 20 4f 52 44   Set to 1 if ORD
3a20: 45 52 20 42 59 20 69 73 20 44 45 53 43 20 2a 2f  ER BY is DESC */
3a30: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
3a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a50: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
3a60: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 73 6f 72  ers */.  int sor
3a70: 74 4f 72 64 65 72 3b 20 20 20 20 20 20 20 20 20  tOrder;         
3a80: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 64        /* Which d
3a90: 69 72 65 63 74 69 6f 6e 20 77 65 20 61 72 65 20  irection we are 
3aa0: 73 6f 72 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  sorting */.  int
3ab0: 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
3ac0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ad0: 62 65 72 20 6f 66 20 4f 52 44 45 52 20 42 59 20  ber of ORDER BY 
3ae0: 74 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  terms */.  struc
3af0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
3b00: 2a 70 54 65 72 6d 3b 20 2f 2a 20 41 20 74 65 72  *pTerm; /* A ter
3b10: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
3b20: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 73 71  Y clause */.  sq
3b30: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
3b40: 73 65 2d 3e 64 62 3b 0a 0a 20 20 61 73 73 65 72  se->db;..  asser
3b50: 74 28 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29  t( pOrderBy!=0 )
3b60: 3b 0a 20 20 6e 54 65 72 6d 20 3d 20 70 4f 72 64  ;.  nTerm = pOrd
3b70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 0a 20 20 61  erBy->nExpr;.  a
3b80: 73 73 65 72 74 28 20 6e 54 65 72 6d 3e 30 20 29  ssert( nTerm>0 )
3b90: 3b 0a 0a 20 20 2f 2a 20 4d 61 74 63 68 20 74 65  ;..  /* Match te
3ba0: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
3bb0: 20 42 59 20 63 6c 61 75 73 65 20 61 67 61 69 6e   BY clause again
3bc0: 73 74 20 63 6f 6c 75 6d 6e 73 20 6f 66 0a 20 20  st columns of.  
3bd0: 2a 2a 20 74 68 65 20 69 6e 64 65 78 2e 0a 20 20  ** the index..  
3be0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 2c 20  */.  for(i=j=0, 
3bf0: 70 54 65 72 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pTerm=pOrderBy->
3c00: 61 3b 20 6a 3c 6e 54 65 72 6d 20 26 26 20 69 3c  a; j<nTerm && i<
3c10: 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 69  pIdx->nColumn; i
3c20: 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70  ++){.    Expr *p
3c30: 45 78 70 72 3b 20 20 20 20 20 20 20 2f 2a 20 54  Expr;       /* T
3c40: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 66  he expression of
3c50: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 70 54   the ORDER BY pT
3c60: 65 72 6d 20 2a 2f 0a 20 20 20 20 43 6f 6c 6c 53  erm */.    CollS
3c70: 65 71 20 2a 70 43 6f 6c 6c 3b 20 20 20 20 2f 2a  eq *pColl;    /*
3c80: 20 54 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 73   The collating s
3c90: 65 71 75 65 6e 63 65 20 6f 66 20 70 45 78 70 72  equence of pExpr
3ca0: 20 2a 2f 0a 0a 20 20 20 20 70 45 78 70 72 20 3d   */..    pExpr =
3cb0: 20 70 54 65 72 6d 2d 3e 70 45 78 70 72 3b 0a 20   pTerm->pExpr;. 
3cc0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70     if( pExpr->op
3cd0: 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 70  !=TK_COLUMN || p
3ce0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 21 3d 62 61  Expr->iTable!=ba
3cf0: 73 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43  se ){.      /* C
3d00: 61 6e 20 6e 6f 74 20 75 73 65 20 61 6e 20 69 6e  an not use an in
3d10: 64 65 78 20 73 6f 72 74 20 6f 6e 20 61 6e 79 74  dex sort on anyt
3d20: 68 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74  hing that is not
3d30: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65   a column in the
3d40: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 66 74 2d 6d  .      ** left-m
3d50: 6f 73 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ost table of the
3d60: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 2a 2f 0a   FROM clause */.
3d70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
3d80: 20 20 20 20 7d 0a 20 20 20 20 70 43 6f 6c 6c 20      }.    pColl 
3d90: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
3da0: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
3db0: 70 72 29 3b 0a 20 20 20 20 69 66 28 20 21 70 43  pr);.    if( !pC
3dc0: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 64 62  oll ) pColl = db
3dd0: 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20  ->pDfltColl;.   
3de0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
3df0: 75 6d 6e 21 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn!=pIdx->aiCol
3e00: 75 6d 6e 5b 69 5d 20 7c 7c 20 70 43 6f 6c 6c 21  umn[i] || pColl!
3e10: 3d 70 49 64 78 2d 3e 6b 65 79 49 6e 66 6f 2e 61  =pIdx->keyInfo.a
3e20: 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20  Coll[i] ){.     
3e30: 20 2f 2a 20 54 65 72 6d 20 6a 20 6f 66 20 74 68   /* Term j of th
3e40: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
3e50: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
3e60: 20 63 6f 6c 75 6d 6e 20 69 20 6f 66 20 74 68 65   column i of the
3e70: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
3e80: 69 66 28 20 69 3c 6e 45 71 43 6f 6c 20 29 7b 0a  if( i<nEqCol ){.
3e90: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
3ea0: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 74 68   index column th
3eb0: 61 74 20 69 73 20 63 6f 6e 73 74 72 61 69 6e 65  at is constraine
3ec0: 64 20 62 79 20 3d 3d 20 66 61 69 6c 73 20 74 6f  d by == fails to
3ed0: 20 6d 61 74 63 68 20 61 6e 0a 20 20 20 20 20 20   match an.      
3ee0: 20 20 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65    ** ORDER BY te
3ef0: 72 6d 2c 20 74 68 61 74 20 69 73 20 4f 4b 2e 20  rm, that is OK. 
3f00: 20 4a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 61   Just ignore tha
3f10: 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  t column of the 
3f20: 69 6e 64 65 78 0a 20 20 20 20 20 20 20 20 2a 2f  index.        */
3f30: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
3f40: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  e;.      }else{.
3f50: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
3f60: 20 69 6e 64 65 78 20 63 6f 6c 75 6d 6e 20 66 61   index column fa
3f70: 69 6c 73 20 74 6f 20 6d 61 74 63 68 20 61 6e 64  ils to match and
3f80: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 74 72 61 69   is not constrai
3f90: 6e 65 64 20 62 79 20 3d 3d 0a 20 20 20 20 20 20  ned by ==.      
3fa0: 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 69 6e    ** then the in
3fb0: 64 65 78 20 63 61 6e 6e 6f 74 20 73 61 74 69 73  dex cannot satis
3fc0: 66 79 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  fy the ORDER BY 
3fd0: 63 6f 6e 73 74 72 61 69 6e 74 2e 0a 20 20 20 20  constraint..    
3fe0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
3ff0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
4000: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
4010: 3e 6e 45 71 43 6f 6c 20 29 7b 0a 20 20 20 20 20  >nEqCol ){.     
4020: 20 69 66 28 20 70 54 65 72 6d 2d 3e 73 6f 72 74   if( pTerm->sort
4030: 4f 72 64 65 72 21 3d 73 6f 72 74 4f 72 64 65 72  Order!=sortOrder
4040: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49   ){.        /* I
4050: 6e 64 69 63 65 73 20 63 61 6e 20 6f 6e 6c 79 20  ndices can only 
4060: 62 65 20 75 73 65 64 20 69 66 20 61 6c 6c 20 4f  be used if all O
4070: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 70 61  RDER BY terms pa
4080: 73 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  st the.        *
4090: 2a 20 65 71 75 61 6c 69 74 79 20 63 6f 6e 73 74  * equality const
40a0: 72 61 69 6e 74 73 20 61 72 65 20 61 6c 6c 20 65  raints are all e
40b0: 69 74 68 65 72 20 44 45 53 43 20 6f 72 20 41 53  ither DESC or AS
40c0: 43 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  C. */.        re
40d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
40e0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
40f0: 20 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 54 65   sortOrder = pTe
4100: 72 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  rm->sortOrder;. 
4110: 20 20 20 7d 0a 20 20 20 20 6a 2b 2b 3b 0a 20 20     }.    j++;.  
4120: 20 20 70 54 65 72 6d 2b 2b 3b 0a 20 20 7d 0a 0a    pTerm++;.  }..
4130: 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 63    /* The index c
4140: 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20 73  an be used for s
4150: 6f 72 74 69 6e 67 20 69 66 20 61 6c 6c 20 74 65  orting if all te
4160: 72 6d 73 20 6f 66 20 74 68 65 20 4f 52 44 45 52  rms of the ORDER
4170: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 2a 2a 20   BY clause.  ** 
4180: 6f 72 20 63 6f 76 65 72 65 64 20 6f 72 20 69 66  or covered or if
4190: 20 77 65 20 72 61 6e 20 6f 75 74 20 6f 66 20 69   we ran out of i
41a0: 6e 64 65 78 20 63 6f 6c 75 6d 6e 73 20 61 6e 64  ndex columns and
41b0: 20 74 68 65 20 69 74 20 69 73 20 61 20 55 4e 49   the it is a UNI
41c0: 51 55 45 0a 20 20 2a 2a 20 69 6e 64 65 78 2e 0a  QUE.  ** index..
41d0: 20 20 2a 2f 0a 20 20 69 66 28 20 6a 3e 3d 6e 54    */.  if( j>=nT
41e0: 65 72 6d 20 7c 7c 20 28 69 3e 3d 70 49 64 78 2d  erm || (i>=pIdx-
41f0: 3e 6e 43 6f 6c 75 6d 6e 20 26 26 20 70 49 64 78  >nColumn && pIdx
4200: 2d 3e 6f 6e 45 72 72 6f 72 21 3d 4f 45 5f 4e 6f  ->onError!=OE_No
4210: 6e 65 29 20 29 7b 0a 20 20 20 20 2a 70 62 52 65  ne) ){.    *pbRe
4220: 76 20 3d 20 73 6f 72 74 4f 72 64 65 72 3d 3d 53  v = sortOrder==S
4230: 51 4c 49 54 45 5f 53 4f 5f 44 45 53 43 3b 0a 20  QLITE_SO_DESC;. 
4240: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
4250: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4260: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 61 62 6c  /*.** Check tabl
4270: 65 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  e to see if the 
4280: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
4290: 69 6e 20 70 4f 72 64 65 72 42 79 20 63 61 6e 20  in pOrderBy can 
42a0: 62 65 20 73 61 74 69 73 66 69 65 64 0a 2a 2a 20  be satisfied.** 
42b0: 62 79 20 73 6f 72 74 69 6e 67 20 69 6e 20 6f 72  by sorting in or
42c0: 64 65 72 20 6f 66 20 52 4f 57 49 44 2e 20 20 52  der of ROWID.  R
42d0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 6f  eturn true if so
42e0: 20 61 6e 64 20 73 65 74 20 2a 70 62 52 65 76 20   and set *pbRev 
42f0: 74 6f 20 62 65 0a 2a 2a 20 74 72 75 65 20 66 6f  to be.** true fo
4300: 72 20 72 65 76 65 72 73 65 20 52 4f 57 49 44 20  r reverse ROWID 
4310: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 20 66 6f  and false for fo
4320: 72 77 61 72 64 20 52 4f 57 49 44 20 6f 72 64 65  rward ROWID orde
4330: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
4340: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
4350: 28 0a 20 20 69 6e 74 20 62 61 73 65 2c 20 20 20  (.  int base,   
4360: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4370: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
4380: 20 74 61 62 6c 65 20 74 6f 20 62 65 20 73 6f 72   table to be sor
4390: 74 65 64 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ted */.  ExprLis
43a0: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 20  t *pOrderBy,    
43b0: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
43c0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 6e 74   clause */.  int
43d0: 20 2a 70 62 52 65 76 20 20 20 20 20 20 20 20 20   *pbRev         
43e0: 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 31       /* Set to 1
43f0: 20 69 66 20 4f 52 44 45 52 20 42 59 20 69 73 20   if ORDER BY is 
4400: 44 45 53 43 20 2a 2f 0a 29 7b 0a 20 20 45 78 70  DESC */.){.  Exp
4410: 72 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28  r *p;..  assert(
4420: 20 70 4f 72 64 65 72 42 79 21 3d 30 20 29 3b 0a   pOrderBy!=0 );.
4430: 20 20 61 73 73 65 72 74 28 20 70 4f 72 64 65 72    assert( pOrder
4440: 42 79 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20  By->nExpr>0 );. 
4450: 20 70 20 3d 20 70 4f 72 64 65 72 42 79 2d 3e 61   p = pOrderBy->a
4460: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 69 66 28  [0].pExpr;.  if(
4470: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d   p->op==TK_COLUM
4480: 4e 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d  N && p->iTable==
4490: 62 61 73 65 20 26 26 20 70 2d 3e 69 43 6f 6c 75  base && p->iColu
44a0: 6d 6e 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 2a 70  mn==-1 ){.    *p
44b0: 62 52 65 76 20 3d 20 70 4f 72 64 65 72 42 79 2d  bRev = pOrderBy-
44c0: 3e 61 5b 30 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[0].sortOrder;
44d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
44e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
44f0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65  .../*.** Disable
4500: 20 61 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57   a term in the W
4510: 48 45 52 45 20 63 6c 61 75 73 65 2e 20 20 45 78  HERE clause.  Ex
4520: 63 65 70 74 2c 20 64 6f 20 6e 6f 74 20 64 69 73  cept, do not dis
4530: 61 62 6c 65 20 74 68 65 20 74 65 72 6d 0a 2a 2a  able the term.**
4540: 20 69 66 20 69 74 20 63 6f 6e 74 72 6f 6c 73 20   if it controls 
4550: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
4560: 4e 20 61 6e 64 20 69 74 20 64 69 64 20 6e 6f 74  N and it did not
4570: 20 6f 72 69 67 69 6e 61 74 65 20 69 6e 20 74 68   originate in th
4580: 65 20 4f 4e 0a 2a 2a 20 6f 72 20 55 53 49 4e 47  e ON.** or USING
4590: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 61 74 20   clause of that 
45a0: 6a 6f 69 6e 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73  join..**.** Cons
45b0: 69 64 65 72 20 74 68 65 20 74 65 72 6d 20 74 32  ider the term t2
45c0: 2e 7a 3d 27 6f 6b 27 20 69 6e 20 74 68 65 20 66  .z='ok' in the f
45d0: 6f 6c 6c 6f 77 69 6e 67 20 71 75 65 72 69 65 73  ollowing queries
45e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 28 31 29 20 20 53  :.**.**   (1)  S
45f0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
4600: 4c 45 46 54 20 4a 4f 49 4e 20 74 32 20 4f 4e 20  LEFT JOIN t2 ON 
4610: 74 31 2e 61 3d 74 32 2e 78 20 57 48 45 52 45 20  t1.a=t2.x WHERE 
4620: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20 20 20 28  t2.z='ok'.**   (
4630: 32 29 20 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  2)  SELECT * FRO
4640: 4d 20 74 31 20 4c 45 46 54 20 4a 4f 49 4e 20 74  M t1 LEFT JOIN t
4650: 32 20 4f 4e 20 74 31 2e 61 3d 74 32 2e 78 20 41  2 ON t1.a=t2.x A
4660: 4e 44 20 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 20  ND t2.z='ok'.** 
4670: 20 20 28 33 29 20 20 53 45 4c 45 43 54 20 2a 20    (3)  SELECT * 
4680: 46 52 4f 4d 20 74 31 2c 20 74 32 20 57 48 45 52  FROM t1, t2 WHER
4690: 45 20 74 31 2e 61 3d 74 32 2e 78 20 41 4e 44 20  E t1.a=t2.x AND 
46a0: 74 32 2e 7a 3d 27 6f 6b 27 0a 2a 2a 0a 2a 2a 20  t2.z='ok'.**.** 
46b0: 54 68 65 20 74 32 2e 7a 3d 27 6f 6b 27 20 69 73  The t2.z='ok' is
46c0: 20 64 69 73 61 62 6c 65 64 20 69 6e 20 74 68 65   disabled in the
46d0: 20 69 6e 20 28 32 29 20 62 65 63 61 75 73 65 20   in (2) because 
46e0: 69 74 20 6f 72 69 67 69 6e 61 74 65 73 0a 2a 2a  it originates.**
46f0: 20 69 6e 20 74 68 65 20 4f 4e 20 63 6c 61 75 73   in the ON claus
4700: 65 2e 20 20 54 68 65 20 74 65 72 6d 20 69 73 20  e.  The term is 
4710: 64 69 73 61 62 6c 65 64 20 69 6e 20 28 33 29 20  disabled in (3) 
4720: 62 65 63 61 75 73 65 20 69 74 20 69 73 20 6e 6f  because it is no
4730: 74 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 20 4c  t part.** of a L
4740: 45 46 54 20 4f 55 54 45 52 20 4a 4f 49 4e 2e 20  EFT OUTER JOIN. 
4750: 20 49 6e 20 28 31 29 2c 20 74 68 65 20 74 65 72   In (1), the ter
4760: 6d 20 69 73 20 6e 6f 74 20 64 69 73 61 62 6c 65  m is not disable
4770: 64 2e 0a 2a 2a 0a 2a 2a 20 44 69 73 61 62 6c 69  d..**.** Disabli
4780: 6e 67 20 61 20 74 65 72 6d 20 63 61 75 73 65 73  ng a term causes
4790: 20 74 68 61 74 20 74 65 72 6d 20 74 6f 20 6e 6f   that term to no
47a0: 74 20 62 65 20 74 65 73 74 65 64 20 69 6e 20 74  t be tested in t
47b0: 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 0a 2a 2a  he inner loop.**
47c0: 20 6f 66 20 74 68 65 20 6a 6f 69 6e 2e 20 20 44   of the join.  D
47d0: 69 73 61 62 6c 69 6e 67 20 69 73 20 61 6e 20 6f  isabling is an o
47e0: 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 57 65  ptimization.  We
47f0: 20 77 6f 75 6c 64 20 67 65 74 20 74 68 65 20 63   would get the c
4800: 6f 72 72 65 63 74 0a 2a 2a 20 72 65 73 75 6c 74  orrect.** result
4810: 73 20 69 66 20 6e 6f 74 68 69 6e 67 20 77 65 72  s if nothing wer
4820: 65 20 65 76 65 72 20 64 69 73 61 62 6c 65 64 2c  e ever disabled,
4830: 20 62 75 74 20 6a 6f 69 6e 73 20 6d 69 67 68 74   but joins might
4840: 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 0a 2a 2a   run a little.**
4850: 20 73 6c 6f 77 65 72 2e 20 20 54 68 65 20 74 72   slower.  The tr
4860: 69 63 6b 20 69 73 20 74 6f 20 64 69 73 61 62 6c  ick is to disabl
4870: 65 20 61 73 20 6d 75 63 68 20 61 73 20 77 65 20  e as much as we 
4880: 63 61 6e 20 77 69 74 68 6f 75 74 20 64 69 73 61  can without disa
4890: 62 6c 69 6e 67 0a 2a 2a 20 74 6f 6f 20 6d 75 63  bling.** too muc
48a0: 68 2e 20 20 49 66 20 77 65 20 64 69 73 61 62 6c  h.  If we disabl
48b0: 65 64 20 69 6e 20 28 31 29 2c 20 77 65 27 64 20  ed in (1), we'd 
48c0: 67 65 74 20 74 68 65 20 77 72 6f 6e 67 20 61 6e  get the wrong an
48d0: 73 77 65 72 2e 0a 2a 2a 20 53 65 65 20 74 69 63  swer..** See tic
48e0: 6b 65 74 20 23 38 31 33 2e 0a 2a 2f 0a 73 74 61  ket #813..*/.sta
48f0: 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65  tic void disable
4900: 54 65 72 6d 28 57 68 65 72 65 4c 65 76 65 6c 20  Term(WhereLevel 
4910: 2a 70 4c 65 76 65 6c 2c 20 45 78 70 72 20 2a 2a  *pLevel, Expr **
4920: 70 70 45 78 70 72 29 7b 0a 20 20 45 78 70 72 20  ppExpr){.  Expr 
4930: 2a 70 45 78 70 72 20 3d 20 2a 70 70 45 78 70 72  *pExpr = *ppExpr
4940: 3b 0a 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e  ;.  if( pLevel->
4950: 69 4c 65 66 74 4a 6f 69 6e 3d 3d 30 20 7c 7c 20  iLeftJoin==0 || 
4960: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4970: 70 45 78 70 72 2c 20 45 50 5f 46 72 6f 6d 4a 6f  pExpr, EP_FromJo
4980: 69 6e 29 20 29 7b 0a 20 20 20 20 2a 70 70 45 78  in) ){.    *ppEx
4990: 70 72 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pr = 0;.  }.}../
49a0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
49b0: 64 65 20 74 68 61 74 20 62 75 69 6c 64 73 20 61  de that builds a
49c0: 20 70 72 6f 62 65 20 66 6f 72 20 61 6e 20 69 6e   probe for an in
49d0: 64 65 78 2e 20 20 44 65 74 61 69 6c 73 3a 0a 2a  dex.  Details:.*
49e0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 68 65 63 6b  *.**    *  Check
49f0: 20 74 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e   the top nColumn
4a00: 20 65 6e 74 72 69 65 73 20 6f 6e 20 74 68 65 20   entries on the 
4a10: 73 74 61 63 6b 2e 20 20 49 66 20 61 6e 79 0a 2a  stack.  If any.*
4a20: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 6f 73 65  *       of those
4a30: 20 65 6e 74 72 69 65 73 20 61 72 65 20 4e 55 4c   entries are NUL
4a40: 4c 2c 20 6a 75 6d 70 20 69 6d 6d 65 64 69 61 74  L, jump immediat
4a50: 65 6c 79 20 74 6f 20 62 72 6b 2c 0a 2a 2a 20 20  ely to brk,.**  
4a60: 20 20 20 20 20 77 68 69 63 68 20 69 73 20 74 68       which is th
4a70: 65 20 6c 6f 6f 70 20 65 78 69 74 2c 20 73 69 6e  e loop exit, sin
4a80: 63 65 20 6e 6f 20 69 6e 64 65 78 20 65 6e 74 72  ce no index entr
4a90: 79 20 77 69 6c 6c 20 6d 61 74 63 68 0a 2a 2a 20  y will match.** 
4aa0: 20 20 20 20 20 20 69 66 20 61 6e 79 20 70 61 72        if any par
4ab0: 74 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  t of the key is 
4ac0: 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  NULL..**.**    *
4ad0: 20 20 43 6f 6e 73 74 72 75 63 74 20 61 20 70 72    Construct a pr
4ae0: 6f 62 65 20 65 6e 74 72 79 20 66 72 6f 6d 20 74  obe entry from t
4af0: 68 65 20 74 6f 70 20 6e 43 6f 6c 75 6d 6e 20 65  he top nColumn e
4b00: 6e 74 72 69 65 73 20 69 6e 0a 2a 2a 20 20 20 20  ntries in.**    
4b10: 20 20 20 74 68 65 20 73 74 61 63 6b 20 77 69 74     the stack wit
4b20: 68 20 61 66 66 69 6e 69 74 69 65 73 20 61 70 70  h affinities app
4b30: 72 6f 70 72 69 61 74 65 20 66 6f 72 20 69 6e 64  ropriate for ind
4b40: 65 78 20 70 49 64 78 2e 0a 2a 2f 0a 73 74 61 74  ex pIdx..*/.stat
4b50: 69 63 20 76 6f 69 64 20 62 75 69 6c 64 49 6e 64  ic void buildInd
4b60: 65 78 50 72 6f 62 65 28 56 64 62 65 20 2a 76 2c  exProbe(Vdbe *v,
4b70: 20 69 6e 74 20 6e 43 6f 6c 75 6d 6e 2c 20 69 6e   int nColumn, in
4b80: 74 20 62 72 6b 2c 20 49 6e 64 65 78 20 2a 70 49  t brk, Index *pI
4b90: 64 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  dx){.  sqlite3Vd
4ba0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f  beAddOp(v, OP_No
4bb0: 74 4e 75 6c 6c 2c 20 2d 6e 43 6f 6c 75 6d 6e 2c  tNull, -nColumn,
4bc0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
4bd0: 65 6e 74 41 64 64 72 28 76 29 2b 33 29 3b 0a 20  entAddr(v)+3);. 
4be0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4bf0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 6e 43 6f  p(v, OP_Pop, nCo
4c00: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  lumn, 0);.  sqli
4c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
4c20: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 62 72 6b 29  OP_Goto, 0, brk)
4c30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41  ;.  sqlite3VdbeA
4c40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  ddOp(v, OP_MakeR
4c50: 65 63 6f 72 64 2c 20 6e 43 6f 6c 75 6d 6e 2c 20  ecord, nColumn, 
4c60: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 49 6e 64  0);.  sqlite3Ind
4c70: 65 78 41 66 66 69 6e 69 74 79 53 74 72 28 76 2c  exAffinityStr(v,
4c80: 20 70 49 64 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pIdx);.}../*.**
4c90: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
4ca0: 6f 72 20 61 6e 20 65 71 75 61 6c 69 74 79 20 74  or an equality t
4cb0: 65 72 6d 20 6f 66 20 74 68 65 20 57 48 45 52 45  erm of the WHERE
4cc0: 20 63 6c 61 75 73 65 2e 20 20 41 6e 20 65 71 75   clause.  An equ
4cd0: 61 6c 69 74 79 0a 2a 2a 20 74 65 72 6d 20 63 61  ality.** term ca
4ce0: 6e 20 62 65 20 65 69 74 68 65 72 20 58 3d 65 78  n be either X=ex
4cf0: 70 72 20 20 6f 72 20 58 20 49 4e 20 28 2e 2e 2e  pr  or X IN (...
4d00: 29 2e 20 20 20 70 54 65 72 6d 20 69 73 20 74 68  ).   pTerm is th
4d10: 65 20 58 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63  e X.  .*/.static
4d20: 20 76 6f 69 64 20 63 6f 64 65 45 71 75 61 6c 69   void codeEquali
4d30: 74 79 54 65 72 6d 28 0a 20 20 50 61 72 73 65 20  tyTerm(.  Parse 
4d40: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
4d50: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
4d60: 74 65 78 74 20 2a 2f 0a 20 20 57 68 65 72 65 54  text */.  WhereT
4d70: 65 72 6d 20 2a 70 54 65 72 6d 2c 20 20 20 20 2f  erm *pTerm,    /
4d80: 2a 20 54 68 65 20 74 65 72 6d 20 6f 66 20 74 68  * The term of th
4d90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
4da0: 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20  o be coded */.  
4db0: 69 6e 74 20 62 72 6b 2c 20 20 20 20 20 20 20 20  int brk,        
4dc0: 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65      /* Jump here
4dd0: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
4de0: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 4c  loop */.  WhereL
4df0: 65 76 65 6c 20 2a 70 4c 65 76 65 6c 20 20 2f 2a  evel *pLevel  /*
4e00: 20 57 68 65 6e 20 6c 65 76 65 6c 20 6f 66 20 74   When level of t
4e10: 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 77  he FROM clause w
4e20: 65 20 61 72 65 20 77 6f 72 6b 69 6e 67 20 6f 6e  e are working on
4e30: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
4e40: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20  X = pTerm->p;.  
4e50: 69 66 28 20 70 58 2d 3e 6f 70 21 3d 54 4b 5f 49  if( pX->op!=TK_I
4e60: 4e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  N ){.    assert(
4e70: 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29   pX->op==TK_EQ )
4e80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
4e90: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
4ea0: 2d 3e 70 52 69 67 68 74 29 3b 0a 23 69 66 6e 64  ->pRight);.#ifnd
4eb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
4ec0: 55 42 51 55 45 52 59 0a 20 20 7d 65 6c 73 65 7b  UBQUERY.  }else{
4ed0: 0a 20 20 20 20 69 6e 74 20 69 54 61 62 3b 0a 20  .    int iTab;. 
4ee0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61     Vdbe *v = pPa
4ef0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 0a 20 20 20  rse->pVdbe;..   
4f00: 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
4f10: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 58  elect(pParse, pX
4f20: 29 3b 0a 20 20 20 20 69 54 61 62 20 3d 20 70 58  );.    iTab = pX
4f30: 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 73 71  ->iTable;.    sq
4f40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
4f50: 2c 20 4f 50 5f 52 65 77 69 6e 64 2c 20 69 54 61  , OP_Rewind, iTa
4f60: 62 2c 20 62 72 6b 29 3b 0a 20 20 20 20 56 64 62  b, brk);.    Vdb
4f70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
4f80: 25 2e 2a 73 22 2c 20 70 58 2d 3e 73 70 61 6e 2e  %.*s", pX->span.
4f90: 6e 2c 20 70 58 2d 3e 73 70 61 6e 2e 7a 29 29 3b  n, pX->span.z));
4fa0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 6e 50  .    pLevel->inP
4fb0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  2 = sqlite3VdbeA
4fc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
4fd0: 6e 2c 20 69 54 61 62 2c 20 30 29 3b 0a 20 20 20  n, iTab, 0);.   
4fe0: 20 70 4c 65 76 65 6c 2d 3e 69 6e 4f 70 20 3d 20   pLevel->inOp = 
4ff0: 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20 70 4c 65  OP_Next;.    pLe
5000: 76 65 6c 2d 3e 69 6e 50 31 20 3d 20 69 54 61 62  vel->inP1 = iTab
5010: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  ;.#endif.  }.  d
5020: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
5030: 6c 2c 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 7d  l, &pTerm->p);.}
5040: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5050: 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  TEST./*.** The f
5060: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
5070: 65 20 68 6f 6c 64 73 20 61 20 74 65 78 74 20 64  e holds a text d
5080: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 71 75  escription of qu
5090: 65 72 79 20 70 6c 61 6e 20 67 65 6e 65 72 61 74  ery plan generat
50a0: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 6d 6f 73  ed.** by the mos
50b0: 74 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f  t recent call to
50c0: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
50d0: 69 6e 28 29 2e 20 20 45 61 63 68 20 63 61 6c 6c  in().  Each call
50e0: 20 74 6f 20 57 68 65 72 65 42 65 67 69 6e 0a 2a   to WhereBegin.*
50f0: 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
5100: 20 70 72 65 76 69 6f 75 73 2e 20 20 54 68 69 73   previous.  This
5110: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
5120: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
5130: 20 61 6e 64 0a 2a 2a 20 61 6e 61 6c 79 73 69 73   and.** analysis
5140: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 63 68 61 72 20 73   only..*/.char s
5150: 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c 61  qlite3_query_pla
5160: 6e 5b 42 4d 53 2a 32 2a 34 30 5d 3b 20 20 2f 2a  n[BMS*2*40];  /*
5170: 20 54 65 78 74 20 6f 66 20 74 68 65 20 6a 6f 69   Text of the joi
5180: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
5190: 6e 51 50 6c 61 6e 20 3d 20 30 3b 20 20 20 20 20  nQPlan = 0;     
51a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
51b0: 20 66 72 65 65 20 73 6c 6f 77 20 69 6e 20 5f 71   free slow in _q
51c0: 75 65 72 79 5f 70 6c 61 6e 5b 5d 20 2a 2f 0a 0a  uery_plan[] */..
51d0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
51e0: 5f 54 45 53 54 20 2a 2f 0a 0a 0a 0a 2f 2a 0a 2a  _TEST */..../*.*
51f0: 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 62  * Generate the b
5200: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
5210: 6c 6f 6f 70 20 75 73 65 64 20 66 6f 72 20 57 48  loop used for WH
5220: 45 52 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65  ERE clause proce
5230: 73 73 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 72 65  ssing..** The re
5240: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 61 20  turn value is a 
5250: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 70  pointer to an op
5260: 61 71 75 65 20 73 74 72 75 63 74 75 72 65 20 74  aque structure t
5270: 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  hat contains.** 
5280: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6e 65 65 64  information need
5290: 65 64 20 74 6f 20 74 65 72 6d 69 6e 61 74 65 20  ed to terminate 
52a0: 74 68 65 20 6c 6f 6f 70 2e 20 20 4c 61 74 65 72  the loop.  Later
52b0: 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f  , the calling ro
52c0: 75 74 69 6e 65 0a 2a 2a 20 73 68 6f 75 6c 64 20  utine.** should 
52d0: 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 57 68  invoke sqlite3Wh
52e0: 65 72 65 45 6e 64 28 29 20 77 69 74 68 20 74 68  ereEnd() with th
52f0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
5300: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  f this function.
5310: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  ** in order to c
5320: 6f 6d 70 6c 65 74 65 20 74 68 65 20 57 48 45 52  omplete the WHER
5330: 45 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73  E clause process
5340: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ing..**.** If an
5350: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
5360: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
5370: 72 6e 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  rns NULL..**.** 
5380: 54 68 65 20 62 61 73 69 63 20 69 64 65 61 20 69  The basic idea i
5390: 73 20 74 6f 20 64 6f 20 61 20 6e 65 73 74 65 64  s to do a nested
53a0: 20 6c 6f 6f 70 2c 20 6f 6e 65 20 6c 6f 6f 70 20   loop, one loop 
53b0: 66 6f 72 20 65 61 63 68 20 74 61 62 6c 65 20 69  for each table i
53c0: 6e 0a 2a 2a 20 74 68 65 20 46 52 4f 4d 20 63 6c  n.** the FROM cl
53d0: 61 75 73 65 20 6f 66 20 61 20 73 65 6c 65 63 74  ause of a select
53e0: 2e 20 20 28 49 4e 53 45 52 54 20 61 6e 64 20 55  .  (INSERT and U
53f0: 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
5400: 20 61 72 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   are the.** same
5410: 20 61 73 20 61 20 53 45 4c 45 43 54 20 77 69 74   as a SELECT wit
5420: 68 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  h only a single 
5430: 74 61 62 6c 65 20 69 6e 20 74 68 65 20 46 52 4f  table in the FRO
5440: 4d 20 63 6c 61 75 73 65 2e 29 20 20 46 6f 72 0a  M clause.)  For.
5450: 2a 2a 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  ** example, if t
5460: 68 65 20 53 51 4c 20 69 73 20 74 68 69 73 3a 0a  he SQL is this:.
5470: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 53 45 4c 45  **.**       SELE
5480: 43 54 20 2a 20 46 52 4f 4d 20 74 31 2c 20 74 32  CT * FROM t1, t2
5490: 2c 20 74 33 20 57 48 45 52 45 20 2e 2e 2e 3b 0a  , t3 WHERE ...;.
54a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 74 68 65 20 63  **.** Then the c
54b0: 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20 69 73  ode generated is
54c0: 20 63 6f 6e 63 65 70 74 75 61 6c 6c 79 20 6c 69   conceptually li
54d0: 6b 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ke the following
54e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 66 6f 72  :.**.**      for
54f0: 65 61 63 68 20 72 6f 77 31 20 69 6e 20 74 31 20  each row1 in t1 
5500: 64 6f 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f  do       \    Co
5510: 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
5520: 20 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72         foreach r
5530: 6f 77 32 20 69 6e 20 74 32 20 64 6f 20 20 20 20  ow2 in t2 do    
5540: 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
5550: 57 68 65 72 65 42 65 67 69 6e 28 29 0a 2a 2a 20  WhereBegin().** 
5560: 20 20 20 20 20 20 20 20 20 66 6f 72 65 61 63 68           foreach
5570: 20 72 6f 77 33 20 69 6e 20 74 33 20 64 6f 20 20   row3 in t3 do  
5580: 20 2f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   /.**           
5590: 20 2e 2e 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20   ....**         
55a0: 20 65 6e 64 20 20 20 20 20 20 20 20 20 20 20 20   end            
55b0: 20 20 20 20 20 20 20 20 20 5c 20 20 20 20 43 6f           \    Co
55c0: 64 65 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  de generated.** 
55d0: 20 20 20 20 20 20 20 65 6e 64 20 20 20 20 20 20         end      
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 7c 2d 2d 20 62 79 20 73 71 6c 69 74 65 33    |-- by sqlite3
5600: 57 68 65 72 65 45 6e 64 28 29 0a 2a 2a 20 20 20  WhereEnd().**   
5610: 20 20 20 65 6e 64 20 20 20 20 20 20 20 20 20 20     end          
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5630: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
5640: 20 42 74 72 65 65 20 63 75 72 73 6f 72 73 20 61   Btree cursors a
5650: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65  ssociated with e
5660: 61 63 68 20 74 61 62 6c 65 2e 20 20 74 31 20 75  ach table.  t1 u
5670: 73 65 73 20 63 75 72 73 6f 72 0a 2a 2a 20 6e 75  ses cursor.** nu
5680: 6d 62 65 72 20 70 54 61 62 4c 69 73 74 2d 3e 61  mber pTabList->a
5690: 5b 30 5d 2e 69 43 75 72 73 6f 72 2e 20 20 74 32  [0].iCursor.  t2
56a0: 20 75 73 65 73 20 74 68 65 20 63 75 72 73 6f 72   uses the cursor
56b0: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 31 5d 2e   pTabList->a[1].
56c0: 69 43 75 72 73 6f 72 2e 0a 2a 2a 20 41 6e 64 20  iCursor..** And 
56d0: 73 6f 20 66 6f 72 74 68 2e 20 20 54 68 69 73 20  so forth.  This 
56e0: 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
56f0: 73 20 63 6f 64 65 20 74 6f 20 6f 70 65 6e 20 74  s code to open t
5700: 68 6f 73 65 20 56 44 42 45 20 63 75 72 73 6f 72  hose VDBE cursor
5710: 73 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  s.** and sqlite3
5720: 57 68 65 72 65 45 6e 64 28 29 20 67 65 6e 65 72  WhereEnd() gener
5730: 61 74 65 73 20 74 68 65 20 63 6f 64 65 20 74 6f  ates the code to
5740: 20 63 6c 6f 73 65 20 74 68 65 6d 2e 0a 2a 2a 0a   close them..**.
5750: 2a 2a 20 54 68 65 20 63 6f 64 65 20 74 68 61 74  ** The code that
5760: 20 73 71 6c 69 74 65 33 57 68 65 72 65 42 65 67   sqlite3WhereBeg
5770: 69 6e 28 29 20 67 65 6e 65 72 61 74 65 73 20 6c  in() generates l
5780: 65 61 76 65 73 20 74 68 65 20 63 75 72 73 6f 72  eaves the cursor
5790: 73 20 6e 61 6d 65 64 0a 2a 2a 20 69 6e 20 70 54  s named.** in pT
57a0: 61 62 4c 69 73 74 20 70 6f 69 6e 74 69 6e 67 20  abList pointing 
57b0: 61 74 20 74 68 65 69 72 20 61 70 70 72 6f 70 72  at their appropr
57c0: 69 61 74 65 20 65 6e 74 72 69 65 73 2e 20 20 54  iate entries.  T
57d0: 68 65 20 5b 2e 2e 2e 5d 20 63 6f 64 65 0a 2a 2a  he [...] code.**
57e0: 20 63 61 6e 20 75 73 65 20 4f 50 5f 43 6f 6c 75   can use OP_Colu
57f0: 6d 6e 20 61 6e 64 20 4f 50 5f 52 6f 77 69 64 20  mn and OP_Rowid 
5800: 6f 70 63 6f 64 65 73 20 6f 6e 20 74 68 65 73 65  opcodes on these
5810: 20 63 75 72 73 6f 72 73 20 74 6f 20 65 78 74 72   cursors to extr
5820: 61 63 74 0a 2a 2a 20 64 61 74 61 20 66 72 6f 6d  act.** data from
5830: 20 74 68 65 20 76 61 72 69 6f 75 73 20 74 61 62   the various tab
5840: 6c 65 73 20 6f 66 20 74 68 65 20 6c 6f 6f 70 2e  les of the loop.
5850: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 57 48  .**.** If the WH
5860: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 65 6d  ERE clause is em
5870: 70 74 79 2c 20 74 68 65 20 66 6f 72 65 61 63 68  pty, the foreach
5880: 20 6c 6f 6f 70 73 20 6d 75 73 74 20 65 61 63 68   loops must each
5890: 20 73 63 61 6e 20 74 68 65 69 72 0a 2a 2a 20 65   scan their.** e
58a0: 6e 74 69 72 65 20 74 61 62 6c 65 73 2e 20 20 54  ntire tables.  T
58b0: 68 75 73 20 61 20 74 68 72 65 65 2d 77 61 79 20  hus a three-way 
58c0: 6a 6f 69 6e 20 69 73 20 61 6e 20 4f 28 4e 5e 33  join is an O(N^3
58d0: 29 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 42 75  ) operation.  Bu
58e0: 74 20 69 66 0a 2a 2a 20 74 68 65 20 74 61 62 6c  t if.** the tabl
58f0: 65 73 20 68 61 76 65 20 69 6e 64 69 63 65 73 20  es have indices 
5900: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 74 65  and there are te
5910: 72 6d 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  rms in the WHERE
5920: 20 63 6c 61 75 73 65 20 74 68 61 74 0a 2a 2a 20   clause that.** 
5930: 72 65 66 65 72 20 74 6f 20 74 68 6f 73 65 20 69  refer to those i
5940: 6e 64 69 63 65 73 2c 20 61 20 63 6f 6d 70 6c 65  ndices, a comple
5950: 74 65 20 74 61 62 6c 65 20 73 63 61 6e 20 63 61  te table scan ca
5960: 6e 20 62 65 20 61 76 6f 69 64 65 64 20 61 6e 64  n be avoided and
5970: 20 74 68 65 0a 2a 2a 20 63 6f 64 65 20 77 69 6c   the.** code wil
5980: 6c 20 72 75 6e 20 6d 75 63 68 20 66 61 73 74 65  l run much faste
5990: 72 2e 20 20 4d 6f 73 74 20 6f 66 20 74 68 65 20  r.  Most of the 
59a0: 77 6f 72 6b 20 6f 66 20 74 68 69 73 20 72 6f 75  work of this rou
59b0: 74 69 6e 65 20 69 73 20 63 68 65 63 6b 69 6e 67  tine is checking
59c0: 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 74 68  .** to see if th
59d0: 65 72 65 20 61 72 65 20 69 6e 64 69 63 65 73 20  ere are indices 
59e0: 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
59f0: 20 74 6f 20 73 70 65 65 64 20 75 70 20 74 68 65   to speed up the
5a00: 20 6c 6f 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 65 72   loop..**.** Ter
5a10: 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20  ms of the WHERE 
5a20: 63 6c 61 75 73 65 20 61 72 65 20 61 6c 73 6f 20  clause are also 
5a30: 75 73 65 64 20 74 6f 20 6c 69 6d 69 74 20 77 68  used to limit wh
5a40: 69 63 68 20 72 6f 77 73 20 61 63 74 75 61 6c 6c  ich rows actuall
5a50: 79 0a 2a 2a 20 6d 61 6b 65 20 69 74 20 74 6f 20  y.** make it to 
5a60: 74 68 65 20 22 2e 2e 2e 22 20 69 6e 20 74 68 65  the "..." in the
5a70: 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 6c   middle of the l
5a80: 6f 6f 70 2e 20 20 41 66 74 65 72 20 65 61 63 68  oop.  After each
5a90: 20 22 66 6f 72 65 61 63 68 22 2c 0a 2a 2a 20 74   "foreach",.** t
5aa0: 65 72 6d 73 20 6f 66 20 74 68 65 20 57 48 45 52  erms of the WHER
5ab0: 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 75 73  E clause that us
5ac0: 65 20 6f 6e 6c 79 20 74 65 72 6d 73 20 69 6e 20  e only terms in 
5ad0: 74 68 61 74 20 6c 6f 6f 70 20 61 6e 64 20 6f 75  that loop and ou
5ae0: 74 65 72 0a 2a 2a 20 6c 6f 6f 70 73 20 61 72 65  ter.** loops are
5af0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 69   evaluated and i
5b00: 66 20 66 61 6c 73 65 20 61 20 6a 75 6d 70 20 69  f false a jump i
5b10: 73 20 6d 61 64 65 20 61 72 6f 75 6e 64 20 61 6c  s made around al
5b20: 6c 20 73 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20  l subsequent.** 
5b30: 69 6e 6e 65 72 20 6c 6f 6f 70 73 20 28 6f 72 20  inner loops (or 
5b40: 61 72 6f 75 6e 64 20 74 68 65 20 22 2e 2e 2e 22  around the "..."
5b50: 20 69 66 20 74 68 65 20 74 65 73 74 20 6f 63 63   if the test occ
5b60: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 69  urs within the i
5b70: 6e 6e 65 72 2d 0a 2a 2a 20 6d 6f 73 74 20 6c 6f  nner-.** most lo
5b80: 6f 70 29 0a 2a 2a 0a 2a 2a 20 4f 55 54 45 52 20  op).**.** OUTER 
5b90: 4a 4f 49 4e 53 0a 2a 2a 0a 2a 2a 20 41 6e 20 6f  JOINS.**.** An o
5ba0: 75 74 65 72 20 6a 6f 69 6e 20 6f 66 20 74 61 62  uter join of tab
5bb0: 6c 65 73 20 74 31 20 61 6e 64 20 74 32 20 69 73  les t1 and t2 is
5bc0: 20 63 6f 6e 63 65 70 74 61 6c 6c 79 20 63 6f 64   conceptally cod
5bd0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
5be0: 2a 0a 2a 2a 20 20 20 20 66 6f 72 65 61 63 68 20  *.**    foreach 
5bf0: 72 6f 77 31 20 69 6e 20 74 31 20 64 6f 0a 2a 2a  row1 in t1 do.**
5c00: 20 20 20 20 20 20 66 6c 61 67 20 3d 20 30 0a 2a        flag = 0.*
5c10: 2a 20 20 20 20 20 20 66 6f 72 65 61 63 68 20 72  *      foreach r
5c20: 6f 77 32 20 69 6e 20 74 32 20 64 6f 0a 2a 2a 20  ow2 in t2 do.** 
5c30: 20 20 20 20 20 20 20 73 74 61 72 74 3a 0a 2a 2a         start:.**
5c40: 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 0a 2a 2a            ....**
5c50: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 20 3d            flag =
5c60: 20 31 0a 2a 2a 20 20 20 20 20 20 65 6e 64 0a 2a   1.**      end.*
5c70: 2a 20 20 20 20 20 20 69 66 20 66 6c 61 67 3d 3d  *      if flag==
5c80: 30 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20 20 20  0 then.**       
5c90: 20 6d 6f 76 65 20 74 68 65 20 72 6f 77 32 20 63   move the row2 c
5ca0: 75 72 73 6f 72 20 74 6f 20 61 20 6e 75 6c 6c 20  ursor to a null 
5cb0: 72 6f 77 0a 2a 2a 20 20 20 20 20 20 20 20 67 6f  row.**        go
5cc0: 74 6f 20 73 74 61 72 74 0a 2a 2a 20 20 20 20 20  to start.**     
5cd0: 20 66 69 0a 2a 2a 20 20 20 20 65 6e 64 0a 2a 2a   fi.**    end.**
5ce0: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 43 4c 41  .** ORDER BY CLA
5cf0: 55 53 45 20 50 52 4f 43 45 53 53 49 4e 47 0a 2a  USE PROCESSING.*
5d00: 2a 0a 2a 2a 20 2a 70 70 4f 72 64 65 72 42 79 20  *.** *ppOrderBy 
5d10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
5d20: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
5d30: 75 73 65 20 6f 66 20 61 20 53 45 4c 45 43 54 20  use of a SELECT 
5d40: 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 69 66  statement,.** if
5d50: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20   there is one.  
5d60: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 4f  If there is no O
5d70: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 6f  RDER BY clause o
5d80: 72 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e  r if this routin
5d90: 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 66  e.** is called f
5da0: 72 6f 6d 20 61 6e 20 55 50 44 41 54 45 20 6f 72  rom an UPDATE or
5db0: 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e   DELETE statemen
5dc0: 74 2c 20 74 68 65 6e 20 70 70 4f 72 64 65 72 42  t, then ppOrderB
5dd0: 79 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  y is NULL..**.**
5de0: 20 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e   If an index can
5df0: 20 62 65 20 75 73 65 64 20 73 6f 20 74 68 61 74   be used so that
5e00: 20 74 68 65 20 6e 61 74 75 72 61 6c 20 6f 75 74   the natural out
5e10: 70 75 74 20 6f 72 64 65 72 20 6f 66 20 74 68 65  put order of the
5e20: 20 74 61 62 6c 65 0a 2a 2a 20 73 63 61 6e 20 69   table.** scan i
5e30: 73 20 63 6f 72 72 65 63 74 20 66 6f 72 20 74 68  s correct for th
5e40: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
5e50: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 69 6e 64  e, then that ind
5e60: 65 78 20 69 73 20 75 73 65 64 20 61 6e 64 0a 2a  ex is used and.*
5e70: 2a 20 2a 70 70 4f 72 64 65 72 42 79 20 69 73 20  * *ppOrderBy is 
5e80: 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 54 68  set to NULL.  Th
5e90: 69 73 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  is is an optimiz
5ea0: 61 74 69 6f 6e 20 74 68 61 74 20 70 72 65 76 65  ation that preve
5eb0: 6e 74 73 20 61 6e 0a 2a 2a 20 75 6e 6e 65 63 65  nts an.** unnece
5ec0: 73 73 61 72 79 20 73 6f 72 74 20 6f 66 20 74 68  ssary sort of th
5ed0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 69 66 20  e result set if 
5ee0: 61 6e 20 69 6e 64 65 78 20 61 70 70 72 6f 70 72  an index appropr
5ef0: 69 61 74 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20  iate for the.** 
5f00: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
5f10: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 0a  already exists..
5f20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 77 68 65  **.** If the whe
5f30: 72 65 20 63 6c 61 75 73 65 20 6c 6f 6f 70 73 20  re clause loops 
5f40: 63 61 6e 6e 6f 74 20 62 65 20 61 72 72 61 6e 67  cannot be arrang
5f50: 65 64 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68  ed to provide th
5f60: 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6f 75 74  e correct.** out
5f70: 70 75 74 20 6f 72 64 65 72 2c 20 74 68 65 6e 20  put order, then 
5f80: 74 68 65 20 2a 70 70 4f 72 64 65 72 42 79 20 69  the *ppOrderBy i
5f90: 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  s unchanged..*/.
5fa0: 57 68 65 72 65 49 6e 66 6f 20 2a 73 71 6c 69 74  WhereInfo *sqlit
5fb0: 65 33 57 68 65 72 65 42 65 67 69 6e 28 0a 20 20  e3WhereBegin(.  
5fc0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
5fd0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5fe0: 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ser context */. 
5ff0: 20 53 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69   SrcList *pTabLi
6000: 73 74 2c 20 20 20 20 2f 2a 20 41 20 6c 69 73 74  st,    /* A list
6010: 20 6f 66 20 61 6c 6c 20 74 61 62 6c 65 73 20 74   of all tables t
6020: 6f 20 62 65 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  o be scanned */.
6030: 20 20 45 78 70 72 20 2a 70 57 68 65 72 65 2c 20    Expr *pWhere, 
6040: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 57          /* The W
6050: 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20  HERE clause */. 
6060: 20 45 78 70 72 4c 69 73 74 20 2a 2a 70 70 4f 72   ExprList **ppOr
6070: 64 65 72 42 79 20 20 2f 2a 20 41 6e 20 4f 52 44  derBy  /* An ORD
6080: 45 52 20 42 59 20 63 6c 61 75 73 65 2c 20 6f 72  ER BY clause, or
6090: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e   NULL */.){.  in
60a0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
60b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
60c0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 57 68   counter */.  Wh
60d0: 65 72 65 49 6e 66 6f 20 2a 70 57 49 6e 66 6f 3b  ereInfo *pWInfo;
60e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6c 6c           /* Will
60f0: 20 62 65 63 6f 6d 65 20 74 68 65 20 72 65 74 75   become the retu
6100: 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  rn value of this
6110: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 56   function */.  V
6120: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
6130: 3e 70 56 64 62 65 3b 20 20 20 2f 2a 20 54 68 65  >pVdbe;   /* The
6140: 20 76 69 72 74 75 61 6c 20 64 61 74 61 62 61 73   virtual databas
6150: 65 20 65 6e 67 69 6e 65 20 2a 2f 0a 20 20 69 6e  e engine */.  in
6160: 74 20 62 72 6b 2c 20 63 6f 6e 74 20 3d 20 30 3b  t brk, cont = 0;
6170: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6180: 65 73 73 65 73 20 75 73 65 64 20 64 75 72 69 6e  esses used durin
6190: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
61a0: 6e 20 2a 2f 0a 20 20 42 69 74 6d 61 73 6b 20 6c  n */.  Bitmask l
61b0: 6f 6f 70 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  oopMask;        
61c0: 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 73 65 74    /* One bit set
61d0: 20 66 6f 72 20 65 61 63 68 20 6f 75 74 65 72 20   for each outer 
61e0: 6c 6f 6f 70 20 2a 2f 0a 20 20 57 68 65 72 65 54  loop */.  WhereT
61f0: 65 72 6d 20 2a 70 54 65 72 6d 3b 20 20 20 20 20  erm *pTerm;     
6200: 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65       /* A single
6210: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 57 48 45   term in the WHE
6220: 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  RE clause */.  E
6230: 78 70 72 4d 61 73 6b 53 65 74 20 6d 61 73 6b 53  xprMaskSet maskS
6240: 65 74 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  et;       /* The
6250: 20 65 78 70 72 65 73 73 69 6f 6e 20 6d 61 73 6b   expression mask
6260: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 69 44   set */.  int iD
6270: 69 72 65 63 74 45 71 5b 42 4d 53 5d 3b 20 20 20  irectEq[BMS];   
6280: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6f 66 20       /* Term of 
6290: 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3d 3d  the form ROWID==
62a0: 58 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 74  X for the N-th t
62b0: 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44  able */.  int iD
62c0: 69 72 65 63 74 4c 74 5b 42 4d 53 5d 3b 20 20 20  irectLt[BMS];   
62d0: 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 6f 66 20       /* Term of 
62e0: 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3c 58  the form ROWID<X
62f0: 20 6f 72 20 52 4f 57 49 44 3c 3d 58 20 2a 2f 0a   or ROWID<=X */.
6300: 20 20 69 6e 74 20 69 44 69 72 65 63 74 47 74 5b    int iDirectGt[
6310: 42 4d 53 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  BMS];        /* 
6320: 54 65 72 6d 20 6f 66 20 74 68 65 20 66 6f 72 6d  Term of the form
6330: 20 52 4f 57 49 44 3e 58 20 6f 72 20 52 4f 57 49   ROWID>X or ROWI
6340: 44 3e 3d 58 20 2a 2f 0a 20 20 57 68 65 72 65 43  D>=X */.  WhereC
6350: 6c 61 75 73 65 20 77 63 3b 20 20 20 20 20 20 20  lause wc;       
6360: 20 20 20 20 20 2f 2a 20 54 68 65 20 57 48 45 52       /* The WHER
6370: 45 20 63 6c 61 75 73 65 20 69 73 20 64 69 76 69  E clause is divi
6380: 64 65 64 20 69 6e 74 6f 20 74 68 65 73 65 20 74  ded into these t
6390: 65 72 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  erms */.  struct
63a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
63b0: 54 61 62 49 74 65 6d 3b 20 20 2f 2a 20 41 20 73  TabItem;  /* A s
63c0: 69 6e 67 6c 65 20 65 6e 74 72 79 20 66 72 6f 6d  ingle entry from
63d0: 20 70 54 61 62 4c 69 73 74 20 2a 2f 0a 20 20 57   pTabList */.  W
63e0: 68 65 72 65 4c 65 76 65 6c 20 2a 70 4c 65 76 65  hereLevel *pLeve
63f0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
6400: 2a 20 41 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c  * A single level
6410: 20 69 6e 20 74 68 65 20 70 57 49 6e 66 6f 20 6c   in the pWInfo l
6420: 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ist */..  /* The
6430: 20 6e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   number of terms
6440: 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61   in the FROM cla
6450: 75 73 65 20 69 73 20 6c 69 6d 69 74 65 64 20 62  use is limited b
6460: 79 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  y the number of.
6470: 20 20 2a 2a 20 62 69 74 73 20 69 6e 20 61 20 42    ** bits in a B
6480: 69 74 6d 61 73 6b 20 0a 20 20 2a 2f 0a 20 20 69  itmask .  */.  i
6490: 66 28 20 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72  f( pTabList->nSr
64a0: 63 3e 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  c>sizeof(Bitmask
64b0: 29 2a 38 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  )*8 ){.    sqlit
64c0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
64d0: 65 2c 20 22 61 74 20 6d 6f 73 74 20 25 64 20 74  e, "at most %d t
64e0: 61 62 6c 65 73 20 69 6e 20 61 20 6a 6f 69 6e 22  ables in a join"
64f0: 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  ,.       sizeof(
6500: 42 69 74 6d 61 73 6b 29 2a 38 29 3b 0a 20 20 20  Bitmask)*8);.   
6510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
6520: 20 20 2f 2a 20 53 70 6c 69 74 20 74 68 65 20 57    /* Split the W
6530: 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 74 6f  HERE clause into
6540: 20 73 65 70 61 72 61 74 65 20 73 75 62 65 78 70   separate subexp
6550: 72 65 73 73 69 6f 6e 73 20 77 68 65 72 65 20 65  ressions where e
6560: 61 63 68 0a 20 20 2a 2a 20 73 75 62 65 78 70 72  ach.  ** subexpr
6570: 65 73 73 69 6f 6e 20 69 73 20 73 65 70 61 72 61  ession is separa
6580: 74 65 64 20 62 79 20 61 6e 20 41 4e 44 20 6f 70  ted by an AND op
6590: 65 72 61 74 6f 72 2e 20 20 49 66 20 74 68 65 20  erator.  If the 
65a0: 77 63 2e 61 5b 5d 0a 20 20 2a 2a 20 61 72 72 61  wc.a[].  ** arra
65b0: 79 20 66 69 6c 6c 73 20 75 70 2c 20 74 68 65 20  y fills up, the 
65c0: 6c 61 73 74 20 65 6e 74 72 79 20 6d 69 67 68 74  last entry might
65d0: 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 78 70   point to an exp
65e0: 72 65 73 73 69 6f 6e 20 77 68 69 63 68 0a 20 20  ression which.  
65f0: 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  ** contains addi
6600: 74 69 6f 6e 61 6c 20 75 6e 66 61 63 74 6f 72 65  tional unfactore
6610: 64 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 73 2e  d AND operators.
6620: 0a 20 20 2a 2f 0a 20 20 69 6e 69 74 4d 61 73 6b  .  */.  initMask
6630: 53 65 74 28 26 6d 61 73 6b 53 65 74 29 3b 0a 20  Set(&maskSet);. 
6640: 20 77 68 65 72 65 43 6c 61 75 73 65 49 6e 69 74   whereClauseInit
6650: 28 26 77 63 29 3b 0a 20 20 77 68 65 72 65 53 70  (&wc);.  whereSp
6660: 6c 69 74 28 26 77 63 2c 20 70 57 68 65 72 65 29  lit(&wc, pWhere)
6670: 3b 0a 20 20 20 20 0a 20 20 2f 2a 20 41 6c 6c 6f  ;.    .  /* Allo
6680: 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
6690: 69 7a 65 20 74 68 65 20 57 68 65 72 65 49 6e 66  ize the WhereInf
66a0: 6f 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  o structure that
66b0: 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
66c0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  .  ** return val
66d0: 75 65 2e 0a 20 20 2a 2f 0a 20 20 70 57 49 6e 66  ue..  */.  pWInf
66e0: 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  o = sqliteMalloc
66f0: 28 20 73 69 7a 65 6f 66 28 57 68 65 72 65 49 6e  ( sizeof(WhereIn
6700: 66 6f 29 20 2b 20 70 54 61 62 4c 69 73 74 2d 3e  fo) + pTabList->
6710: 6e 53 72 63 2a 73 69 7a 65 6f 66 28 57 68 65 72  nSrc*sizeof(Wher
6720: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 69 66 28 20  eLevel));.  if( 
6730: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
6740: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 73 71 6c  ailed ){.    sql
6750: 69 74 65 46 72 65 65 28 70 57 49 6e 66 6f 29 3b  iteFree(pWInfo);
6760: 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69 6e   /* Avoid leakin
6770: 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d 61  g memory when ma
6780: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
6790: 20 20 77 68 65 72 65 43 6c 61 75 73 65 43 6c 65    whereClauseCle
67a0: 61 72 28 26 77 63 29 3b 0a 20 20 20 20 72 65 74  ar(&wc);.    ret
67b0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 57 49  urn 0;.  }.  pWI
67c0: 6e 66 6f 2d 3e 70 50 61 72 73 65 20 3d 20 70 50  nfo->pParse = pP
67d0: 61 72 73 65 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e  arse;.  pWInfo->
67e0: 70 54 61 62 4c 69 73 74 20 3d 20 70 54 61 62 4c  pTabList = pTabL
67f0: 69 73 74 3b 0a 20 20 70 57 49 6e 66 6f 2d 3e 69  ist;.  pWInfo->i
6800: 42 72 65 61 6b 20 3d 20 73 71 6c 69 74 65 33 56  Break = sqlite3V
6810: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
6820: 0a 0a 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63  ..  /* Special c
6830: 61 73 65 3a 20 61 20 57 48 45 52 45 20 63 6c 61  ase: a WHERE cla
6840: 75 73 65 20 74 68 61 74 20 69 73 20 63 6f 6e 73  use that is cons
6850: 74 61 6e 74 2e 20 20 45 76 61 6c 75 61 74 65 20  tant.  Evaluate 
6860: 74 68 65 0a 20 20 2a 2a 20 65 78 70 72 65 73 73  the.  ** express
6870: 69 6f 6e 20 61 6e 64 20 65 69 74 68 65 72 20 6a  ion and either j
6880: 75 6d 70 20 6f 76 65 72 20 61 6c 6c 20 6f 66 20  ump over all of 
6890: 74 68 65 20 63 6f 64 65 20 6f 72 20 66 61 6c 6c  the code or fall
68a0: 20 74 68 72 75 2e 0a 20 20 2a 2f 0a 20 20 69 66   thru..  */.  if
68b0: 28 20 70 57 68 65 72 65 20 26 26 20 28 70 54 61  ( pWhere && (pTa
68c0: 62 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 30 20 7c  bList->nSrc==0 |
68d0: 7c 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  | sqlite3ExprIsC
68e0: 6f 6e 73 74 61 6e 74 28 70 57 68 65 72 65 29 29  onstant(pWhere))
68f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
6900: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
6910: 65 2c 20 70 57 68 65 72 65 2c 20 70 57 49 6e 66  e, pWhere, pWInf
6920: 6f 2d 3e 69 42 72 65 61 6b 2c 20 31 29 3b 0a 20  o->iBreak, 1);. 
6930: 20 20 20 70 57 68 65 72 65 20 3d 20 30 3b 0a 20     pWhere = 0;. 
6940: 20 7d 0a 0a 20 20 2f 2a 20 41 6e 61 6c 79 7a 65   }..  /* Analyze
6950: 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 75 62 65   all of the sube
6960: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 2a 2f  xpressions..  */
6970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54  .  for(i=0; i<pT
6980: 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  abList->nSrc; i+
6990: 2b 29 7b 0a 20 20 20 20 63 72 65 61 74 65 4d 61  +){.    createMa
69a0: 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 70 54 61  sk(&maskSet, pTa
69b0: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  bList->a[i].iCur
69c0: 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  sor);.  }.  for(
69d0: 70 54 65 72 6d 3d 77 63 2e 61 2c 20 69 3d 30 3b  pTerm=wc.a, i=0;
69e0: 20 69 3c 77 63 2e 6e 54 65 72 6d 3b 20 69 2b 2b   i<wc.nTerm; i++
69f0: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
6a00: 65 78 70 72 41 6e 61 6c 79 7a 65 28 70 54 61 62  exprAnalyze(pTab
6a10: 4c 69 73 74 2c 20 26 6d 61 73 6b 53 65 74 2c 20  List, &maskSet, 
6a20: 70 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  pTerm);.  }..  /
6a30: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 61  * Figure out wha
6a40: 74 20 69 6e 64 65 78 20 74 6f 20 75 73 65 20 28  t index to use (
6a50: 69 66 20 61 6e 79 29 20 66 6f 72 20 65 61 63 68  if any) for each
6a60: 20 6e 65 73 74 65 64 20 6c 6f 6f 70 2e 0a 20 20   nested loop..  
6a70: 2a 2a 20 4d 61 6b 65 20 70 57 49 6e 66 6f 2d 3e  ** Make pWInfo->
6a80: 61 5b 69 5d 2e 70 49 64 78 20 70 6f 69 6e 74 20  a[i].pIdx point 
6a90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 74 6f 20  to the index to 
6aa0: 75 73 65 20 66 6f 72 20 74 68 65 20 69 2d 74 68  use for the i-th
6ab0: 20 6e 65 73 74 65 64 0a 20 20 2a 2a 20 6c 6f 6f   nested.  ** loo
6ac0: 70 20 77 68 65 72 65 20 69 3d 3d 30 20 69 73 20  p where i==0 is 
6ad0: 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f 70 20 61  the outer loop a
6ae0: 6e 64 20 69 3d 3d 70 54 61 62 4c 69 73 74 2d 3e  nd i==pTabList->
6af0: 6e 53 72 63 2d 31 20 69 73 20 74 68 65 20 69 6e  nSrc-1 is the in
6b00: 6e 65 72 0a 20 20 2a 2a 20 6c 6f 6f 70 2e 20 0a  ner.  ** loop. .
6b10: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 65 72    **.  ** If ter
6b20: 6d 73 20 65 78 69 73 74 20 74 68 61 74 20 75 73  ms exist that us
6b30: 65 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 61  e the ROWID of a
6b40: 6e 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 73  ny table, then s
6b50: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 44 69 72  et the.  ** iDir
6b60: 65 63 74 45 71 5b 5d 2c 20 69 44 69 72 65 63 74  ectEq[], iDirect
6b70: 4c 74 5b 5d 2c 20 6f 72 20 69 44 69 72 65 63 74  Lt[], or iDirect
6b80: 47 74 5b 5d 20 65 6c 65 6d 65 6e 74 73 20 66 6f  Gt[] elements fo
6b90: 72 20 74 68 61 74 20 74 61 62 6c 65 0a 20 20 2a  r that table.  *
6ba0: 2a 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  * to the index o
6bb0: 66 20 74 68 65 20 74 65 72 6d 20 63 6f 6e 74 61  f the term conta
6bc0: 69 6e 69 6e 67 20 74 68 65 20 52 4f 57 49 44 2e  ining the ROWID.
6bd0: 20 20 57 65 20 61 6c 77 61 79 73 20 70 72 65 66    We always pref
6be0: 65 72 0a 20 20 2a 2a 20 74 6f 20 75 73 65 20 61  er.  ** to use a
6bf0: 20 52 4f 57 49 44 20 77 68 69 63 68 20 63 61 6e   ROWID which can
6c00: 20 64 69 72 65 63 74 6c 79 20 61 63 63 65 73 73   directly access
6c10: 20 61 20 74 61 62 6c 65 20 72 61 74 68 65 72 20   a table rather 
6c20: 74 68 61 6e 20 61 6e 0a 20 20 2a 2a 20 69 6e 64  than an.  ** ind
6c30: 65 78 20 77 68 69 63 68 20 72 65 71 75 69 72 65  ex which require
6c40: 73 20 72 65 61 64 69 6e 67 20 61 6e 20 69 6e 64  s reading an ind
6c50: 65 78 20 66 69 72 73 74 20 74 6f 20 67 65 74 20  ex first to get 
6c60: 74 68 65 20 72 6f 77 69 64 20 74 68 65 6e 0a 20  the rowid then. 
6c70: 20 2a 2a 20 64 6f 69 6e 67 20 61 20 73 65 63 6f   ** doing a seco
6c80: 6e 64 20 72 65 61 64 20 6f 66 20 74 68 65 20 61  nd read of the a
6c90: 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 74  ctual database t
6ca0: 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
6cb0: 41 63 74 75 61 6c 6c 79 2c 20 69 66 20 74 68 65  Actually, if the
6cc0: 72 65 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e  re are more than
6cd0: 20 33 32 20 74 61 62 6c 65 73 20 69 6e 20 74 68   32 tables in th
6ce0: 65 20 6a 6f 69 6e 2c 20 6f 6e 6c 79 20 74 68 65  e join, only the
6cf0: 0a 20 20 2a 2a 20 66 69 72 73 74 20 33 32 20 74  .  ** first 32 t
6d00: 61 62 6c 65 73 20 61 72 65 20 63 61 6e 64 69 64  ables are candid
6d10: 61 74 65 73 20 66 6f 72 20 69 6e 64 69 63 65 73  ates for indices
6d20: 2e 20 20 54 68 69 73 20 69 73 20 28 61 67 61 69  .  This is (agai
6d30: 6e 29 20 64 75 65 0a 20 20 2a 2a 20 74 6f 20 74  n) due.  ** to t
6d40: 68 65 20 6c 69 6d 69 74 20 6f 66 20 33 32 20 62  he limit of 32 b
6d50: 69 74 73 20 69 6e 20 61 6e 20 69 6e 74 65 67 65  its in an intege
6d60: 72 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  r bitmask..  */.
6d70: 20 20 6c 6f 6f 70 4d 61 73 6b 20 3d 20 30 3b 0a    loopMask = 0;.
6d80: 20 20 70 54 61 62 49 74 65 6d 20 3d 20 70 54 61    pTabItem = pTa
6d90: 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 70 4c 65 76  bList->a;.  pLev
6da0: 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e 61 3b 0a  el = pWInfo->a;.
6db0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61    for(i=0; i<pTa
6dc0: 62 4c 69 73 74 2d 3e 6e 53 72 63 20 26 26 20 69  bList->nSrc && i
6dd0: 3c 41 52 52 41 59 53 49 5a 45 28 69 44 69 72 65  <ARRAYSIZE(iDire
6de0: 63 74 45 71 29 3b 20 69 2b 2b 2c 70 54 61 62 49  ctEq); i++,pTabI
6df0: 74 65 6d 2b 2b 2c 70 4c 65 76 65 6c 2b 2b 29 7b  tem++,pLevel++){
6e00: 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
6e10: 69 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49  int iCur = pTabI
6e20: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 20  tem->iCursor;   
6e30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
6e40: 63 75 72 73 6f 72 20 66 6f 72 20 74 68 69 73 20  cursor for this 
6e50: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 42 69 74  table */.    Bit
6e60: 6d 61 73 6b 20 6d 61 73 6b 20 3d 20 67 65 74 4d  mask mask = getM
6e70: 61 73 6b 28 26 6d 61 73 6b 53 65 74 2c 20 69 43  ask(&maskSet, iC
6e80: 75 72 29 3b 20 20 2f 2a 20 43 75 72 73 6f 72 20  ur);  /* Cursor 
6e90: 6d 61 73 6b 20 66 6f 72 20 74 68 69 73 20 74 61  mask for this ta
6ea0: 62 6c 65 20 2a 2f 0a 20 20 20 20 54 61 62 6c 65  ble */.    Table
6eb0: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65   *pTab = pTabIte
6ec0: 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 49 6e 64  m->pTab;.    Ind
6ed0: 65 78 20 2a 70 49 64 78 3b 0a 20 20 20 20 49 6e  ex *pIdx;.    In
6ee0: 64 65 78 20 2a 70 42 65 73 74 49 64 78 20 3d 20  dex *pBestIdx = 
6ef0: 30 3b 0a 20 20 20 20 69 6e 74 20 62 65 73 74 53  0;.    int bestS
6f00: 63 6f 72 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  core = 0;.    in
6f10: 74 20 62 65 73 74 52 65 76 20 3d 20 30 3b 0a 0a  t bestRev = 0;..
6f20: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20      /* Check to 
6f30: 73 65 65 20 69 66 20 74 68 65 72 65 20 69 73 20  see if there is 
6f40: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
6f50: 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 74 68 65  at uses only the
6f60: 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 66 69  .    ** ROWID fi
6f70: 65 6c 64 20 6f 66 20 74 68 69 73 20 74 61 62 6c  eld of this tabl
6f80: 65 2e 20 20 46 6f 72 20 74 65 72 6d 73 20 6f 66  e.  For terms of
6f90: 20 74 68 65 20 66 6f 72 6d 20 52 4f 57 49 44 3d   the form ROWID=
6fa0: 3d 65 78 70 72 0a 20 20 20 20 2a 2a 20 73 65 74  =expr.    ** set
6fb0: 20 69 44 69 72 65 63 74 45 71 5b 69 5d 20 74 6f   iDirectEq[i] to
6fc0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
6fd0: 65 20 74 65 72 6d 2e 20 20 46 6f 72 20 74 65 72  e term.  For ter
6fe0: 6d 73 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ms of the.    **
6ff0: 20 66 6f 72 6d 20 52 4f 57 49 44 3c 65 78 70 72   form ROWID<expr
7000: 20 6f 72 20 52 4f 57 49 44 3c 3d 65 78 70 72 20   or ROWID<=expr 
7010: 73 65 74 20 69 44 69 72 65 63 74 4c 74 5b 69 5d  set iDirectLt[i]
7020: 20 74 6f 20 74 68 65 20 74 65 72 6d 20 69 6e 64   to the term ind
7030: 65 78 2e 0a 20 20 20 20 2a 2a 20 46 6f 72 20 74  ex..    ** For t
7040: 65 72 6d 73 20 6c 69 6b 65 20 52 4f 57 49 44 3e  erms like ROWID>
7050: 65 78 70 72 20 6f 72 20 52 4f 57 49 44 3e 3d 65  expr or ROWID>=e
7060: 78 70 72 20 73 65 74 20 69 44 69 72 65 63 74 47  xpr set iDirectG
7070: 74 5b 69 5d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  t[i]..    **.   
7080: 20 2a 2a 20 28 41 64 64 65 64 3a 29 20 54 72 65   ** (Added:) Tre
7090: 61 74 20 52 4f 57 49 44 20 49 4e 20 65 78 70 72  at ROWID IN expr
70a0: 20 6c 69 6b 65 20 52 4f 57 49 44 3d 65 78 70 72   like ROWID=expr
70b0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4c 65  ..    */.    pLe
70c0: 76 65 6c 2d 3e 69 49 64 78 43 75 72 20 3d 20 2d  vel->iIdxCur = -
70d0: 31 3b 0a 20 20 20 20 69 44 69 72 65 63 74 45 71  1;.    iDirectEq
70e0: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 69 44  [i] = -1;.    iD
70f0: 69 72 65 63 74 4c 74 5b 69 5d 20 3d 20 2d 31 3b  irectLt[i] = -1;
7100: 0a 20 20 20 20 69 44 69 72 65 63 74 47 74 5b 69  .    iDirectGt[i
7110: 5d 20 3d 20 2d 31 3b 0a 20 20 20 20 66 6f 72 28  ] = -1;.    for(
7120: 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30 3b  pTerm=wc.a, j=0;
7130: 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b 2b   j<wc.nTerm; j++
7140: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
7150: 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54 65    Expr *pX = pTe
7160: 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28  rm->p;.      if(
7170: 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d   pTerm->idxLeft=
7180: 3d 69 43 75 72 20 26 26 20 70 58 2d 3e 70 4c 65  =iCur && pX->pLe
7190: 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20  ft->iColumn<0.  
71a0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54            && (pT
71b0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
71c0: 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54   & loopMask)==pT
71d0: 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74  erm->prereqRight
71e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74   ){.        swit
71f0: 63 68 28 20 70 58 2d 3e 6f 70 20 29 7b 0a 20 20  ch( pX->op ){.  
7200: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
7210: 49 4e 3a 0a 20 20 20 20 20 20 20 20 20 20 63 61  IN:.          ca
7220: 73 65 20 54 4b 5f 45 51 3a 20 69 44 69 72 65 63  se TK_EQ: iDirec
7230: 74 45 71 5b 69 5d 20 3d 20 6a 3b 20 62 72 65 61  tEq[i] = j; brea
7240: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  k;.          cas
7250: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 20 20 20  e TK_LE:.       
7260: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 69     case TK_LT: i
7270: 44 69 72 65 63 74 4c 74 5b 69 5d 20 3d 20 6a 3b  DirectLt[i] = j;
7280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
7290: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
72a0: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
72b0: 47 54 3a 20 69 44 69 72 65 63 74 47 74 5b 69 5d  GT: iDirectGt[i]
72c0: 20 3d 20 6a 3b 20 20 62 72 65 61 6b 3b 0a 20 20   = j;  break;.  
72d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
72e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
72f0: 20 77 65 20 66 6f 75 6e 64 20 61 20 74 65 72 6d   we found a term
7300: 20 74 68 61 74 20 74 65 73 74 73 20 52 4f 57 49   that tests ROWI
7310: 44 20 77 69 74 68 20 3d 3d 20 6f 72 20 49 4e 2c  D with == or IN,
7320: 20 74 68 61 74 20 74 65 72 6d 0a 20 20 20 20 2a   that term.    *
7330: 2a 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  * will be used t
7340: 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 72 6f 77  o locate the row
7350: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
7360: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 72 65 0a  e table.  There.
7370: 20 20 20 20 2a 2a 20 69 73 20 6e 6f 20 6e 65 65      ** is no nee
7380: 64 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 69 6e  d to continue in
7390: 74 6f 20 74 68 65 20 63 6f 64 65 20 62 65 6c 6f  to the code belo
73a0: 77 20 74 68 61 74 20 6c 6f 6f 6b 73 20 66 6f 72  w that looks for
73b0: 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  .    ** an index
73c0: 2e 20 20 57 65 20 77 69 6c 6c 20 61 6c 77 61 79  .  We will alway
73d0: 73 20 75 73 65 20 74 68 65 20 52 4f 57 49 44 20  s use the ROWID 
73e0: 6f 76 65 72 20 61 6e 20 69 6e 64 65 78 2e 0a 20  over an index.. 
73f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 44     */.    if( iD
7400: 69 72 65 63 74 45 71 5b 69 5d 3e 3d 30 20 29 7b  irectEq[i]>=0 ){
7410: 0a 20 20 20 20 20 20 6c 6f 6f 70 4d 61 73 6b 20  .      loopMask 
7420: 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
7430: 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20 30 3b  Level->pIdx = 0;
7440: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
7450: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
7460: 6f 20 61 20 73 65 61 72 63 68 20 66 6f 72 20 75  o a search for u
7470: 73 61 62 6c 65 20 69 6e 64 69 63 65 73 2e 20 20  sable indices.  
7480: 4c 65 61 76 65 20 70 42 65 73 74 49 64 78 20 70  Leave pBestIdx p
7490: 6f 69 6e 74 69 6e 67 20 74 6f 0a 20 20 20 20 2a  ointing to.    *
74a0: 2a 20 74 68 65 20 22 62 65 73 74 22 20 69 6e 64  * the "best" ind
74b0: 65 78 2e 20 20 70 42 65 73 74 49 64 78 20 69 73  ex.  pBestIdx is
74c0: 20 6c 65 66 74 20 73 65 74 20 74 6f 20 4e 55 4c   left set to NUL
74d0: 4c 20 69 66 20 6e 6f 20 69 6e 64 69 63 65 73 0a  L if no indices.
74e0: 20 20 20 20 2a 2a 20 61 72 65 20 75 73 61 62 6c      ** are usabl
74f0: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
7500: 20 54 68 65 20 62 65 73 74 20 69 6e 64 65 78 20   The best index 
7510: 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
7520: 74 68 65 20 68 69 67 68 65 73 74 20 73 63 6f 72  the highest scor
7530: 65 2e 20 20 54 68 65 20 73 63 6f 72 65 0a 20 20  e.  The score.  
7540: 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 69 6e 64    ** for the ind
7550: 65 78 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  ex is determined
7560: 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 20 46 6f   as follows.  Fo
7570: 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 20 20  r each of the.  
7580: 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 74    ** left-most t
7590: 65 72 6d 73 20 74 68 61 74 20 69 73 20 66 69 78  erms that is fix
75a0: 65 64 20 62 79 20 61 6e 20 65 71 75 61 6c 69 74  ed by an equalit
75b0: 79 20 6f 70 65 72 61 74 6f 72 2c 20 61 64 64 0a  y operator, add.
75c0: 20 20 20 20 2a 2a 20 33 32 20 74 6f 20 74 68 65      ** 32 to the
75d0: 20 73 63 6f 72 65 2e 20 20 54 68 65 20 72 69 67   score.  The rig
75e0: 68 74 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20  ht-most term of 
75f0: 74 68 65 20 69 6e 64 65 78 20 6d 61 79 20 62 65  the index may be
7600: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 61 69  .    ** constrai
7610: 6e 65 64 20 62 79 20 61 6e 20 69 6e 65 71 75 61  ned by an inequa
7620: 6c 69 74 79 2e 20 20 41 64 64 20 34 20 69 66 20  lity.  Add 4 if 
7630: 66 6f 72 20 61 6e 20 22 78 3c 2e 2e 2e 22 20 63  for an "x<..." c
7640: 6f 6e 73 74 72 61 69 6e 74 0a 20 20 20 20 2a 2a  onstraint.    **
7650: 20 61 6e 64 20 61 64 64 20 38 20 66 6f 72 20 61   and add 8 for a
7660: 6e 20 22 78 3e 2e 2e 2e 22 20 63 6f 6e 73 74 72  n "x>..." constr
7670: 61 69 6e 74 2e 20 20 49 66 20 62 6f 74 68 20 63  aint.  If both c
7680: 6f 6e 73 74 72 61 69 6e 74 73 0a 20 20 20 20 2a  onstraints.    *
7690: 2a 20 61 72 65 20 70 72 65 73 65 6e 74 2c 20 61  * are present, a
76a0: 64 64 20 31 32 2e 0a 20 20 20 20 2a 2a 0a 20 20  dd 12..    **.  
76b0: 20 20 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74    ** If the left
76c0: 2d 6d 6f 73 74 20 74 65 72 6d 20 6f 66 20 74 68  -most term of th
76d0: 65 20 69 6e 64 65 78 20 75 73 65 73 20 61 6e 20  e index uses an 
76e0: 49 4e 20 6f 70 65 72 61 74 6f 72 0a 20 20 20 20  IN operator.    
76f0: 2a 2a 20 28 65 78 3a 20 20 22 78 20 49 4e 20 28  ** (ex:  "x IN (
7700: 2e 2e 2e 29 22 29 20 20 74 68 65 6e 20 61 64 64  ...)")  then add
7710: 20 31 36 20 74 6f 20 74 68 65 20 73 63 6f 72 65   16 to the score
7720: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
7730: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 61 6e 20  If an index can 
7740: 62 65 20 75 73 65 64 20 66 6f 72 20 73 6f 72 74  be used for sort
7750: 69 6e 67 2c 20 61 64 64 20 32 20 74 6f 20 74 68  ing, add 2 to th
7760: 65 20 73 63 6f 72 65 2e 0a 20 20 20 20 2a 2a 20  e score..    ** 
7770: 49 66 20 61 6e 20 69 6e 64 65 78 20 63 6f 6e 74  If an index cont
7780: 61 69 6e 73 20 61 6c 6c 20 74 68 65 20 74 65 72  ains all the ter
7790: 6d 73 20 6f 66 20 61 20 74 61 62 6c 65 20 74 68  ms of a table th
77a0: 61 74 20 61 72 65 20 65 76 65 72 0a 20 20 20 20  at are ever.    
77b0: 2a 2a 20 75 73 65 64 20 62 79 20 61 6e 79 20 65  ** used by any e
77c0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
77d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
77e0: 74 68 65 6e 20 61 64 64 20 31 20 74 6f 0a 20 20  then add 1 to.  
77f0: 20 20 2a 2a 20 74 68 65 20 73 63 6f 72 65 2e 0a    ** the score..
7800: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
7810: 69 73 20 73 63 6f 72 69 6e 67 20 73 79 73 74 65  is scoring syste
7820: 6d 20 69 73 20 64 65 73 69 67 6e 65 64 20 73 6f  m is designed so
7830: 20 74 68 61 74 20 74 68 65 20 73 63 6f 72 65 20   that the score 
7840: 63 61 6e 20 6c 61 74 65 72 20 62 65 0a 20 20 20  can later be.   
7850: 20 2a 2a 20 75 73 65 64 20 74 6f 20 64 65 74 65   ** used to dete
7860: 72 6d 69 6e 65 20 68 6f 77 20 74 68 65 20 69 6e  rmine how the in
7870: 64 65 78 20 69 73 20 75 73 65 64 2e 20 20 49 66  dex is used.  If
7880: 20 74 68 65 20 73 63 6f 72 65 26 30 78 31 63 20   the score&0x1c 
7890: 69 73 20 30 0a 20 20 20 20 2a 2a 20 74 68 65 6e  is 0.    ** then
78a0: 20 61 6c 6c 20 63 6f 6e 73 74 72 61 69 6e 74 73   all constraints
78b0: 20 61 72 65 20 65 71 75 61 6c 69 74 69 65 73 2e   are equalities.
78c0: 20 20 49 66 20 73 63 6f 72 65 26 30 78 34 20 69    If score&0x4 i
78d0: 73 20 6e 6f 74 20 30 20 74 68 65 6e 0a 20 20 20  s not 0 then.   
78e0: 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61 6e 20   ** there is an 
78f0: 69 6e 65 71 75 61 6c 69 74 79 20 75 73 65 64 20  inequality used 
7900: 61 73 20 61 20 74 65 72 6d 69 6e 61 74 69 6f 6e  as a termination
7910: 20 6b 65 79 2e 20 20 28 65 78 3a 20 22 78 3c 2e   key.  (ex: "x<.
7920: 2e 2e 22 29 0a 20 20 20 20 2a 2a 20 49 66 20 73  ..").    ** If s
7930: 63 6f 72 65 26 30 78 38 20 69 73 20 6e 6f 74 20  core&0x8 is not 
7940: 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
7950: 61 6e 20 69 6e 65 71 75 61 6c 69 74 79 20 75 73  an inequality us
7960: 65 64 20 61 73 20 74 68 65 0a 20 20 20 20 2a 2a  ed as the.    **
7970: 20 73 74 61 72 74 20 6b 65 79 2e 20 20 28 65 78   start key.  (ex
7980: 3a 20 22 78 3e 2e 2e 2e 22 29 2e 20 20 41 20 73  : "x>...").  A s
7990: 63 6f 72 65 20 6f 72 20 30 78 31 30 20 69 73 20  core or 0x10 is 
79a0: 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73 65  the special case
79b0: 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 49 4e  .    ** of an IN
79c0: 20 6f 70 65 72 61 74 6f 72 20 63 6f 6e 73 74 72   operator constr
79d0: 61 69 6e 74 2e 20 20 28 65 78 3a 20 20 22 78 20  aint.  (ex:  "x 
79e0: 49 4e 20 2e 2e 2e 22 29 2e 0a 20 20 20 20 2a 2a  IN ...")..    **
79f0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 49 4e 20 6f  .    ** The IN o
7a00: 70 65 72 61 74 6f 72 20 28 61 73 20 69 6e 20 22  perator (as in "
7a10: 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22  <expr> IN (...)"
7a20: 29 20 69 73 20 74 72 65 61 74 65 64 20 74 68 65  ) is treated the
7a30: 20 73 61 6d 65 20 61 73 0a 20 20 20 20 2a 2a 20   same as.    ** 
7a40: 61 6e 20 65 71 75 61 6c 69 74 79 20 63 6f 6d 70  an equality comp
7a50: 61 72 69 73 6f 6e 20 65 78 63 65 70 74 20 74 68  arison except th
7a60: 61 74 20 69 74 20 63 61 6e 20 6f 6e 6c 79 20 62  at it can only b
7a70: 65 20 75 73 65 64 20 6f 6e 20 74 68 65 0a 20 20  e used on the.  
7a80: 20 20 2a 2a 20 6c 65 66 74 2d 6d 6f 73 74 20 63    ** left-most c
7a90: 6f 6c 75 6d 6e 20 6f 66 20 61 6e 20 69 6e 64 65  olumn of an inde
7aa0: 78 20 61 6e 64 20 6f 74 68 65 72 20 74 65 72 6d  x and other term
7ab0: 73 20 6f 66 20 74 68 65 20 57 48 45 52 45 20 63  s of the WHERE c
7ac0: 6c 61 75 73 65 0a 20 20 20 20 2a 2a 20 63 61 6e  lause.    ** can
7ad0: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 20 63  not be used in c
7ae0: 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  onjunction with 
7af0: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
7b00: 74 6f 20 68 65 6c 70 20 73 61 74 69 73 66 79 0a  to help satisfy.
7b10: 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6c      ** other col
7b20: 75 6d 6e 73 20 6f 66 20 74 68 65 20 69 6e 64 65  umns of the inde
7b30: 78 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  x..    */.    fo
7b40: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
7b50: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
7b60: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
7b70: 20 20 20 20 42 69 74 6d 61 73 6b 20 65 71 4d 61      Bitmask eqMa
7b80: 73 6b 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65  sk = 0;  /* Inde
7b90: 78 20 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65  x columns covere
7ba0: 64 20 62 79 20 61 6e 20 78 3d 2e 2e 2e 20 74 65  d by an x=... te
7bb0: 72 6d 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d  rm */.      Bitm
7bc0: 61 73 6b 20 6c 74 4d 61 73 6b 20 3d 20 30 3b 20  ask ltMask = 0; 
7bd0: 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e   /* Index column
7be0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20  s covered by an 
7bf0: 78 3c 2e 2e 2e 20 74 65 72 6d 20 2a 2f 0a 20 20  x<... term */.  
7c00: 20 20 20 20 42 69 74 6d 61 73 6b 20 67 74 4d 61      Bitmask gtMa
7c10: 73 6b 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 64 65  sk = 0;  /* Inde
7c20: 78 20 63 6f 6c 75 6d 6e 73 20 63 6f 76 65 72 65  x columns covere
7c30: 64 20 62 79 20 61 6e 20 78 3e 2e 2e 2e 20 74 65  d by an x>... te
7c40: 72 6d 20 2a 2f 0a 20 20 20 20 20 20 42 69 74 6d  rm */.      Bitm
7c50: 61 73 6b 20 69 6e 4d 61 73 6b 20 3d 20 30 3b 20  ask inMask = 0; 
7c60: 20 2f 2a 20 49 6e 64 65 78 20 63 6f 6c 75 6d 6e   /* Index column
7c70: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 6e 20  s covered by an 
7c80: 78 20 49 4e 20 2e 2e 20 74 65 72 6d 20 2a 2f 0a  x IN .. term */.
7c90: 20 20 20 20 20 20 42 69 74 6d 61 73 6b 20 6d 3b        Bitmask m;
7ca0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71 2c 20  .      int nEq, 
7cb0: 73 63 6f 72 65 2c 20 62 52 65 76 20 3d 20 30 3b  score, bRev = 0;
7cc0: 0a 0a 20 20 20 20 20 20 69 66 28 20 70 49 64 78  ..      if( pIdx
7cd0: 2d 3e 6e 43 6f 6c 75 6d 6e 3e 73 69 7a 65 6f 66  ->nColumn>sizeof
7ce0: 28 65 71 4d 61 73 6b 29 2a 38 20 29 7b 0a 20 20  (eqMask)*8 ){.  
7cf0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
7d00: 20 2f 2a 20 49 67 6e 6f 72 65 20 69 6e 64 69 63   /* Ignore indic
7d10: 65 73 20 77 69 74 68 20 74 6f 6f 20 6d 61 6e 79  es with too many
7d20: 20 63 6f 6c 75 6d 6e 73 20 74 6f 20 61 6e 61 6c   columns to anal
7d30: 79 7a 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  yze */.      }. 
7d40: 20 20 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77       for(pTerm=w
7d50: 63 2e 61 2c 20 6a 3d 30 3b 20 6a 3c 77 63 2e 6e  c.a, j=0; j<wc.n
7d60: 54 65 72 6d 3b 20 6a 2b 2b 2c 20 70 54 65 72 6d  Term; j++, pTerm
7d70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70  ++){.        Exp
7d80: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
7d90: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  ;.        CollSe
7da0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
7db0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
7dc0: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 29  arse, pX->pLeft)
7dd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
7de0: 43 6f 6c 6c 20 26 26 20 70 58 2d 3e 70 52 69 67  Coll && pX->pRig
7df0: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ht ){.          
7e00: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
7e10: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
7e20: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
7e30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e40: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
7e50: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20            pColl 
7e60: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
7e70: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  fltColl;.       
7e80: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
7e90: 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d 69  Term->idxLeft==i
7ea0: 43 75 72 20 0a 20 20 20 20 20 20 20 20 20 20 20  Cur .           
7eb0: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65    && (pTerm->pre
7ec0: 72 65 71 52 69 67 68 74 20 26 20 6c 6f 6f 70 4d  reqRight & loopM
7ed0: 61 73 6b 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ask)==pTerm->pre
7ee0: 72 65 71 52 69 67 68 74 20 29 7b 0a 20 20 20 20  reqRight ){.    
7ef0: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 75 6d        int iColum
7f00: 6e 20 3d 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  n = pX->pLeft->i
7f10: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 20 20  Column;.        
7f20: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20    int k;.       
7f30: 20 20 20 63 68 61 72 20 69 64 78 61 66 66 20 3d     char idxaff =
7f40: 20 69 43 6f 6c 75 6d 6e 3e 3d 30 20 3f 20 70 49   iColumn>=0 ? pI
7f50: 64 78 2d 3e 70 54 61 62 6c 65 2d 3e 61 43 6f 6c  dx->pTable->aCol
7f60: 5b 69 43 6f 6c 75 6d 6e 5d 2e 61 66 66 69 6e 69  [iColumn].affini
7f70: 74 79 20 3a 20 30 3b 20 0a 20 20 20 20 20 20 20  ty : 0; .       
7f80: 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 49     for(k=0; k<pI
7f90: 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20 6b 2b 2b  dx->nColumn; k++
7fa0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
7fb0: 2a 20 49 66 20 74 68 65 20 63 6f 6c 6c 61 74 69  * If the collati
7fc0: 6e 67 20 73 65 71 75 65 6e 63 65 73 20 6f 72 20  ng sequences or 
7fd0: 61 66 66 69 6e 69 74 69 65 73 20 64 6f 6e 27 74  affinities don't
7fe0: 20 6d 61 74 63 68 2c 20 0a 20 20 20 20 20 20 20   match, .       
7ff0: 20 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74       ** ignore t
8000: 68 69 73 20 69 6e 64 65 78 2e 20 20 2a 2f 0a 20  his index.  */. 
8010: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
8020: 43 6f 6c 6c 21 3d 70 49 64 78 2d 3e 6b 65 79 49  Coll!=pIdx->keyI
8030: 6e 66 6f 2e 61 43 6f 6c 6c 5b 6b 5d 20 29 20 63  nfo.aColl[k] ) c
8040: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8050: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
8060: 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b  3IndexAffinityOk
8070: 28 70 58 2c 20 69 64 78 61 66 66 29 20 29 20 63  (pX, idxaff) ) c
8080: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
8090: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 61       if( pIdx->a
80a0: 69 43 6f 6c 75 6d 6e 5b 6b 5d 3d 3d 69 43 6f 6c  iColumn[k]==iCol
80b0: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
80c0: 20 20 20 20 20 73 77 69 74 63 68 28 20 70 58 2d       switch( pX-
80d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >op ){.         
80e0: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49         case TK_I
80f0: 4e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  N: {.           
8100: 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30 20         if( k==0 
8110: 29 20 69 6e 4d 61 73 6b 20 7c 3d 20 31 3b 0a 20  ) inMask |= 1;. 
8120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
8140: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8150: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
8160: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 20 20  K_EQ: {.        
8170: 20 20 20 20 20 20 20 20 20 20 65 71 4d 61 73 6b            eqMask
8180: 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29   |= ((Bitmask)1)
8190: 3c 3c 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  <<k;.           
81a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
81d0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
81e0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
81f0: 20 54 4b 5f 4c 54 3a 20 7b 0a 20 20 20 20 20 20   TK_LT: {.      
8200: 20 20 20 20 20 20 20 20 20 20 20 20 6c 74 4d 61              ltMa
8210: 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29  sk |= ((Bitmask)
8220: 31 29 3c 3c 6b 3b 0a 20 20 20 20 20 20 20 20 20  1)<<k;.         
8230: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
8260: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
8270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
8280: 73 65 20 54 4b 5f 47 54 3a 20 7b 0a 20 20 20 20  se TK_GT: {.    
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 74                gt
82a0: 4d 61 73 6b 20 7c 3d 20 28 28 42 69 74 6d 61 73  Mask |= ((Bitmas
82b0: 6b 29 31 29 3c 3c 6b 3b 0a 20 20 20 20 20 20 20  k)1)<<k;.       
82c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
82d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
82e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
82f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 2f 2a 20 43 41 4e 54 5f 48 41 50 50 45 4e 20   /* CANT_HAPPEN 
8320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
8330: 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29       assert( 0 )
8340: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8350: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8360: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8370: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8380: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8390: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
83a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
83b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
83c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c       /* The foll
83d0: 6f 77 69 6e 67 20 6c 6f 6f 70 20 65 6e 64 73 20  owing loop ends 
83e0: 77 69 74 68 20 6e 45 71 20 73 65 74 20 74 6f 20  with nEq set to 
83f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
8400: 6c 75 6d 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6f  lumns.      ** o
8410: 6e 20 74 68 65 20 6c 65 66 74 20 6f 66 20 74 68  n the left of th
8420: 65 20 69 6e 64 65 78 20 77 69 74 68 20 3d 3d 20  e index with == 
8430: 63 6f 6e 73 74 72 61 69 6e 74 73 2e 0a 20 20 20  constraints..   
8440: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
8450: 6e 45 71 3d 30 3b 20 6e 45 71 3c 70 49 64 78 2d  nEq=0; nEq<pIdx-
8460: 3e 6e 43 6f 6c 75 6d 6e 3b 20 6e 45 71 2b 2b 29  >nColumn; nEq++)
8470: 7b 0a 20 20 20 20 20 20 20 20 6d 20 3d 20 28 28  {.        m = ((
8480: 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 6e 45  (Bitmask)1)<<(nE
8490: 71 2b 31 29 29 2d 31 3b 0a 20 20 20 20 20 20 20  q+1))-1;.       
84a0: 20 69 66 28 20 28 6d 20 26 20 65 71 4d 61 73 6b   if( (m & eqMask
84b0: 29 21 3d 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  )!=m ) break;.  
84c0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
84d0: 42 65 67 69 6e 20 61 73 73 65 6d 62 6c 69 6e 67  Begin assembling
84e0: 20 74 68 65 20 73 63 6f 72 65 0a 20 20 20 20 20   the score.     
84f0: 20 2a 2f 0a 20 20 20 20 20 20 73 63 6f 72 65 20   */.      score 
8500: 3d 20 6e 45 71 2a 33 32 3b 20 20 20 2f 2a 20 42  = nEq*32;   /* B
8510: 61 73 65 20 73 63 6f 72 65 20 69 73 20 33 32 20  ase score is 32 
8520: 74 69 6d 65 73 20 6e 75 6d 62 65 72 20 6f 66 20  times number of 
8530: 3d 3d 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 2a  == constraints *
8540: 2f 0a 20 20 20 20 20 20 6d 20 3d 20 28 28 42 69  /.      m = ((Bi
8550: 74 6d 61 73 6b 29 31 29 3c 3c 6e 45 71 3b 0a 20  tmask)1)<<nEq;. 
8560: 20 20 20 20 20 69 66 28 20 6d 20 26 20 6c 74 4d       if( m & ltM
8570: 61 73 6b 20 29 20 73 63 6f 72 65 2b 3d 34 3b 20  ask ) score+=4; 
8580: 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 73     /* Increase s
8590: 63 6f 72 65 20 66 6f 72 20 61 20 3c 20 63 6f 6e  core for a < con
85a0: 73 74 72 61 69 6e 74 20 2a 2f 0a 20 20 20 20 20  straint */.     
85b0: 20 69 66 28 20 6d 20 26 20 67 74 4d 61 73 6b 20   if( m & gtMask 
85c0: 29 20 73 63 6f 72 65 2b 3d 38 3b 20 20 20 20 2f  ) score+=8;    /
85d0: 2a 20 49 6e 63 72 65 61 73 65 20 73 63 6f 72 65  * Increase score
85e0: 20 66 6f 72 20 61 20 3e 20 63 6f 6e 73 74 72 61   for a > constra
85f0: 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  int */.      if(
8600: 20 73 63 6f 72 65 3d 3d 30 20 26 26 20 69 6e 4d   score==0 && inM
8610: 61 73 6b 20 29 20 73 63 6f 72 65 20 3d 20 31 36  ask ) score = 16
8620: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 73 63 6f  ; /* Default sco
8630: 72 65 20 66 6f 72 20 49 4e 20 63 6f 6e 73 74 72  re for IN constr
8640: 61 69 6e 74 20 2a 2f 0a 0a 20 20 20 20 20 20 2f  aint */..      /
8650: 2a 20 47 69 76 65 20 62 6f 6e 75 73 20 70 6f 69  * Give bonus poi
8660: 6e 74 73 20 69 66 20 74 68 69 73 20 69 6e 64 65  nts if this inde
8670: 78 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  x can be used fo
8680: 72 20 73 6f 72 74 69 6e 67 0a 20 20 20 20 20 20  r sorting.      
8690: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  */.      if( i==
86a0: 30 20 26 26 20 73 63 6f 72 65 21 3d 31 36 20 26  0 && score!=16 &
86b0: 26 20 70 70 4f 72 64 65 72 42 79 20 26 26 20 2a  & ppOrderBy && *
86c0: 70 70 4f 72 64 65 72 42 79 20 29 7b 0a 20 20 20  ppOrderBy ){.   
86d0: 20 20 20 20 20 69 6e 74 20 62 61 73 65 20 3d 20       int base = 
86e0: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 30 5d 2e 69  pTabList->a[0].i
86f0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20  Cursor;.        
8700: 69 66 28 20 69 73 53 6f 72 74 69 6e 67 49 6e 64  if( isSortingInd
8710: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 2c  ex(pParse, pIdx,
8720: 20 70 54 61 62 2c 20 62 61 73 65 2c 20 2a 70 70   pTab, base, *pp
8730: 4f 72 64 65 72 42 79 2c 20 6e 45 71 2c 20 26 62  OrderBy, nEq, &b
8740: 52 65 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Rev) ){.        
8750: 20 20 73 63 6f 72 65 20 2b 3d 20 32 3b 0a 20 20    score += 2;.  
8760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8770: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
8780: 74 6f 20 73 65 65 20 69 66 20 77 65 20 63 61 6e  to see if we can
8790: 20 67 65 74 20 61 77 61 79 20 77 69 74 68 20 75   get away with u
87a0: 73 69 6e 67 20 6a 75 73 74 20 74 68 65 20 69 6e  sing just the in
87b0: 64 65 78 20 77 69 74 68 6f 75 74 0a 20 20 20 20  dex without.    
87c0: 20 20 2a 2a 20 65 76 65 72 20 72 65 61 64 69 6e    ** ever readin
87d0: 67 20 74 68 65 20 74 61 62 6c 65 2e 20 20 49 66  g the table.  If
87e0: 20 74 68 61 74 20 69 73 20 74 68 65 20 63 61 73   that is the cas
87f0: 65 2c 20 74 68 65 6e 20 61 64 64 20 6f 6e 65 20  e, then add one 
8800: 62 6f 6e 75 73 0a 20 20 20 20 20 20 2a 2a 20 70  bonus.      ** p
8810: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 63 6f 72  oint to the scor
8820: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
8830: 20 20 69 66 28 20 73 63 6f 72 65 20 26 26 20 70    if( score && p
8840: 54 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  TabItem->colUsed
8850: 20 3c 20 28 28 28 42 69 74 6d 61 73 6b 29 31 29   < (((Bitmask)1)
8860: 3c 3c 28 42 4d 53 2d 31 29 29 20 29 7b 0a 20 20  <<(BMS-1)) ){.  
8870: 20 20 20 20 20 20 66 6f 72 28 6d 3d 30 2c 20 6a        for(m=0, j
8880: 3d 30 3b 20 6a 3c 70 49 64 78 2d 3e 6e 43 6f 6c  =0; j<pIdx->nCol
8890: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
88a0: 20 20 20 20 20 69 6e 74 20 78 20 3d 20 70 49 64       int x = pId
88b0: 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 3b 0a  x->aiColumn[j];.
88c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3c            if( x<
88d0: 42 4d 53 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  BMS-1 ){.       
88e0: 20 20 20 20 20 6d 20 7c 3d 20 28 28 42 69 74 6d       m |= ((Bitm
88f0: 61 73 6b 29 31 29 3c 3c 78 3b 0a 20 20 20 20 20  ask)1)<<x;.     
8900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
8910: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 54  .        if( (pT
8920: 61 62 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20  abItem->colUsed 
8930: 26 20 6d 29 3d 3d 70 54 61 62 49 74 65 6d 2d 3e  & m)==pTabItem->
8940: 63 6f 6c 55 73 65 64 20 29 7b 0a 20 20 20 20 20  colUsed ){.     
8950: 20 20 20 20 20 73 63 6f 72 65 2b 2b 3b 0a 20 20       score++;.  
8960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8970: 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
8980: 20 73 63 6f 72 65 20 66 6f 72 20 74 68 69 73 20   score for this 
8990: 69 6e 64 65 78 20 69 73 20 74 68 65 20 62 65 73  index is the bes
89a0: 74 20 77 65 20 68 61 76 65 20 73 65 65 6e 20 73  t we have seen s
89b0: 6f 20 66 61 72 2c 20 74 68 65 6e 0a 20 20 20 20  o far, then.    
89c0: 20 20 2a 2a 20 73 61 76 65 20 69 74 0a 20 20 20    ** save it.   
89d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
89e0: 73 63 6f 72 65 3e 62 65 73 74 53 63 6f 72 65 20  score>bestScore 
89f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  ){.        pBest
8a00: 49 64 78 20 3d 20 70 49 64 78 3b 0a 20 20 20 20  Idx = pIdx;.    
8a10: 20 20 20 20 62 65 73 74 53 63 6f 72 65 20 3d 20      bestScore = 
8a20: 73 63 6f 72 65 3b 0a 20 20 20 20 20 20 20 20 62  score;.        b
8a30: 65 73 74 52 65 76 20 3d 20 62 52 65 76 3b 0a 20  estRev = bRev;. 
8a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8a50: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 20 3d 20   pLevel->pIdx = 
8a60: 70 42 65 73 74 49 64 78 3b 0a 20 20 20 20 70 4c  pBestIdx;.    pL
8a70: 65 76 65 6c 2d 3e 73 63 6f 72 65 20 3d 20 62 65  evel->score = be
8a80: 73 74 53 63 6f 72 65 3b 0a 20 20 20 20 70 4c 65  stScore;.    pLe
8a90: 76 65 6c 2d 3e 62 52 65 76 20 3d 20 62 65 73 74  vel->bRev = best
8aa0: 52 65 76 3b 0a 20 20 20 20 6c 6f 6f 70 4d 61 73  Rev;.    loopMas
8ab0: 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 69  k |= mask;.    i
8ac0: 66 28 20 70 42 65 73 74 49 64 78 20 29 7b 0a 20  f( pBestIdx ){. 
8ad0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 49 64       pLevel->iId
8ae0: 78 43 75 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  xCur = pParse->n
8af0: 54 61 62 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Tab++;.    }.  }
8b00: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20  ..  /* Check to 
8b10: 73 65 65 20 69 66 20 74 68 65 20 4f 52 44 45 52  see if the ORDER
8b20: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 6f 72   BY clause is or
8b30: 20 63 61 6e 20 62 65 20 73 61 74 69 73 66 69 65   can be satisfie
8b40: 64 20 62 79 20 74 68 65 0a 20 20 2a 2a 20 75 73  d by the.  ** us
8b50: 65 20 6f 66 20 61 6e 20 69 6e 64 65 78 20 6f 6e  e of an index on
8b60: 20 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65   the first table
8b70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 70 4f  ..  */.  if( ppO
8b80: 72 64 65 72 42 79 20 26 26 20 2a 70 70 4f 72 64  rderBy && *ppOrd
8b90: 65 72 42 79 20 26 26 20 70 54 61 62 4c 69 73 74  erBy && pTabList
8ba0: 2d 3e 6e 53 72 63 3e 30 20 29 7b 0a 20 20 20 20  ->nSrc>0 ){.    
8bb0: 49 6e 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20  Index *pIdx;    
8bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
8bd0: 78 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  x derived from t
8be0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
8bf0: 2a 2f 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54  */.    Table *pT
8c00: 61 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ab;             
8c10: 2f 2a 20 4c 65 66 74 2d 6d 6f 73 74 20 74 61 62  /* Left-most tab
8c20: 6c 65 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  le in the FROM c
8c30: 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 69 6e 74  lause */.    int
8c40: 20 62 52 65 76 20 3d 20 30 3b 20 20 20 20 20 20   bRev = 0;      
8c50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
8c60: 20 72 65 76 65 72 73 65 20 74 68 65 20 6f 75 74   reverse the out
8c70: 70 75 74 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20  put order */.   
8c80: 20 69 6e 74 20 69 43 75 72 3b 20 20 20 20 20 20   int iCur;      
8c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72            /* Btr
8ca0: 65 65 2d 63 75 72 73 6f 72 20 74 68 61 74 20 77  ee-cursor that w
8cb0: 69 6c 6c 20 62 65 20 75 73 65 64 20 62 79 20 70  ill be used by p
8cc0: 54 61 62 20 2a 2f 0a 20 20 20 20 57 68 65 72 65  Tab */.    Where
8cd0: 4c 65 76 65 6c 20 2a 70 4c 65 76 65 6c 30 20 3d  Level *pLevel0 =
8ce0: 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 30 5d 3b 0a   &pWInfo->a[0];.
8cf0: 0a 20 20 20 20 70 54 61 62 20 3d 20 70 54 61 62  .    pTab = pTab
8d00: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  List->a[0].pTab;
8d10: 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
8d20: 65 6c 30 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69  el0->pIdx;.    i
8d30: 43 75 72 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e  Cur = pTabList->
8d40: 61 5b 30 5d 2e 69 43 75 72 73 6f 72 3b 0a 20 20  a[0].iCursor;.  
8d50: 20 20 69 66 28 20 70 49 64 78 3d 3d 30 20 26 26    if( pIdx==0 &&
8d60: 20 73 6f 72 74 61 62 6c 65 42 79 52 6f 77 69 64   sortableByRowid
8d70: 28 69 43 75 72 2c 20 2a 70 70 4f 72 64 65 72 42  (iCur, *ppOrderB
8d80: 79 2c 20 26 62 52 65 76 29 20 29 7b 0a 20 20 20  y, &bRev) ){.   
8d90: 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20     /* The ORDER 
8da0: 42 59 20 63 6c 61 75 73 65 20 73 70 65 63 69 66  BY clause specif
8db0: 69 65 73 20 52 4f 57 49 44 20 6f 72 64 65 72 2c  ies ROWID order,
8dc0: 20 77 68 69 63 68 20 69 73 20 77 68 61 74 20 77   which is what w
8dd0: 65 0a 20 20 20 20 20 20 2a 2a 20 77 65 72 65 20  e.      ** were 
8de0: 67 6f 69 6e 67 20 74 6f 20 62 65 20 64 6f 69 6e  going to be doin
8df0: 67 20 61 6e 79 77 61 79 2e 2e 2e 0a 20 20 20 20  g anyway....    
8e00: 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70 70 4f 72    */.      *ppOr
8e10: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 20  derBy = 0;.     
8e20: 20 70 4c 65 76 65 6c 30 2d 3e 62 52 65 76 20 3d   pLevel0->bRev =
8e30: 20 62 52 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65   bRev;.    }else
8e40: 20 69 66 28 20 70 4c 65 76 65 6c 30 2d 3e 73 63   if( pLevel0->sc
8e50: 6f 72 65 3d 3d 31 36 20 29 7b 0a 20 20 20 20 20  ore==16 ){.     
8e60: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
8e70: 61 6c 72 65 61 64 79 20 61 6e 20 49 4e 20 69 6e  already an IN in
8e80: 64 65 78 20 6f 6e 20 74 68 65 20 6c 65 66 74 2d  dex on the left-
8e90: 6d 6f 73 74 20 74 61 62 6c 65 2c 0a 20 20 20 20  most table,.    
8ea0: 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e 6f 74    ** it will not
8eb0: 20 67 69 76 65 20 74 68 65 20 63 6f 72 72 65 63   give the correc
8ec0: 74 20 73 6f 72 74 20 6f 72 64 65 72 2e 0a 20 20  t sort order..  
8ed0: 20 20 20 20 2a 2a 20 53 6f 2c 20 70 72 65 74 65      ** So, prete
8ee0: 6e 64 20 74 68 61 74 20 6e 6f 20 73 75 69 74 61  nd that no suita
8ef0: 62 6c 65 20 69 6e 64 65 78 20 69 73 20 66 6f 75  ble index is fou
8f00: 6e 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  nd..      */.   
8f10: 20 7d 65 6c 73 65 20 69 66 28 20 69 44 69 72 65   }else if( iDire
8f20: 63 74 45 71 5b 30 5d 3e 3d 30 20 7c 7c 20 69 44  ctEq[0]>=0 || iD
8f30: 69 72 65 63 74 4c 74 5b 30 5d 3e 3d 30 20 7c 7c  irectLt[0]>=0 ||
8f40: 20 69 44 69 72 65 63 74 47 74 5b 30 5d 3e 3d 30   iDirectGt[0]>=0
8f50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
8f60: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  the left-most co
8f70: 6c 75 6d 6e 20 69 73 20 61 63 63 65 73 73 65 64  lumn is accessed
8f80: 20 75 73 69 6e 67 20 69 74 73 20 52 4f 57 49 44   using its ROWID
8f90: 2c 20 74 68 65 6e 20 64 6f 0a 20 20 20 20 20 20  , then do.      
8fa0: 2a 2a 20 6e 6f 74 20 74 72 79 20 74 6f 20 73 6f  ** not try to so
8fb0: 72 74 20 62 79 20 69 6e 64 65 78 2e 20 20 42 75  rt by index.  Bu
8fc0: 74 20 64 6f 20 64 65 6c 65 74 65 20 74 68 65 20  t do delete the 
8fd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a  ORDER BY clause.
8fe0: 20 20 20 20 20 20 2a 2a 20 69 66 20 69 74 20 69        ** if it i
8ff0: 73 20 72 65 64 75 6e 64 61 6e 74 2e 0a 20 20 20  s redundant..   
9000: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20     */.    }else 
9010: 69 66 28 20 28 70 4c 65 76 65 6c 30 2d 3e 73 63  if( (pLevel0->sc
9020: 6f 72 65 26 32 29 21 3d 30 20 29 7b 0a 20 20 20  ore&2)!=0 ){.   
9030: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
9040: 74 68 61 74 20 77 61 73 20 73 65 6c 65 63 74 65  that was selecte
9050: 64 20 66 6f 72 20 73 65 61 72 63 68 69 6e 67 20  d for searching 
9060: 77 69 6c 6c 20 63 61 75 73 65 20 72 6f 77 73 20  will cause rows 
9070: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 70 70 65  to.      ** appe
9080: 61 72 20 69 6e 20 73 6f 72 74 65 64 20 6f 72 64  ar in sorted ord
9090: 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
90a0: 20 20 20 2a 70 70 4f 72 64 65 72 42 79 20 3d 20     *ppOrderBy = 
90b0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
90c0: 2f 2a 20 4f 70 65 6e 20 61 6c 6c 20 74 61 62 6c  /* Open all tabl
90d0: 65 73 20 69 6e 20 74 68 65 20 70 54 61 62 4c 69  es in the pTabLi
90e0: 73 74 20 61 6e 64 20 61 6e 79 20 69 6e 64 69 63  st and any indic
90f0: 65 73 20 73 65 6c 65 63 74 65 64 20 66 6f 72 0a  es selected for.
9100: 20 20 2a 2a 20 73 65 61 72 63 68 69 6e 67 20 74    ** searching t
9110: 68 6f 73 65 20 74 61 62 6c 65 73 2e 0a 20 20 2a  hose tables..  *
9120: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56  /.  sqlite3CodeV
9130: 65 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72  erifySchema(pPar
9140: 73 65 2c 20 2d 31 29 3b 20 2f 2a 20 49 6e 73 65  se, -1); /* Inse
9150: 72 74 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 65  rt the cookie ve
9160: 72 69 66 69 65 72 20 47 6f 74 6f 20 2a 2f 0a 20  rifier Goto */. 
9170: 20 70 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f   pLevel = pWInfo
9180: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  ->a;.  for(i=0, 
9190: 70 54 61 62 49 74 65 6d 3d 70 54 61 62 4c 69 73  pTabItem=pTabLis
91a0: 74 2d 3e 61 3b 20 69 3c 70 54 61 62 4c 69 73 74  t->a; i<pTabList
91b0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 54 61  ->nSrc; i++, pTa
91c0: 62 49 74 65 6d 2b 2b 2c 20 70 4c 65 76 65 6c 2b  bItem++, pLevel+
91d0: 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  +){.    Table *p
91e0: 54 61 62 3b 0a 20 20 20 20 49 6e 64 65 78 20 2a  Tab;.    Index *
91f0: 70 49 78 3b 0a 20 20 20 20 69 6e 74 20 69 49 64  pIx;.    int iId
9200: 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e 69  xCur = pLevel->i
9210: 49 64 78 43 75 72 3b 0a 0a 20 20 20 20 70 54 61  IdxCur;..    pTa
9220: 62 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 70 54  b = pTabItem->pT
9230: 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54 61 62  ab;.    if( pTab
9240: 2d 3e 69 73 54 72 61 6e 73 69 65 6e 74 20 7c 7c  ->isTransient ||
9250: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
9260: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
9270: 66 28 20 28 70 4c 65 76 65 6c 2d 3e 73 63 6f 72  f( (pLevel->scor
9280: 65 20 26 20 31 29 3d 3d 30 20 29 7b 0a 20 20 20  e & 1)==0 ){.   
9290: 20 20 20 73 71 6c 69 74 65 33 4f 70 65 6e 54 61     sqlite3OpenTa
92a0: 62 6c 65 46 6f 72 52 65 61 64 69 6e 67 28 76 2c  bleForReading(v,
92b0: 20 70 54 61 62 49 74 65 6d 2d 3e 69 43 75 72 73   pTabItem->iCurs
92c0: 6f 72 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 7d  or, pTab);.    }
92d0: 0a 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 54 61  .    pLevel->iTa
92e0: 62 43 75 72 20 3d 20 70 54 61 62 49 74 65 6d 2d  bCur = pTabItem-
92f0: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
9300: 28 20 28 70 49 78 20 3d 20 70 4c 65 76 65 6c 2d  ( (pIx = pLevel-
9310: 3e 70 49 64 78 29 21 3d 30 20 29 7b 0a 20 20 20  >pIdx)!=0 ){.   
9320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9330: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9340: 72 2c 20 70 49 78 2d 3e 69 44 62 2c 20 30 29 3b  r, pIx->iDb, 0);
9350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9360: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4f 70 65 6e  beOp3(v, OP_Open
9370: 52 65 61 64 2c 20 69 49 64 78 43 75 72 2c 20 70  Read, iIdxCur, p
9380: 49 78 2d 3e 74 6e 75 6d 2c 0a 20 20 20 20 20 20  Ix->tnum,.      
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
93a0: 63 68 61 72 2a 29 26 70 49 78 2d 3e 6b 65 79 49  char*)&pIx->keyI
93b0: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
93c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
93d0: 28 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26  (pLevel->score &
93e0: 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   1)!=0 ){.      
93f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9400: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
9410: 75 6d 6e 73 2c 20 69 49 64 78 43 75 72 2c 20 70  umns, iIdxCur, p
9420: 49 78 2d 3e 6e 43 6f 6c 75 6d 6e 2b 31 29 3b 0a  Ix->nColumn+1);.
9430: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
9440: 33 43 6f 64 65 56 65 72 69 66 79 53 63 68 65 6d  3CodeVerifySchem
9450: 61 28 70 50 61 72 73 65 2c 20 70 54 61 62 2d 3e  a(pParse, pTab->
9460: 69 44 62 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  iDb);..#ifdef SQ
9470: 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 2f 2a  LITE_TEST.    /*
9480: 20 52 65 63 6f 72 64 20 69 6e 20 74 68 65 20 71   Record in the q
9490: 75 65 72 79 20 70 6c 61 6e 20 69 6e 66 6f 72 6d  uery plan inform
94a0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
94b0: 63 75 72 72 65 6e 74 20 74 61 62 6c 65 0a 20 20  current table.  
94c0: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 64    ** and the ind
94d0: 65 78 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  ex used to acces
94e0: 73 20 69 74 20 28 69 66 20 61 6e 79 29 2e 20 20  s it (if any).  
94f0: 49 66 20 74 68 65 20 74 61 62 6c 65 20 69 74 73  If the table its
9500: 65 6c 66 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f  elf.    ** is no
9510: 74 20 75 73 65 64 2c 20 69 74 73 20 6e 61 6d 65  t used, its name
9520: 20 69 73 20 6a 75 73 74 20 27 7b 7d 27 2e 20 20   is just '{}'.  
9530: 49 66 20 6e 6f 20 69 6e 64 65 78 20 69 73 20 75  If no index is u
9540: 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  sed.    ** the i
9550: 6e 64 65 78 20 69 73 20 6c 69 73 74 65 64 20 61  ndex is listed a
9560: 73 20 22 7b 7d 22 0a 20 20 20 20 2a 2f 0a 20 20  s "{}".    */.  
9570: 20 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a    {.      char *
9580: 7a 20 3d 20 70 54 61 62 49 74 65 6d 2d 3e 7a 41  z = pTabItem->zA
9590: 6c 69 61 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  lias;.      int 
95a0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  n;.      if( z==
95b0: 30 20 29 20 7a 20 3d 20 70 54 61 62 2d 3e 7a 4e  0 ) z = pTab->zN
95c0: 61 6d 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73  ame;.      n = s
95d0: 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 20 20 20 20  trlen(z);.      
95e0: 69 66 28 20 6e 2b 6e 51 50 6c 61 6e 20 3c 20 73  if( n+nQPlan < s
95f0: 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 71 75  izeof(sqlite3_qu
9600: 65 72 79 5f 70 6c 61 6e 29 2d 31 30 20 29 7b 0a  ery_plan)-10 ){.
9610: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4c 65          if( (pLe
9620: 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20 31 29 21  vel->score & 1)!
9630: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
9640: 73 74 72 63 70 79 28 26 73 71 6c 69 74 65 33 5f  strcpy(&sqlite3_
9650: 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61  query_plan[nQPla
9660: 6e 5d 2c 20 22 7b 7d 22 29 3b 0a 20 20 20 20 20  n], "{}");.     
9670: 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b 3d 20 32       nQPlan += 2
9680: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
9690: 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 63 70  .          strcp
96a0: 79 28 26 73 71 6c 69 74 65 33 5f 71 75 65 72 79  y(&sqlite3_query
96b0: 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 2c 20 7a  _plan[nQPlan], z
96c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 51 50  );.          nQP
96d0: 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20  lan += n;.      
96e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
96f0: 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
9700: 51 50 6c 61 6e 2b 2b 5d 20 3d 20 27 20 27 3b 0a  QPlan++] = ' ';.
9710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
9720: 28 20 70 49 78 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pIx==0 ){.    
9730: 20 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69      strcpy(&sqli
9740: 74 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e  te3_query_plan[n
9750: 51 50 6c 61 6e 5d 2c 20 22 20 7b 7d 22 29 3b 0a  QPlan], " {}");.
9760: 20 20 20 20 20 20 20 20 6e 51 50 6c 61 6e 20 2b          nQPlan +
9770: 3d 20 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 3;.      }else
9780: 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74  {.        n = st
9790: 72 6c 65 6e 28 70 49 78 2d 3e 7a 4e 61 6d 65 29  rlen(pIx->zName)
97a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 2b  ;.        if( n+
97b0: 6e 51 50 6c 61 6e 20 3c 20 73 69 7a 65 6f 66 28  nQPlan < sizeof(
97c0: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
97d0: 61 6e 29 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  an)-2 ){.       
97e0: 20 20 20 73 74 72 63 70 79 28 26 73 71 6c 69 74     strcpy(&sqlit
97f0: 65 33 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 6e 51  e3_query_plan[nQ
9800: 50 6c 61 6e 5d 2c 20 70 49 78 2d 3e 7a 4e 61 6d  Plan], pIx->zNam
9810: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 51  e);.          nQ
9820: 50 6c 61 6e 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  Plan += n;.     
9830: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 71 75 65       sqlite3_que
9840: 72 79 5f 70 6c 61 6e 5b 6e 51 50 6c 61 6e 2b 2b  ry_plan[nQPlan++
9850: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
9860: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
9870: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 57  .#endif.  }.  pW
9880: 49 6e 66 6f 2d 3e 69 54 6f 70 20 3d 20 73 71 6c  Info->iTop = sql
9890: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
98a0: 64 64 72 28 76 29 3b 0a 0a 23 69 66 64 65 66 20  ddr(v);..#ifdef 
98b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
98c0: 20 54 65 72 6d 69 6e 61 74 65 20 74 68 65 20 71   Terminate the q
98d0: 75 65 72 79 20 70 6c 61 6e 20 64 65 73 63 72 69  uery plan descri
98e0: 70 74 69 6f 6e 0a 20 20 2a 2f 0a 20 20 77 68 69  ption.  */.  whi
98f0: 6c 65 28 20 6e 51 50 6c 61 6e 3e 30 20 26 26 20  le( nQPlan>0 && 
9900: 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70 6c  sqlite3_query_pl
9910: 61 6e 5b 6e 51 50 6c 61 6e 2d 31 5d 3d 3d 27 20  an[nQPlan-1]==' 
9920: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ' ){.    sqlite3
9930: 5f 71 75 65 72 79 5f 70 6c 61 6e 5b 2d 2d 6e 51  _query_plan[--nQ
9940: 50 6c 61 6e 5d 20 3d 20 30 3b 0a 20 20 7d 0a 20  Plan] = 0;.  }. 
9950: 20 73 71 6c 69 74 65 33 5f 71 75 65 72 79 5f 70   sqlite3_query_p
9960: 6c 61 6e 5b 6e 51 50 6c 61 6e 5d 20 3d 20 30 3b  lan[nQPlan] = 0;
9970: 0a 20 20 6e 51 50 6c 61 6e 20 3d 20 30 3b 0a 23  .  nQPlan = 0;.#
9980: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 65 6e 65  endif..  /* Gene
9990: 72 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 6f  rate the code to
99a0: 20 64 6f 20 74 68 65 20 73 65 61 72 63 68 0a 20   do the search. 
99b0: 20 2a 2f 0a 20 20 6c 6f 6f 70 4d 61 73 6b 20 3d   */.  loopMask =
99c0: 20 30 3b 0a 20 20 70 4c 65 76 65 6c 20 3d 20 70   0;.  pLevel = p
99d0: 57 49 6e 66 6f 2d 3e 61 3b 0a 20 20 70 54 61 62  WInfo->a;.  pTab
99e0: 49 74 65 6d 20 3d 20 70 54 61 62 4c 69 73 74 2d  Item = pTabList-
99f0: 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  >a;.  for(i=0; i
9a00: 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pTabList->nSrc;
9a10: 20 69 2b 2b 2c 20 70 54 61 62 49 74 65 6d 2b 2b   i++, pTabItem++
9a20: 2c 20 70 4c 65 76 65 6c 2b 2b 29 7b 0a 20 20 20  , pLevel++){.   
9a30: 20 69 6e 74 20 6a 2c 20 6b 3b 0a 20 20 20 20 69   int j, k;.    i
9a40: 6e 74 20 69 43 75 72 20 3d 20 70 54 61 62 49 74  nt iCur = pTabIt
9a50: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 20 20 2f 2a  em->iCursor;  /*
9a60: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
9a70: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 2a   for the table *
9a80: 2f 0a 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64  /.    Index *pId
9a90: 78 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  x;       /* The 
9aa0: 69 6e 64 65 78 20 77 65 20 77 69 6c 6c 20 62 65  index we will be
9ab0: 20 75 73 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e   using */.    in
9ac0: 74 20 69 49 64 78 43 75 72 3b 20 20 20 20 20 20  t iIdxCur;      
9ad0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 63 75 72   /* The VDBE cur
9ae0: 73 6f 72 20 66 6f 72 20 74 68 65 20 69 6e 64 65  sor for the inde
9af0: 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 6d 69  x */.    int omi
9b00: 74 54 61 62 6c 65 3b 20 20 20 20 20 2f 2a 20 54  tTable;     /* T
9b10: 72 75 65 20 69 66 20 77 65 20 75 73 65 20 74 68  rue if we use th
9b20: 65 20 69 6e 64 65 78 20 6f 6e 6c 79 20 2a 2f 0a  e index only */.
9b30: 0a 20 20 20 20 70 49 64 78 20 3d 20 70 4c 65 76  .    pIdx = pLev
9b40: 65 6c 2d 3e 70 49 64 78 3b 0a 20 20 20 20 69 49  el->pIdx;.    iI
9b50: 64 78 43 75 72 20 3d 20 70 4c 65 76 65 6c 2d 3e  dxCur = pLevel->
9b60: 69 49 64 78 43 75 72 3b 0a 20 20 20 20 70 4c 65  iIdxCur;.    pLe
9b70: 76 65 6c 2d 3e 69 6e 4f 70 20 3d 20 4f 50 5f 4e  vel->inOp = OP_N
9b80: 6f 6f 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  oop;..    /* Che
9b90: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74 20  ck to see if it 
9ba0: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 74  is appropriate t
9bb0: 6f 20 6f 6d 69 74 20 74 68 65 20 75 73 65 20 6f  o omit the use o
9bc0: 66 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20  f the table.    
9bd0: 2a 2a 20 68 65 72 65 20 61 6e 64 20 75 73 65 20  ** here and use 
9be0: 69 74 73 20 69 6e 64 65 78 20 69 6e 73 74 65 61  its index instea
9bf0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6f 6d  d..    */.    om
9c00: 69 74 54 61 62 6c 65 20 3d 20 28 70 4c 65 76 65  itTable = (pLeve
9c10: 6c 2d 3e 73 63 6f 72 65 26 31 29 21 3d 30 3b 0a  l->score&1)!=0;.
9c20: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
9c30: 69 73 20 74 68 65 20 72 69 67 68 74 20 74 61 62  is the right tab
9c40: 6c 65 20 6f 66 20 61 20 4c 45 46 54 20 4f 55 54  le of a LEFT OUT
9c50: 45 52 20 4a 4f 49 4e 2c 20 61 6c 6c 6f 63 61 74  ER JOIN, allocat
9c60: 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 6e 69  e and.    ** ini
9c70: 74 69 61 6c 69 7a 65 20 61 20 6d 65 6d 6f 72 79  tialize a memory
9c80: 20 63 65 6c 6c 20 74 68 61 74 20 72 65 63 6f 72   cell that recor
9c90: 64 73 20 69 66 20 74 68 69 73 20 74 61 62 6c 65  ds if this table
9ca0: 20 6d 61 74 63 68 65 73 20 61 6e 79 0a 20 20 20   matches any.   
9cb0: 20 2a 2a 20 72 6f 77 20 6f 66 20 74 68 65 20 6c   ** row of the l
9cc0: 65 66 74 20 74 61 62 6c 65 20 6f 66 20 74 68 65  eft table of the
9cd0: 20 6a 6f 69 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20   join..    */.  
9ce0: 20 20 69 66 28 20 69 3e 30 20 26 26 20 28 70 54    if( i>0 && (pT
9cf0: 61 62 4c 69 73 74 2d 3e 61 5b 69 2d 31 5d 2e 6a  abList->a[i-1].j
9d00: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
9d10: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  T)!=0 ){.      i
9d20: 66 28 20 21 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  f( !pParse->nMem
9d30: 20 29 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   ) pParse->nMem+
9d40: 2b 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d  +;.      pLevel-
9d50: 3e 69 4c 65 66 74 4a 6f 69 6e 20 3d 20 70 50 61  >iLeftJoin = pPa
9d60: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
9d70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9d80: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
9d90: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
9da0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9db0: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c   OP_MemStore, pL
9dc0: 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69 6e 2c  evel->iLeftJoin,
9dd0: 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43   1);.      VdbeC
9de0: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 69 6e  omment((v, "# in
9df0: 69 74 20 4c 45 46 54 20 4a 4f 49 4e 20 6e 6f 2d  it LEFT JOIN no-
9e00: 6d 61 74 63 68 20 66 6c 61 67 22 29 29 3b 0a 20  match flag"));. 
9e10: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 3c     }..    if( i<
9e20: 41 52 52 41 59 53 49 5a 45 28 69 44 69 72 65 63  ARRAYSIZE(iDirec
9e30: 74 45 71 29 20 26 26 20 28 6b 20 3d 20 69 44 69  tEq) && (k = iDi
9e40: 72 65 63 74 45 71 5b 69 5d 29 3e 3d 30 20 29 7b  rectEq[i])>=0 ){
9e50: 0a 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31  .      /* Case 1
9e60: 3a 20 20 57 65 20 63 61 6e 20 64 69 72 65 63 74  :  We can direct
9e70: 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73  ly reference a s
9e80: 69 6e 67 6c 65 20 72 6f 77 20 75 73 69 6e 67 20  ingle row using 
9e90: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  an.      **     
9ea0: 20 20 20 20 20 65 71 75 61 6c 69 74 79 20 63 6f       equality co
9eb0: 6d 70 61 72 69 73 6f 6e 20 61 67 61 69 6e 73 74  mparison against
9ec0: 20 74 68 65 20 52 4f 57 49 44 20 66 69 65 6c 64   the ROWID field
9ed0: 2e 20 20 4f 72 0a 20 20 20 20 20 20 2a 2a 20 20  .  Or.      **  
9ee0: 20 20 20 20 20 20 20 20 77 65 20 72 65 66 65 72          we refer
9ef0: 65 6e 63 65 20 6d 75 6c 74 69 70 6c 65 20 72 6f  ence multiple ro
9f00: 77 73 20 75 73 69 6e 67 20 61 20 22 72 6f 77 69  ws using a "rowi
9f10: 64 20 49 4e 20 28 2e 2e 2e 29 22 0a 20 20 20 20  d IN (...)".    
9f20: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 63 6f    **          co
9f30: 6e 73 74 72 75 63 74 2e 0a 20 20 20 20 20 20 2a  nstruct..      *
9f40: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
9f50: 6b 3c 77 63 2e 6e 54 65 72 6d 20 29 3b 0a 20 20  k<wc.nTerm );.  
9f60: 20 20 20 20 70 54 65 72 6d 20 3d 20 26 77 63 2e      pTerm = &wc.
9f70: 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  a[k];.      asse
9f80: 72 74 28 20 70 54 65 72 6d 2d 3e 70 21 3d 30 20  rt( pTerm->p!=0 
9f90: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
9fa0: 20 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d   pTerm->idxLeft=
9fb0: 3d 69 43 75 72 20 29 3b 0a 20 20 20 20 20 20 61  =iCur );.      a
9fc0: 73 73 65 72 74 28 20 6f 6d 69 74 54 61 62 6c 65  ssert( omitTable
9fd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72 6b  ==0 );.      brk
9fe0: 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 20 3d   = pLevel->brk =
9ff0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
a000: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
a010: 63 6f 64 65 45 71 75 61 6c 69 74 79 54 65 72 6d  codeEqualityTerm
a020: 28 70 50 61 72 73 65 2c 20 70 54 65 72 6d 2c 20  (pParse, pTerm, 
a030: 62 72 6b 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20  brk, pLevel);.  
a040: 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65      cont = pLeve
a050: 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  l->cont = sqlite
a060: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a070: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a080: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a090: 4d 75 73 74 42 65 49 6e 74 2c 20 31 2c 20 62 72  MustBeInt, 1, br
a0a0: 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  k);.      sqlite
a0b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a0c0: 5f 4e 6f 74 45 78 69 73 74 73 2c 20 69 43 75 72  _NotExists, iCur
a0d0: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 56 64  , brk);.      Vd
a0e0: 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70  beComment((v, "p
a0f0: 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 4c 65 76  k"));.      pLev
a100: 65 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 6f 6f 70  el->op = OP_Noop
a110: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a120: 70 49 64 78 21 3d 30 20 26 26 20 70 4c 65 76 65  pIdx!=0 && pLeve
a130: 6c 2d 3e 73 63 6f 72 65 3e 33 20 26 26 20 28 70  l->score>3 && (p
a140: 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 26 30 78 30  Level->score&0x0
a150: 63 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  c)==0 ){.      /
a160: 2a 20 43 61 73 65 20 32 3a 20 20 54 68 65 72 65  * Case 2:  There
a170: 20 69 73 20 61 6e 20 69 6e 64 65 78 20 61 6e 64   is an index and
a180: 20 61 6c 6c 20 74 65 72 6d 73 20 6f 66 20 74 68   all terms of th
a190: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  e WHERE clause t
a1a0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  hat.      **    
a1b0: 20 20 20 20 20 20 72 65 66 65 72 20 74 6f 20 74        refer to t
a1c0: 68 65 20 69 6e 64 65 78 20 75 73 69 6e 67 20 74  he index using t
a1d0: 68 65 20 22 3d 3d 22 20 6f 72 20 22 49 4e 22 20  he "==" or "IN" 
a1e0: 6f 70 65 72 61 74 6f 72 73 2e 0a 20 20 20 20 20  operators..     
a1f0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 74   */.      int st
a200: 61 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  art;.      int n
a210: 43 6f 6c 75 6d 6e 20 3d 20 28 70 4c 65 76 65 6c  Column = (pLevel
a220: 2d 3e 73 63 6f 72 65 2b 31 36 29 2f 33 32 3b 0a  ->score+16)/32;.
a230: 20 20 20 20 20 20 62 72 6b 20 3d 20 70 4c 65 76        brk = pLev
a240: 65 6c 2d 3e 62 72 6b 20 3d 20 73 71 6c 69 74 65  el->brk = sqlite
a250: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
a260: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72  );..      /* For
a270: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20   each column of 
a280: 74 68 65 20 69 6e 64 65 78 2c 20 66 69 6e 64 20  the index, find 
a290: 74 68 65 20 74 65 72 6d 20 6f 66 20 74 68 65 20  the term of the 
a2a0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 74 68 61  WHERE clause tha
a2b0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 74  t.      ** const
a2c0: 72 61 69 6e 74 73 20 74 68 61 74 20 63 6f 6c 75  raints that colu
a2d0: 6d 6e 2e 20 20 49 66 20 74 68 65 20 57 48 45 52  mn.  If the WHER
a2e0: 45 20 63 6c 61 75 73 65 20 74 65 72 6d 20 69 73  E clause term is
a2f0: 20 58 3d 65 78 70 72 2c 20 74 68 65 6e 0a 20 20   X=expr, then.  
a300: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
a310: 63 6f 64 65 20 74 6f 20 65 76 61 6c 75 61 74 65  code to evaluate
a320: 20 65 78 70 72 20 61 6e 64 20 6c 65 61 76 65 20   expr and leave 
a330: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
a340: 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 20  e stack */.     
a350: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 43 6f 6c   for(j=0; j<nCol
a360: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
a370: 20 20 20 66 6f 72 28 70 54 65 72 6d 3d 77 63 2e     for(pTerm=wc.
a380: 61 2c 20 6b 3d 30 3b 20 6b 3c 77 63 2e 6e 54 65  a, k=0; k<wc.nTe
a390: 72 6d 3b 20 6b 2b 2b 2c 20 70 54 65 72 6d 2b 2b  rm; k++, pTerm++
a3a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
a3b0: 72 20 2a 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70  r *pX = pTerm->p
a3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a3d0: 70 58 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pX==0 ) continue
a3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a3f0: 70 54 65 72 6d 2d 3e 69 64 78 4c 65 66 74 3d 3d  pTerm->idxLeft==
a400: 69 43 75 72 0a 20 20 20 20 20 20 20 20 20 20 20  iCur.           
a410: 20 20 26 26 20 28 70 54 65 72 6d 2d 3e 70 72 65    && (pTerm->pre
a420: 72 65 71 52 69 67 68 74 20 26 20 6c 6f 6f 70 4d  reqRight & loopM
a430: 61 73 6b 29 3d 3d 70 54 65 72 6d 2d 3e 70 72 65  ask)==pTerm->pre
a440: 72 65 71 52 69 67 68 74 20 0a 20 20 20 20 20 20  reqRight .      
a450: 20 20 20 20 20 20 20 26 26 20 70 58 2d 3e 70 4c         && pX->pL
a460: 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 49  eft->iColumn==pI
a470: 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d 0a  dx->aiColumn[j].
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
a490: 28 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  (pX->op==TK_EQ |
a4a0: 7c 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 29  | pX->op==TK_IN)
a4b0: 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
a4c0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 69            char i
a4d0: 64 78 61 66 66 20 3d 20 70 49 64 78 2d 3e 70 54  dxaff = pIdx->pT
a4e0: 61 62 6c 65 2d 3e 61 43 6f 6c 5b 70 58 2d 3e 70  able->aCol[pX->p
a4f0: 4c 65 66 74 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Left->iColumn].a
a500: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
a510: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
a520: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
a530: 70 58 2c 20 69 64 78 61 66 66 29 20 29 7b 0a 20  pX, idxaff) ){. 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 64               cod
a550: 65 45 71 75 61 6c 69 74 79 54 65 72 6d 28 70 50  eEqualityTerm(pP
a560: 61 72 73 65 2c 20 70 54 65 72 6d 2c 20 62 72 6b  arse, pTerm, brk
a570: 2c 20 70 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  , pLevel);.     
a580: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a590: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a5a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a5b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a5c0: 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 20 3d    pLevel->iMem =
a5d0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
a5e0: 0a 20 20 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c  .      cont = pL
a5f0: 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c  evel->cont = sql
a600: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
a610: 6c 28 76 29 3b 0a 20 20 20 20 20 20 62 75 69 6c  l(v);.      buil
a620: 64 49 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e  dIndexProbe(v, n
a630: 43 6f 6c 75 6d 6e 2c 20 62 72 6b 2c 20 70 49 64  Column, brk, pId
a640: 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  x);.      sqlite
a650: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a660: 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76 65  _MemStore, pLeve
a670: 6c 2d 3e 69 4d 65 6d 2c 20 30 29 3b 0a 0a 20 20  l->iMem, 0);..  
a680: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
a690: 63 6f 64 65 20 28 31 29 20 74 6f 20 6d 6f 76 65  code (1) to move
a6a0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6d 61   to the first ma
a6b0: 74 63 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f  tching element o
a6c0: 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 20 20 20  f the table..   
a6d0: 20 20 20 2a 2a 20 54 68 65 6e 20 67 65 6e 65 72     ** Then gener
a6e0: 61 74 65 20 63 6f 64 65 20 28 32 29 20 74 68 61  ate code (2) tha
a6f0: 74 20 6a 75 6d 70 73 20 74 6f 20 22 62 72 6b 22  t jumps to "brk"
a700: 20 61 66 74 65 72 20 74 68 65 20 63 75 72 73 6f   after the curso
a710: 72 20 69 73 20 70 61 73 74 0a 20 20 20 20 20 20  r is past.      
a720: 2a 2a 20 74 68 65 20 6c 61 73 74 20 6d 61 74 63  ** the last matc
a730: 68 69 6e 67 20 65 6c 65 6d 65 6e 74 20 6f 66 20  hing element of 
a740: 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20  the table.  The 
a750: 63 6f 64 65 20 28 31 29 20 69 73 20 65 78 65 63  code (1) is exec
a760: 75 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 6f 6e  uted.      ** on
a770: 63 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ce to initialize
a780: 20 74 68 65 20 73 65 61 72 63 68 2c 20 74 68 65   the search, the
a790: 20 63 6f 64 65 20 28 32 29 20 69 73 20 65 78 65   code (2) is exe
a7a0: 63 75 74 65 64 20 62 65 66 6f 72 65 20 65 61 63  cuted before eac
a7b0: 68 0a 20 20 20 20 20 20 2a 2a 20 69 74 65 72 61  h.      ** itera
a7c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 61 6e  tion of the scan
a7d0: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 73   to see if the s
a7e0: 63 61 6e 20 68 61 73 20 66 69 6e 69 73 68 65 64  can has finished
a7f0: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  . */.      if( p
a800: 4c 65 76 65 6c 2d 3e 62 52 65 76 20 29 7b 0a 20  Level->bRev ){. 
a810: 20 20 20 20 20 20 20 2f 2a 20 53 63 61 6e 20 69         /* Scan i
a820: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
a830: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
a840: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a850: 50 5f 4d 6f 76 65 4c 65 2c 20 69 49 64 78 43 75  P_MoveLe, iIdxCu
a860: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
a870: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
a880: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a890: 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
a8a0: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
a8b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a8c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 4c 54 2c  dOp(v, OP_IdxLT,
a8d0: 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b 0a   iIdxCur, brk);.
a8e0: 20 20 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e          pLevel->
a8f0: 6f 70 20 3d 20 4f 50 5f 50 72 65 76 3b 0a 20 20  op = OP_Prev;.  
a900: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a910: 20 20 20 2f 2a 20 53 63 61 6e 20 69 6e 20 74 68     /* Scan in th
a920: 65 20 66 6f 72 77 61 72 64 20 6f 72 64 65 72 20  e forward order 
a930: 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
a940: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a950: 50 5f 4d 6f 76 65 47 65 2c 20 69 49 64 78 43 75  P_MoveGe, iIdxCu
a960: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20  r, brk);.       
a970: 20 73 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33   start = sqlite3
a980: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a990: 4d 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d  MemLoad, pLevel-
a9a0: 3e 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 20  >iMem, 0);.     
a9b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a9c0: 33 28 76 2c 20 4f 50 5f 49 64 78 47 45 2c 20 69  3(v, OP_IdxGE, i
a9d0: 49 64 78 43 75 72 2c 20 62 72 6b 2c 20 22 2b 22  IdxCur, brk, "+"
a9e0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
a9f0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
aa00: 20 3d 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20 20   = OP_Next;.    
aa10: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
aa20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa30: 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43 75 72  _RowKey, iIdxCur
aa40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
aa50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
aa60: 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20 6e 43  OP_IdxIsNull, nC
aa70: 6f 6c 75 6d 6e 2c 20 63 6f 6e 74 29 3b 0a 20 20  olumn, cont);.  
aa80: 20 20 20 20 69 66 28 20 21 6f 6d 69 74 54 61 62      if( !omitTab
aa90: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  le ){.        sq
aaa0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aab0: 2c 20 4f 50 5f 49 64 78 52 6f 77 69 64 2c 20 69  , OP_IdxRowid, i
aac0: 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20 20  IdxCur, 0);.    
aad0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
aae0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 6f 76 65 47  ddOp(v, OP_MoveG
aaf0: 65 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20  e, iCur, 0);.   
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 65 76 65     }.      pLeve
ab10: 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
ab20: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
ab30: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
ab40: 65 6c 73 65 20 69 66 28 20 69 3c 41 52 52 41 59  else if( i<ARRAY
ab50: 53 49 5a 45 28 69 44 69 72 65 63 74 4c 74 29 20  SIZE(iDirectLt) 
ab60: 26 26 20 28 69 44 69 72 65 63 74 4c 74 5b 69 5d  && (iDirectLt[i]
ab70: 3e 3d 30 20 7c 7c 20 69 44 69 72 65 63 74 47 74  >=0 || iDirectGt
ab80: 5b 69 5d 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20  [i]>=0) ){.     
ab90: 20 2f 2a 20 43 61 73 65 20 33 3a 20 20 57 65 20   /* Case 3:  We 
aba0: 68 61 76 65 20 61 6e 20 69 6e 65 71 75 61 6c 69  have an inequali
abb0: 74 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 67  ty comparison ag
abc0: 61 69 6e 73 74 20 74 68 65 20 52 4f 57 49 44 20  ainst the ROWID 
abd0: 66 69 65 6c 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  field..      */.
abe0: 20 20 20 20 20 20 69 6e 74 20 74 65 73 74 4f 70        int testOp
abf0: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20   = OP_Noop;.    
ac00: 20 20 69 6e 74 20 73 74 61 72 74 3b 0a 20 20 20    int start;.   
ac10: 20 20 20 69 6e 74 20 62 52 65 76 20 3d 20 70 4c     int bRev = pL
ac20: 65 76 65 6c 2d 3e 62 52 65 76 3b 0a 0a 20 20 20  evel->bRev;..   
ac30: 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74 54     assert( omitT
ac40: 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  able==0 );.     
ac50: 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62   brk = pLevel->b
ac60: 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rk = sqlite3Vdbe
ac70: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
ac80: 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76 65      cont = pLeve
ac90: 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74 65  l->cont = sqlite
aca0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
acb0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 52 65  );.      if( bRe
acc0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  v ){.        int
acd0: 20 74 20 3d 20 69 44 69 72 65 63 74 47 74 5b 69   t = iDirectGt[i
ace0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 44 69 72 65  ];.        iDire
acf0: 63 74 47 74 5b 69 5d 20 3d 20 69 44 69 72 65 63  ctGt[i] = iDirec
ad00: 74 4c 74 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  tLt[i];.        
ad10: 69 44 69 72 65 63 74 4c 74 5b 69 5d 20 3d 20 74  iDirectLt[i] = t
ad20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad30: 69 66 28 20 69 44 69 72 65 63 74 47 74 5b 69 5d  if( iDirectGt[i]
ad40: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  >=0 ){.        E
ad50: 78 70 72 20 2a 70 58 3b 0a 20 20 20 20 20 20 20  xpr *pX;.       
ad60: 20 6b 20 3d 20 69 44 69 72 65 63 74 47 74 5b 69   k = iDirectGt[i
ad70: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
ad80: 74 28 20 6b 3c 77 63 2e 6e 54 65 72 6d 20 29 3b  t( k<wc.nTerm );
ad90: 0a 20 20 20 20 20 20 20 20 70 54 65 72 6d 20 3d  .        pTerm =
ada0: 20 26 77 63 2e 61 5b 6b 5d 3b 0a 20 20 20 20 20   &wc.a[k];.     
adb0: 20 20 20 70 58 20 3d 20 70 54 65 72 6d 2d 3e 70     pX = pTerm->p
adc0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
add0: 28 20 70 58 21 3d 30 20 29 3b 0a 20 20 20 20 20  ( pX!=0 );.     
ade0: 20 20 20 61 73 73 65 72 74 28 20 70 54 65 72 6d     assert( pTerm
adf0: 2d 3e 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 20  ->idxLeft==iCur 
ae00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ae10: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
ae20: 65 2c 20 70 58 2d 3e 70 52 69 67 68 74 29 3b 0a  e, pX->pRight);.
ae30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ae40: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46  dbeAddOp(v, OP_F
ae50: 6f 72 63 65 49 6e 74 2c 20 70 58 2d 3e 6f 70 3d  orceInt, pX->op=
ae60: 3d 54 4b 5f 4c 45 20 7c 7c 20 70 58 2d 3e 6f 70  =TK_LE || pX->op
ae70: 3d 3d 54 4b 5f 47 54 2c 20 62 72 6b 29 3b 0a 20  ==TK_GT, brk);. 
ae80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ae90: 62 65 41 64 64 4f 70 28 76 2c 20 62 52 65 76 20  beAddOp(v, bRev 
aea0: 3f 20 4f 50 5f 4d 6f 76 65 4c 74 20 3a 20 4f 50  ? OP_MoveLt : OP
aeb0: 5f 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 62  _MoveGe, iCur, b
aec0: 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  rk);.        Vdb
aed0: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 70 6b  eComment((v, "pk
aee0: 22 29 29 3b 0a 20 20 20 20 20 20 20 20 64 69 73  "));.        dis
aef0: 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65 6c 2c  ableTerm(pLevel,
af00: 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 20 20 20   &pTerm->p);.   
af10: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
af20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
af30: 4f 70 28 76 2c 20 62 52 65 76 20 3f 20 4f 50 5f  Op(v, bRev ? OP_
af40: 4c 61 73 74 20 3a 20 4f 50 5f 52 65 77 69 6e 64  Last : OP_Rewind
af50: 2c 20 69 43 75 72 2c 20 62 72 6b 29 3b 0a 20 20  , iCur, brk);.  
af60: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
af70: 69 44 69 72 65 63 74 4c 74 5b 69 5d 3e 3d 30 20  iDirectLt[i]>=0 
af80: 29 7b 0a 20 20 20 20 20 20 20 20 45 78 70 72 20  ){.        Expr 
af90: 2a 70 58 3b 0a 20 20 20 20 20 20 20 20 6b 20 3d  *pX;.        k =
afa0: 20 69 44 69 72 65 63 74 4c 74 5b 69 5d 3b 0a 20   iDirectLt[i];. 
afb0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b         assert( k
afc0: 3c 77 63 2e 6e 54 65 72 6d 20 29 3b 0a 20 20 20  <wc.nTerm );.   
afd0: 20 20 20 20 20 70 54 65 72 6d 20 3d 20 26 77 63       pTerm = &wc
afe0: 2e 61 5b 6b 5d 3b 0a 20 20 20 20 20 20 20 20 70  .a[k];.        p
aff0: 58 20 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20  X = pTerm->p;.  
b000: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 58        assert( pX
b010: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61  !=0 );.        a
b020: 73 73 65 72 74 28 20 70 54 65 72 6d 2d 3e 69 64  ssert( pTerm->id
b030: 78 4c 65 66 74 3d 3d 69 43 75 72 20 29 3b 0a 20  xLeft==iCur );. 
b040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
b050: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b060: 58 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  X->pRight);.    
b070: 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d      pLevel->iMem
b080: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
b090: 2b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  +;.        sqlit
b0a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b0b0: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 4c 65 76  P_MemStore, pLev
b0c0: 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b 0a 20 20  el->iMem, 1);.  
b0d0: 20 20 20 20 20 20 69 66 28 20 70 58 2d 3e 6f 70        if( pX->op
b0e0: 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d 3e 6f  ==TK_LT || pX->o
b0f0: 70 3d 3d 54 4b 5f 47 54 20 29 7b 0a 20 20 20 20  p==TK_GT ){.    
b100: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 62        testOp = b
b110: 52 65 76 20 3f 20 4f 50 5f 4c 65 20 3a 20 4f 50  Rev ? OP_Le : OP
b120: 5f 47 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  _Ge;.        }el
b130: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65  se{.          te
b140: 73 74 4f 70 20 3d 20 62 52 65 76 20 3f 20 4f 50  stOp = bRev ? OP
b150: 5f 4c 74 20 3a 20 4f 50 5f 47 74 3b 0a 20 20 20  _Lt : OP_Gt;.   
b160: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
b170: 69 73 61 62 6c 65 54 65 72 6d 28 70 4c 65 76 65  isableTerm(pLeve
b180: 6c 2c 20 26 70 54 65 72 6d 2d 3e 70 29 3b 0a 20  l, &pTerm->p);. 
b190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 61       }.      sta
b1a0: 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rt = sqlite3Vdbe
b1b0: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a  CurrentAddr(v);.
b1c0: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
b1d0: 20 3d 20 62 52 65 76 20 3f 20 4f 50 5f 50 72 65   = bRev ? OP_Pre
b1e0: 76 20 3a 20 4f 50 5f 4e 65 78 74 3b 0a 20 20 20  v : OP_Next;.   
b1f0: 20 20 20 70 4c 65 76 65 6c 2d 3e 70 31 20 3d 20     pLevel->p1 = 
b200: 69 43 75 72 3b 0a 20 20 20 20 20 20 70 4c 65 76  iCur;.      pLev
b210: 65 6c 2d 3e 70 32 20 3d 20 73 74 61 72 74 3b 0a  el->p2 = start;.
b220: 20 20 20 20 20 20 69 66 28 20 74 65 73 74 4f 70        if( testOp
b230: 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20  !=OP_Noop ){.   
b240: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b250: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 6f 77 69  AddOp(v, OP_Rowi
b260: 64 2c 20 69 43 75 72 2c 20 30 29 3b 0a 20 20 20  d, iCur, 0);.   
b270: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
b290: 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65  oad, pLevel->iMe
b2a0: 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  m, 0);.        s
b2b0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b2c0: 76 2c 20 74 65 73 74 4f 70 2c 20 27 6e 27 2c 20  v, testOp, 'n', 
b2d0: 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  brk);.      }.  
b2e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49 64 78    }else if( pIdx
b2f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
b300: 43 61 73 65 20 34 3a 20 20 54 68 65 72 65 20 69  Case 4:  There i
b310: 73 20 6e 6f 20 75 73 61 62 6c 65 20 69 6e 64 65  s no usable inde
b320: 78 2e 20 20 57 65 20 6d 75 73 74 20 64 6f 20 61  x.  We must do a
b330: 20 63 6f 6d 70 6c 65 74 65 0a 20 20 20 20 20 20   complete.      
b340: 2a 2a 20 20 20 20 20 20 20 20 20 20 73 63 61 6e  **          scan
b350: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
b360: 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 20  atabase table.. 
b370: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
b380: 74 20 73 74 61 72 74 3b 0a 20 20 20 20 20 20 69  t start;.      i
b390: 6e 74 20 6f 70 52 65 77 69 6e 64 3b 0a 0a 20 20  nt opRewind;..  
b3a0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 6d 69 74      assert( omit
b3b0: 54 61 62 6c 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Table==0 );.    
b3c0: 20 20 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e    brk = pLevel->
b3d0: 62 72 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62  brk = sqlite3Vdb
b3e0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b3f0: 20 20 20 20 20 63 6f 6e 74 20 3d 20 70 4c 65 76       cont = pLev
b400: 65 6c 2d 3e 63 6f 6e 74 20 3d 20 73 71 6c 69 74  el->cont = sqlit
b410: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b420: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  v);.      if( pL
b430: 65 76 65 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20  evel->bRev ){.  
b440: 20 20 20 20 20 20 6f 70 52 65 77 69 6e 64 20 3d        opRewind =
b450: 20 4f 50 5f 4c 61 73 74 3b 0a 20 20 20 20 20 20   OP_Last;.      
b460: 20 20 70 4c 65 76 65 6c 2d 3e 6f 70 20 3d 20 4f    pLevel->op = O
b470: 50 5f 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 65  P_Prev;.      }e
b480: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6f 70 52  lse{.        opR
b490: 65 77 69 6e 64 20 3d 20 4f 50 5f 52 65 77 69 6e  ewind = OP_Rewin
b4a0: 64 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  d;.        pLeve
b4b0: 6c 2d 3e 6f 70 20 3d 20 4f 50 5f 4e 65 78 74 3b  l->op = OP_Next;
b4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
b4d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b4e0: 76 2c 20 6f 70 52 65 77 69 6e 64 2c 20 69 43 75  v, opRewind, iCu
b4f0: 72 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 73  r, brk);.      s
b500: 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 56 64  tart = sqlite3Vd
b510: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
b520: 3b 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e  ;.      pLevel->
b530: 70 31 20 3d 20 69 43 75 72 3b 0a 20 20 20 20 20  p1 = iCur;.     
b540: 20 70 4c 65 76 65 6c 2d 3e 70 32 20 3d 20 73 74   pLevel->p2 = st
b550: 61 72 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  art;.    }else{.
b560: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 35 3a        /* Case 5:
b570: 20 54 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   The WHERE claus
b580: 65 20 74 65 72 6d 20 74 68 61 74 20 72 65 66 65  e term that refe
b590: 72 73 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d  rs to the right-
b5a0: 6d 6f 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20  most.      **   
b5b0: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 6f 66 20        column of 
b5c0: 74 68 65 20 69 6e 64 65 78 20 69 73 20 61 6e 20  the index is an 
b5d0: 69 6e 65 71 75 61 6c 69 74 79 2e 20 20 46 6f 72  inequality.  For
b5e0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 20 20 20   example, if.   
b5f0: 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 74 68     **         th
b600: 65 20 69 6e 64 65 78 20 69 73 20 6f 6e 20 28 78  e index is on (x
b610: 2c 79 2c 7a 29 20 61 6e 64 20 74 68 65 20 57 48  ,y,z) and the WH
b620: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 6f 66  ERE clause is of
b630: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 20 20   the.      **   
b640: 20 20 20 20 20 20 66 6f 72 6d 20 22 78 3d 35 20        form "x=5 
b650: 41 4e 44 20 79 3c 31 30 22 20 74 68 65 6e 20 74  AND y<10" then t
b660: 68 69 73 20 63 61 73 65 20 69 73 20 75 73 65 64  his case is used
b670: 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 20 20 20 20  .  Only the.    
b680: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 72 69 67    **         rig
b690: 68 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 63  ht-most column c
b6a0: 61 6e 20 62 65 20 61 6e 20 69 6e 65 71 75 61 6c  an be an inequal
b6b0: 69 74 79 20 2d 20 74 68 65 20 72 65 73 74 20 6d  ity - the rest m
b6c0: 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 20 20 20  ust.      **    
b6d0: 20 20 20 20 20 75 73 65 20 74 68 65 20 22 3d 3d       use the "==
b6e0: 22 20 6f 70 65 72 61 74 6f 72 2e 0a 20 20 20 20  " operator..    
b6f0: 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
b700: 20 20 20 20 20 20 54 68 69 73 20 63 61 73 65 20        This case 
b710: 69 73 20 61 6c 73 6f 20 75 73 65 64 20 77 68 65  is also used whe
b720: 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 57  n there are no W
b730: 48 45 52 45 20 63 6c 61 75 73 65 0a 20 20 20 20  HERE clause.    
b740: 20 20 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e    **         con
b750: 73 74 72 61 69 6e 74 73 20 62 75 74 20 61 6e 20  straints but an 
b760: 69 6e 64 65 78 20 69 73 20 73 65 6c 65 63 74 65  index is selecte
b770: 64 20 61 6e 79 77 61 79 2c 20 69 6e 20 6f 72 64  d anyway, in ord
b780: 65 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20  er.      **     
b790: 20 20 20 20 74 6f 20 66 6f 72 63 65 20 74 68 65      to force the
b7a0: 20 6f 75 74 70 75 74 20 6f 72 64 65 72 20 74 6f   output order to
b7b0: 20 63 6f 6e 66 6f 72 6d 20 74 6f 20 61 6e 20 4f   conform to an O
b7c0: 52 44 45 52 20 42 59 2e 0a 20 20 20 20 20 20 2a  RDER BY..      *
b7d0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 63 6f 72  /.      int scor
b7e0: 65 20 3d 20 70 4c 65 76 65 6c 2d 3e 73 63 6f 72  e = pLevel->scor
b7f0: 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 71  e;.      int nEq
b800: 43 6f 6c 75 6d 6e 20 3d 20 73 63 6f 72 65 2f 33  Column = score/3
b810: 32 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61  2;.      int sta
b820: 72 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65  rt;.      int le
b830: 46 6c 61 67 3d 30 2c 20 67 65 46 6c 61 67 3d 30  Flag=0, geFlag=0
b840: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 65 73 74  ;.      int test
b850: 4f 70 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 45 76  Op;..      /* Ev
b860: 61 6c 75 61 74 65 20 74 68 65 20 65 71 75 61 6c  aluate the equal
b870: 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a  ity constraints.
b880: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 66        */.      f
b890: 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 45 71 43 6f 6c  or(j=0; j<nEqCol
b8a0: 75 6d 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  umn; j++){.     
b8b0: 20 20 20 69 6e 74 20 69 49 64 78 43 6f 6c 20 3d     int iIdxCol =
b8c0: 20 70 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b   pIdx->aiColumn[
b8d0: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  j];.        for(
b8e0: 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6b 3d 30 3b  pTerm=wc.a, k=0;
b8f0: 20 6b 3c 77 63 2e 6e 54 65 72 6d 3b 20 6b 2b 2b   k<wc.nTerm; k++
b900: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
b910: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
b920: 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20   pTerm->p;.     
b930: 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
b940: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
b950: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
b960: 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20  idxLeft==iCur.  
b970: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 70 58             && pX
b980: 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 0a 20 20 20 20  ->op==TK_EQ.    
b990: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
b9a0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b9b0: 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65  & loopMask)==pTe
b9c0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
b9d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
b9e0: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
b9f0: 75 6d 6e 3d 3d 69 49 64 78 43 6f 6c 0a 20 20 20  umn==iIdxCol.   
ba00: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
ba10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ba20: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 58  rCode(pParse, pX
ba30: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
ba40: 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54 65         disableTe
ba50: 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72  rm(pLevel, &pTer
ba60: 6d 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 20  m->p);.         
ba70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ba80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
ba90: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
baa0: 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
bab0: 65 71 75 61 6c 69 74 79 20 74 65 72 6d 20 76 61  equality term va
bac0: 6c 75 65 73 20 62 65 63 61 75 73 65 20 74 68 65  lues because the
bad0: 79 20 77 69 6c 6c 20 61 6c 6c 20 62 65 0a 20 20  y will all be.  
bae0: 20 20 20 20 2a 2a 20 75 73 65 64 20 74 77 69 63      ** used twic
baf0: 65 3a 20 6f 6e 63 65 20 74 6f 20 6d 61 6b 65 20  e: once to make 
bb00: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
bb10: 6b 65 79 20 61 6e 64 20 6f 6e 63 65 20 74 6f 20  key and once to 
bb20: 6d 61 6b 65 20 74 68 65 0a 20 20 20 20 20 20 2a  make the.      *
bb30: 2a 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20  * start key..   
bb40: 20 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28     */.      for(
bb50: 6a 3d 30 3b 20 6a 3c 6e 45 71 43 6f 6c 75 6d 6e  j=0; j<nEqColumn
bb60: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
bb70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bb80: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 6e 45 71 43  (v, OP_Dup, nEqC
bb90: 6f 6c 75 6d 6e 2d 31 2c 20 30 29 3b 0a 20 20 20  olumn-1, 0);.   
bba0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 4c     }..      /* L
bbb0: 61 62 65 6c 73 20 66 6f 72 20 74 68 65 20 62 65  abels for the be
bbc0: 67 69 6e 6e 69 6e 67 20 61 6e 64 20 65 6e 64 20  ginning and end 
bbd0: 6f 66 20 74 68 65 20 6c 6f 6f 70 0a 20 20 20 20  of the loop.    
bbe0: 20 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 74 20    */.      cont 
bbf0: 3d 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 20 3d  = pLevel->cont =
bc00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
bc10: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
bc20: 62 72 6b 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 72  brk = pLevel->br
bc30: 6b 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  k = sqlite3VdbeM
bc40: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 0a 20 20  akeLabel(v);..  
bc50: 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20      /* Generate 
bc60: 74 68 65 20 74 65 72 6d 69 6e 61 74 69 6f 6e 20  the termination 
bc70: 6b 65 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  key.  This is th
bc80: 65 20 6b 65 79 20 76 61 6c 75 65 20 74 68 61 74  e key value that
bc90: 0a 20 20 20 20 20 20 2a 2a 20 77 69 6c 6c 20 65  .      ** will e
bca0: 6e 64 20 74 68 65 20 73 65 61 72 63 68 2e 20 20  nd the search.  
bcb0: 54 68 65 72 65 20 69 73 20 6e 6f 20 74 65 72 6d  There is no term
bcc0: 69 6e 61 74 69 6f 6e 20 6b 65 79 20 69 66 20 74  ination key if t
bcd0: 68 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 72  here.      ** ar
bce0: 65 20 6e 6f 20 65 71 75 61 6c 69 74 79 20 74 65  e no equality te
bcf0: 72 6d 73 20 61 6e 64 20 6e 6f 20 22 58 3c 2e 2e  rms and no "X<..
bd00: 2e 22 20 74 65 72 6d 2e 0a 20 20 20 20 20 20 2a  ." term..      *
bd10: 2a 0a 20 20 20 20 20 20 2a 2a 20 32 30 30 32 2d  *.      ** 2002-
bd20: 44 65 63 2d 30 34 3a 20 4f 6e 20 61 20 72 65 76  Dec-04: On a rev
bd30: 65 72 73 65 2d 6f 72 64 65 72 20 73 63 61 6e 2c  erse-order scan,
bd40: 20 74 68 65 20 73 6f 2d 63 61 6c 6c 65 64 20 22   the so-called "
bd50: 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a 20 20 20  termination".   
bd60: 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6d 70 75 74     ** key comput
bd70: 65 64 20 68 65 72 65 20 72 65 61 6c 6c 79 20 65  ed here really e
bd80: 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 68 65  nds up being the
bd90: 20 73 74 61 72 74 20 6b 65 79 2e 0a 20 20 20 20   start key..    
bda0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28    */.      if( (
bdb0: 73 63 6f 72 65 20 26 20 34 29 21 3d 30 20 29 7b  score & 4)!=0 ){
bdc0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 54 65  .        for(pTe
bdd0: 72 6d 3d 77 63 2e 61 2c 20 6b 3d 30 3b 20 6b 3c  rm=wc.a, k=0; k<
bde0: 77 63 2e 6e 54 65 72 6d 3b 20 6b 2b 2b 2c 20 70  wc.nTerm; k++, p
bdf0: 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Term++){.       
be00: 20 20 20 45 78 70 72 20 2a 70 58 20 3d 20 70 54     Expr *pX = pT
be10: 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  erm->p;.        
be20: 20 20 69 66 28 20 70 58 3d 3d 30 20 29 20 63 6f    if( pX==0 ) co
be30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
be40: 20 20 69 66 28 20 70 54 65 72 6d 2d 3e 69 64 78    if( pTerm->idx
be50: 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20 20 20 20  Left==iCur.     
be60: 20 20 20 20 20 20 20 20 26 26 20 28 70 58 2d 3e          && (pX->
be70: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 20 70 58 2d  op==TK_LT || pX-
be80: 3e 6f 70 3d 3d 54 4b 5f 4c 45 29 0a 20 20 20 20  >op==TK_LE).    
be90: 20 20 20 20 20 20 20 20 20 26 26 20 28 70 54 65           && (pTe
bea0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
beb0: 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d 70 54 65  & loopMask)==pTe
bec0: 72 6d 2d 3e 70 72 65 72 65 71 52 69 67 68 74 20  rm->prereqRight 
bed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26  .             &&
bee0: 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69 43 6f 6c   pX->pLeft->iCol
bef0: 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69 43 6f 6c  umn==pIdx->aiCol
bf00: 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20 20 20 20  umn[j].         
bf10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
bf20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bf30: 70 50 61 72 73 65 2c 20 70 58 2d 3e 70 52 69 67  pParse, pX->pRig
bf40: 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ht);.           
bf50: 20 6c 65 46 6c 61 67 20 3d 20 70 58 2d 3e 6f 70   leFlag = pX->op
bf60: 3d 3d 54 4b 5f 4c 45 3b 0a 20 20 20 20 20 20 20  ==TK_LE;.       
bf70: 20 20 20 20 20 64 69 73 61 62 6c 65 54 65 72 6d       disableTerm
bf80: 28 70 4c 65 76 65 6c 2c 20 26 70 54 65 72 6d 2d  (pLevel, &pTerm-
bf90: 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  >p);.           
bfa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
bfb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
bfc0: 20 20 20 20 20 20 74 65 73 74 4f 70 20 3d 20 4f        testOp = O
bfd0: 50 5f 49 64 78 47 45 3b 0a 20 20 20 20 20 20 7d  P_IdxGE;.      }
bfe0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65  else{.        te
bff0: 73 74 4f 70 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e  stOp = nEqColumn
c000: 3e 30 20 3f 20 4f 50 5f 49 64 78 47 45 20 3a 20  >0 ? OP_IdxGE : 
c010: 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 20  OP_Noop;.       
c020: 20 6c 65 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20   leFlag = 1;.   
c030: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
c040: 65 73 74 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29  estOp!=OP_Noop )
c050: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43  {.        int nC
c060: 6f 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20 2b  ol = nEqColumn +
c070: 20 28 28 73 63 6f 72 65 20 26 20 34 29 21 3d 30   ((score & 4)!=0
c080: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 76 65  );.        pLeve
c090: 6c 2d 3e 69 4d 65 6d 20 3d 20 70 50 61 72 73 65  l->iMem = pParse
c0a0: 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  ->nMem++;.      
c0b0: 20 20 62 75 69 6c 64 49 6e 64 65 78 50 72 6f 62    buildIndexProb
c0c0: 65 28 76 2c 20 6e 43 6f 6c 2c 20 62 72 6b 2c 20  e(v, nCol, brk, 
c0d0: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 69  pIdx);.        i
c0e0: 66 28 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20  f( pLevel->bRev 
c0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
c100: 20 6f 70 20 3d 20 6c 65 46 6c 61 67 20 3f 20 4f   op = leFlag ? O
c110: 50 5f 4d 6f 76 65 4c 65 20 3a 20 4f 50 5f 4d 6f  P_MoveLe : OP_Mo
c120: 76 65 4c 74 3b 0a 20 20 20 20 20 20 20 20 20 20  veLt;.          
c130: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c140: 28 76 2c 20 6f 70 2c 20 69 49 64 78 43 75 72 2c  (v, op, iIdxCur,
c150: 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d   brk);.        }
c160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c180: 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c  (v, OP_MemStore,
c190: 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31   pLevel->iMem, 1
c1a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c1b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65     }else if( pLe
c1c0: 76 65 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20  vel->bRev ){.   
c1d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 61 73 74  AddOp(v, OP_Last
c1f0: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
c200: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
c210: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
c220: 73 74 61 72 74 20 6b 65 79 2e 20 20 54 68 69 73  start key.  This
c230: 20 69 73 20 74 68 65 20 6b 65 79 20 74 68 61 74   is the key that
c240: 20 64 65 66 69 6e 65 73 20 74 68 65 20 6c 6f 77   defines the low
c250: 65 72 0a 20 20 20 20 20 20 2a 2a 20 62 6f 75 6e  er.      ** boun
c260: 64 20 6f 6e 20 74 68 65 20 73 65 61 72 63 68 2e  d on the search.
c270: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 73 74    There is no st
c280: 61 72 74 20 6b 65 79 20 69 66 20 74 68 65 72 65  art key if there
c290: 20 61 72 65 20 6e 6f 0a 20 20 20 20 20 20 2a 2a   are no.      **
c2a0: 20 65 71 75 61 6c 69 74 79 20 74 65 72 6d 73 20   equality terms 
c2b0: 61 6e 64 20 69 66 20 74 68 65 72 65 20 69 73 20  and if there is 
c2c0: 6e 6f 20 22 58 3e 2e 2e 2e 22 20 74 65 72 6d 2e  no "X>..." term.
c2d0: 20 20 49 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68    In.      ** th
c2e0: 61 74 20 63 61 73 65 2c 20 67 65 6e 65 72 61 74  at case, generat
c2f0: 65 20 61 20 22 52 65 77 69 6e 64 22 20 69 6e 73  e a "Rewind" ins
c300: 74 72 75 63 74 69 6f 6e 20 69 6e 20 70 6c 61 63  truction in plac
c310: 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  e of the.      *
c320: 2a 20 73 74 61 72 74 20 6b 65 79 20 73 65 61 72  * start key sear
c330: 63 68 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ch..      **.   
c340: 20 20 20 2a 2a 20 32 30 30 32 2d 44 65 63 2d 30     ** 2002-Dec-0
c350: 34 3a 20 49 6e 20 74 68 65 20 63 61 73 65 20 6f  4: In the case o
c360: 66 20 61 20 72 65 76 65 72 73 65 2d 6f 72 64 65  f a reverse-orde
c370: 72 20 73 65 61 72 63 68 2c 20 74 68 65 20 73 6f  r search, the so
c380: 2d 63 61 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a  -called.      **
c390: 20 22 73 74 61 72 74 22 20 6b 65 79 20 72 65 61   "start" key rea
c3a0: 6c 6c 79 20 65 6e 64 73 20 75 70 20 62 65 69 6e  lly ends up bein
c3b0: 67 20 75 73 65 64 20 61 73 20 74 68 65 20 74 65  g used as the te
c3c0: 72 6d 69 6e 61 74 69 6f 6e 20 6b 65 79 2e 0a 20  rmination key.. 
c3d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
c3e0: 28 20 28 73 63 6f 72 65 20 26 20 38 29 21 3d 30  ( (score & 8)!=0
c3f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
c400: 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6b 3d 30 3b  pTerm=wc.a, k=0;
c410: 20 6b 3c 77 63 2e 6e 54 65 72 6d 3b 20 6b 2b 2b   k<wc.nTerm; k++
c420: 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20  , pTerm++){.    
c430: 20 20 20 20 20 20 45 78 70 72 20 2a 70 58 20 3d        Expr *pX =
c440: 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20   pTerm->p;.     
c450: 20 20 20 20 20 69 66 28 20 70 58 3d 3d 30 20 29       if( pX==0 )
c460: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
c470: 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 2d 3e       if( pTerm->
c480: 69 64 78 4c 65 66 74 3d 3d 69 43 75 72 0a 20 20  idxLeft==iCur.  
c490: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
c4a0: 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20  X->op==TK_GT || 
c4b0: 70 58 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 29 0a 20  pX->op==TK_GE). 
c4c0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
c4d0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c4e0: 68 74 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 3d 3d  ht & loopMask)==
c4f0: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 52 69 67  pTerm->prereqRig
c500: 68 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ht .            
c510: 20 26 26 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69   && pX->pLeft->i
c520: 43 6f 6c 75 6d 6e 3d 3d 70 49 64 78 2d 3e 61 69  Column==pIdx->ai
c530: 43 6f 6c 75 6d 6e 5b 6a 5d 0a 20 20 20 20 20 20  Column[j].      
c540: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
c550: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c560: 64 65 28 70 50 61 72 73 65 2c 20 70 58 2d 3e 70  de(pParse, pX->p
c570: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  Right);.        
c580: 20 20 20 20 67 65 46 6c 61 67 20 3d 20 70 58 2d      geFlag = pX-
c590: 3e 6f 70 3d 3d 54 4b 5f 47 45 3b 0a 20 20 20 20  >op==TK_GE;.    
c5a0: 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 54          disableT
c5b0: 65 72 6d 28 70 4c 65 76 65 6c 2c 20 26 70 54 65  erm(pLevel, &pTe
c5c0: 72 6d 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20  rm->p);.        
c5d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c5f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
c600: 20 20 20 20 20 20 67 65 46 6c 61 67 20 3d 20 31        geFlag = 1
c610: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c620: 69 66 28 20 6e 45 71 43 6f 6c 75 6d 6e 3e 30 20  if( nEqColumn>0 
c630: 7c 7c 20 28 73 63 6f 72 65 26 38 29 21 3d 30 20  || (score&8)!=0 
c640: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
c650: 43 6f 6c 20 3d 20 6e 45 71 43 6f 6c 75 6d 6e 20  Col = nEqColumn 
c660: 2b 20 28 28 73 63 6f 72 65 26 38 29 21 3d 30 29  + ((score&8)!=0)
c670: 3b 0a 20 20 20 20 20 20 20 20 62 75 69 6c 64 49  ;.        buildI
c680: 6e 64 65 78 50 72 6f 62 65 28 76 2c 20 6e 43 6f  ndexProbe(v, nCo
c690: 6c 2c 20 62 72 6b 2c 20 70 49 64 78 29 3b 0a 20  l, brk, pIdx);. 
c6a0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 76 65         if( pLeve
c6b0: 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  l->bRev ){.     
c6c0: 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 69 4d 65       pLevel->iMe
c6d0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
c6e0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
c6f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c700: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70  , OP_MemStore, p
c710: 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c 20 31 29 3b  Level->iMem, 1);
c720: 0a 20 20 20 20 20 20 20 20 20 20 74 65 73 74 4f  .          testO
c730: 70 20 3d 20 4f 50 5f 49 64 78 4c 54 3b 0a 20 20  p = OP_IdxLT;.  
c740: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
c750: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20         int op = 
c760: 67 65 46 6c 61 67 20 3f 20 4f 50 5f 4d 6f 76 65  geFlag ? OP_Move
c770: 47 65 20 3a 20 4f 50 5f 4d 6f 76 65 47 74 3b 0a  Ge : OP_MoveGt;.
c780: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c790: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
c7a0: 2c 20 69 49 64 78 43 75 72 2c 20 62 72 6b 29 3b  , iIdxCur, brk);
c7b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c7c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 76 65   }else if( pLeve
c7d0: 6c 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  l->bRev ){.     
c7e0: 20 20 20 74 65 73 74 4f 70 20 3d 20 4f 50 5f 4e     testOp = OP_N
c7f0: 6f 6f 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  oop;.      }else
c800: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
c810: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c820: 5f 52 65 77 69 6e 64 2c 20 69 49 64 78 43 75 72  _Rewind, iIdxCur
c830: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  , brk);.      }.
c840: 0a 20 20 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  .      /* Genera
c850: 74 65 20 74 68 65 20 74 68 65 20 74 6f 70 20 6f  te the the top o
c860: 66 20 74 68 65 20 6c 6f 6f 70 2e 20 20 49 66 20  f the loop.  If 
c870: 74 68 65 72 65 20 69 73 20 61 20 74 65 72 6d 69  there is a termi
c880: 6e 61 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  nation.      ** 
c890: 6b 65 79 20 77 65 20 68 61 76 65 20 74 6f 20 74  key we have to t
c8a0: 65 73 74 20 66 6f 72 20 74 68 61 74 20 6b 65 79  est for that key
c8b0: 20 61 6e 64 20 61 62 6f 72 74 20 61 74 20 74 68   and abort at th
c8c0: 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 20 20  e top of the.   
c8d0: 20 20 20 2a 2a 20 6c 6f 6f 70 2e 0a 20 20 20 20     ** loop..    
c8e0: 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 72 74    */.      start
c8f0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
c900: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
c910: 20 20 20 20 69 66 28 20 74 65 73 74 4f 70 21 3d      if( testOp!=
c920: 4f 50 5f 4e 6f 6f 70 20 29 7b 0a 20 20 20 20 20  OP_Noop ){.     
c930: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c940: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
c950: 64 2c 20 70 4c 65 76 65 6c 2d 3e 69 4d 65 6d 2c  d, pLevel->iMem,
c960: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
c970: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c980: 20 74 65 73 74 4f 70 2c 20 69 49 64 78 43 75 72   testOp, iIdxCur
c990: 2c 20 62 72 6b 29 3b 0a 20 20 20 20 20 20 20 20  , brk);.        
c9a0: 69 66 28 20 28 6c 65 46 6c 61 67 20 26 26 20 21  if( (leFlag && !
c9b0: 70 4c 65 76 65 6c 2d 3e 62 52 65 76 29 20 7c 7c  pLevel->bRev) ||
c9c0: 20 28 21 67 65 46 6c 61 67 20 26 26 20 70 4c 65   (!geFlag && pLe
c9d0: 76 65 6c 2d 3e 62 52 65 76 29 20 29 7b 0a 20 20  vel->bRev) ){.  
c9e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
c9f0: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d  dbeChangeP3(v, -
ca00: 31 2c 20 22 2b 22 2c 20 50 33 5f 53 54 41 54 49  1, "+", P3_STATI
ca10: 43 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  C);.        }.  
ca20: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ca30: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ca40: 4f 50 5f 52 6f 77 4b 65 79 2c 20 69 49 64 78 43  OP_RowKey, iIdxC
ca50: 75 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ur, 0);.      sq
ca60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ca70: 2c 20 4f 50 5f 49 64 78 49 73 4e 75 6c 6c 2c 20  , OP_IdxIsNull, 
ca80: 6e 45 71 43 6f 6c 75 6d 6e 20 2b 20 28 28 73 63  nEqColumn + ((sc
ca90: 6f 72 65 26 34 29 21 3d 30 29 2c 20 63 6f 6e 74  ore&4)!=0), cont
caa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 6f 6d  );.      if( !om
cab0: 69 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  itTable ){.     
cac0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cad0: 64 4f 70 28 76 2c 20 4f 50 5f 49 64 78 52 6f 77  dOp(v, OP_IdxRow
cae0: 69 64 2c 20 69 49 64 78 43 75 72 2c 20 30 29 3b  id, iIdxCur, 0);
caf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cb00: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cb10: 4d 6f 76 65 47 65 2c 20 69 43 75 72 2c 20 30 29  MoveGe, iCur, 0)
cb20: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
cb30: 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 69   /* Record the i
cb40: 6e 73 74 72 75 63 74 69 6f 6e 20 75 73 65 64 20  nstruction used 
cb50: 74 6f 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  to terminate the
cb60: 20 6c 6f 6f 70 2e 0a 20 20 20 20 20 20 2a 2f 0a   loop..      */.
cb70: 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 6f 70        pLevel->op
cb80: 20 3d 20 70 4c 65 76 65 6c 2d 3e 62 52 65 76 20   = pLevel->bRev 
cb90: 3f 20 4f 50 5f 50 72 65 76 20 3a 20 4f 50 5f 4e  ? OP_Prev : OP_N
cba0: 65 78 74 3b 0a 20 20 20 20 20 20 70 4c 65 76 65  ext;.      pLeve
cbb0: 6c 2d 3e 70 31 20 3d 20 69 49 64 78 43 75 72 3b  l->p1 = iIdxCur;
cbc0: 0a 20 20 20 20 20 20 70 4c 65 76 65 6c 2d 3e 70  .      pLevel->p
cbd0: 32 20 3d 20 73 74 61 72 74 3b 0a 20 20 20 20 7d  2 = start;.    }
cbe0: 0a 20 20 20 20 6c 6f 6f 70 4d 61 73 6b 20 7c 3d  .    loopMask |=
cbf0: 20 67 65 74 4d 61 73 6b 28 26 6d 61 73 6b 53 65   getMask(&maskSe
cc00: 74 2c 20 69 43 75 72 29 3b 0a 0a 20 20 20 20 2f  t, iCur);..    /
cc10: 2a 20 49 6e 73 65 72 74 20 63 6f 64 65 20 74 6f  * Insert code to
cc20: 20 74 65 73 74 20 65 76 65 72 79 20 73 75 62 65   test every sube
cc30: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63  xpression that c
cc40: 61 6e 20 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79  an be completely
cc50: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  .    ** computed
cc60: 20 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65   using the curre
cc70: 6e 74 20 73 65 74 20 6f 66 20 74 61 62 6c 65 73  nt set of tables
cc80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
cc90: 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a 3d 30  (pTerm=wc.a, j=0
cca0: 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20 6a 2b  ; j<wc.nTerm; j+
ccb0: 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20  +, pTerm++){.   
ccc0: 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 54     Expr *pE = pT
ccd0: 65 72 6d 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66  erm->p;.      if
cce0: 28 20 70 45 3d 3d 30 20 7c 7c 20 45 78 70 72 48  ( pE==0 || ExprH
ccf0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
cd00: 50 5f 4f 70 74 4f 6e 6c 79 29 20 29 20 63 6f 6e  P_OptOnly) ) con
cd10: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
cd20: 20 28 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41   (pTerm->prereqA
cd30: 6c 6c 20 26 20 6c 6f 6f 70 4d 61 73 6b 29 21 3d  ll & loopMask)!=
cd40: 70 54 65 72 6d 2d 3e 70 72 65 72 65 71 41 6c 6c  pTerm->prereqAll
cd50: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
cd60: 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69     if( pLevel->i
cd70: 4c 65 66 74 4a 6f 69 6e 20 26 26 20 21 45 78 70  LeftJoin && !Exp
cd80: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c  rHasProperty(pE,
cd90: 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b   EP_FromJoin) ){
cda0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
cdb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
cdc0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
cdd0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 2c 20  lse(pParse, pE, 
cde0: 63 6f 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  cont, 1);.      
cdf0: 70 54 65 72 6d 2d 3e 70 20 3d 20 30 3b 0a 20 20  pTerm->p = 0;.  
ce00: 20 20 7d 0a 20 20 20 20 62 72 6b 20 3d 20 63 6f    }.    brk = co
ce10: 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20  nt;..    /* For 
ce20: 61 20 4c 45 46 54 20 4f 55 54 45 52 20 4a 4f 49  a LEFT OUTER JOI
ce30: 4e 2c 20 67 65 6e 65 72 61 74 65 20 63 6f 64 65  N, generate code
ce40: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 63 6f 72   that will recor
ce50: 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74 0a  d the fact that.
ce60: 20 20 20 20 2a 2a 20 61 74 20 6c 65 61 73 74 20      ** at least 
ce70: 6f 6e 65 20 72 6f 77 20 6f 66 20 74 68 65 20 72  one row of the r
ce80: 69 67 68 74 20 74 61 62 6c 65 20 68 61 73 20 6d  ight table has m
ce90: 61 74 63 68 65 64 20 74 68 65 20 6c 65 66 74 20  atched the left 
cea0: 74 61 62 6c 65 2e 20 20 0a 20 20 20 20 2a 2f 0a  table.  .    */.
ceb0: 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e      if( pLevel->
cec0: 69 4c 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20  iLeftJoin ){.   
ced0: 20 20 20 70 4c 65 76 65 6c 2d 3e 74 6f 70 20 3d     pLevel->top =
cee0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
cef0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
cf00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cf10: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
cf20: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
cf30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cf40: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
cf50: 70 4c 65 76 65 6c 2d 3e 69 4c 65 66 74 4a 6f 69  pLevel->iLeftJoi
cf60: 6e 2c 20 31 29 3b 0a 20 20 20 20 20 20 56 64 62  n, 1);.      Vdb
cf70: 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20  eComment((v, "# 
cf80: 72 65 63 6f 72 64 20 4c 45 46 54 20 4a 4f 49 4e  record LEFT JOIN
cf90: 20 68 69 74 22 29 29 3b 0a 20 20 20 20 20 20 66   hit"));.      f
cfa0: 6f 72 28 70 54 65 72 6d 3d 77 63 2e 61 2c 20 6a  or(pTerm=wc.a, j
cfb0: 3d 30 3b 20 6a 3c 77 63 2e 6e 54 65 72 6d 3b 20  =0; j<wc.nTerm; 
cfc0: 6a 2b 2b 2c 20 70 54 65 72 6d 2b 2b 29 7b 0a 20  j++, pTerm++){. 
cfd0: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 20         Expr *pE 
cfe0: 3d 20 70 54 65 72 6d 2d 3e 70 3b 0a 20 20 20 20  = pTerm->p;.    
cff0: 20 20 20 20 69 66 28 20 70 45 3d 3d 30 20 7c 7c      if( pE==0 ||
d000: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
d010: 28 70 45 2c 20 45 50 5f 4f 70 74 4f 6e 6c 79 29  (pE, EP_OptOnly)
d020: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
d030: 20 20 20 20 20 69 66 28 20 28 70 54 65 72 6d 2d       if( (pTerm-
d040: 3e 70 72 65 72 65 71 41 6c 6c 20 26 20 6c 6f 6f  >prereqAll & loo
d050: 70 4d 61 73 6b 29 21 3d 70 54 65 72 6d 2d 3e 70  pMask)!=pTerm->p
d060: 72 65 72 65 71 41 6c 6c 20 29 20 63 6f 6e 74 69  rereqAll ) conti
d070: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  nue;.        sql
d080: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
d090: 70 50 61 72 73 65 2c 20 70 45 2c 20 63 6f 6e 74  pParse, pE, cont
d0a0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 54  , 1);.        pT
d0b0: 65 72 6d 2d 3e 70 20 3d 20 30 3b 0a 20 20 20 20  erm->p = 0;.    
d0c0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
d0d0: 70 57 49 6e 66 6f 2d 3e 69 43 6f 6e 74 69 6e 75  pWInfo->iContinu
d0e0: 65 20 3d 20 63 6f 6e 74 3b 0a 20 20 66 72 65 65  e = cont;.  free
d0f0: 4d 61 73 6b 53 65 74 28 26 6d 61 73 6b 53 65 74  MaskSet(&maskSet
d100: 29 3b 0a 20 20 77 68 65 72 65 43 6c 61 75 73 65  );.  whereClause
d110: 43 6c 65 61 72 28 26 77 63 29 3b 0a 20 20 72 65  Clear(&wc);.  re
d120: 74 75 72 6e 20 70 57 49 6e 66 6f 3b 0a 7d 0a 0a  turn pWInfo;.}..
d130: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 74  /*.** Generate t
d140: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 57 48  he end of the WH
d150: 45 52 45 20 6c 6f 6f 70 2e 20 20 53 65 65 20 63  ERE loop.  See c
d160: 6f 6d 6d 65 6e 74 73 20 6f 6e 20 0a 2a 2a 20 73  omments on .** s
d170: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
d180: 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
d190: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
d1a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 68  /.void sqlite3Wh
d1b0: 65 72 65 45 6e 64 28 57 68 65 72 65 49 6e 66 6f  ereEnd(WhereInfo
d1c0: 20 2a 70 57 49 6e 66 6f 29 7b 0a 20 20 56 64 62   *pWInfo){.  Vdb
d1d0: 65 20 2a 76 20 3d 20 70 57 49 6e 66 6f 2d 3e 70  e *v = pWInfo->p
d1e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
d1f0: 69 6e 74 20 69 3b 0a 20 20 57 68 65 72 65 4c 65  int i;.  WhereLe
d200: 76 65 6c 20 2a 70 4c 65 76 65 6c 3b 0a 20 20 53  vel *pLevel;.  S
d210: 72 63 4c 69 73 74 20 2a 70 54 61 62 4c 69 73 74  rcList *pTabList
d220: 20 3d 20 70 57 49 6e 66 6f 2d 3e 70 54 61 62 4c   = pWInfo->pTabL
d230: 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20 53 72  ist;.  struct Sr
d240: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 61 62  cList_item *pTab
d250: 49 74 65 6d 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  Item;..  /* Gene
d260: 72 61 74 65 20 6c 6f 6f 70 20 74 65 72 6d 69 6e  rate loop termin
d270: 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 20 20 2a 2f  ation code..  */
d280: 0a 20 20 66 6f 72 28 69 3d 70 54 61 62 4c 69 73  .  for(i=pTabLis
d290: 74 2d 3e 6e 53 72 63 2d 31 3b 20 69 3e 3d 30 3b  t->nSrc-1; i>=0;
d2a0: 20 69 2d 2d 29 7b 0a 20 20 20 20 70 4c 65 76 65   i--){.    pLeve
d2b0: 6c 20 3d 20 26 70 57 49 6e 66 6f 2d 3e 61 5b 69  l = &pWInfo->a[i
d2c0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ];.    sqlite3Vd
d2d0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d2e0: 2c 20 70 4c 65 76 65 6c 2d 3e 63 6f 6e 74 29 3b  , pLevel->cont);
d2f0: 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c 2d  .    if( pLevel-
d300: 3e 6f 70 21 3d 4f 50 5f 4e 6f 6f 70 20 29 7b 0a  >op!=OP_Noop ){.
d310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d320: 65 41 64 64 4f 70 28 76 2c 20 70 4c 65 76 65 6c  eAddOp(v, pLevel
d330: 2d 3e 6f 70 2c 20 70 4c 65 76 65 6c 2d 3e 70 31  ->op, pLevel->p1
d340: 2c 20 70 4c 65 76 65 6c 2d 3e 70 32 29 3b 0a 20  , pLevel->p2);. 
d350: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
d360: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
d370: 28 76 2c 20 70 4c 65 76 65 6c 2d 3e 62 72 6b 29  (v, pLevel->brk)
d380: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 76 65 6c  ;.    if( pLevel
d390: 2d 3e 69 6e 4f 70 21 3d 4f 50 5f 4e 6f 6f 70 20  ->inOp!=OP_Noop 
d3a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
d3b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 70 4c 65  VdbeAddOp(v, pLe
d3c0: 76 65 6c 2d 3e 69 6e 4f 70 2c 20 70 4c 65 76 65  vel->inOp, pLeve
d3d0: 6c 2d 3e 69 6e 50 31 2c 20 70 4c 65 76 65 6c 2d  l->inP1, pLevel-
d3e0: 3e 69 6e 50 32 29 3b 0a 20 20 20 20 7d 0a 20 20  >inP2);.    }.  
d3f0: 20 20 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 4c    if( pLevel->iL
d400: 65 66 74 4a 6f 69 6e 20 29 7b 0a 20 20 20 20 20  eftJoin ){.     
d410: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
d420: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
d430: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
d440: 65 6d 4c 6f 61 64 2c 20 70 4c 65 76 65 6c 2d 3e  emLoad, pLevel->
d450: 69 4c 65 66 74 4a 6f 69 6e 2c 20 30 29 3b 0a 20  iLeftJoin, 0);. 
d460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d470: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
d480: 75 6c 6c 2c 20 31 2c 20 61 64 64 72 2b 34 20 2b  ull, 1, addr+4 +
d490: 20 28 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75   (pLevel->iIdxCu
d4a0: 72 3e 3d 30 29 29 3b 0a 20 20 20 20 20 20 73 71  r>=0));.      sq
d4b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d4c0: 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77 2c 20 70 54  , OP_NullRow, pT
d4d0: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  abList->a[i].iCu
d4e0: 72 73 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  rsor, 0);.      
d4f0: 69 66 28 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78  if( pLevel->iIdx
d500: 43 75 72 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Cur>=0 ){.      
d510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
d520: 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 52 6f 77  Op(v, OP_NullRow
d530: 2c 20 70 4c 65 76 65 6c 2d 3e 69 49 64 78 43 75  , pLevel->iIdxCu
d540: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
d550: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
d560: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
d570: 2c 20 30 2c 20 70 4c 65 76 65 6c 2d 3e 74 6f 70  , 0, pLevel->top
d580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d590: 2f 2a 20 54 68 65 20 22 62 72 65 61 6b 22 20 70  /* The "break" p
d5a0: 6f 69 6e 74 20 69 73 20 68 65 72 65 2c 20 6a 75  oint is here, ju
d5b0: 73 74 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  st past the end 
d5c0: 6f 66 20 74 68 65 20 6f 75 74 65 72 20 6c 6f 6f  of the outer loo
d5d0: 70 2e 0a 20 20 2a 2a 20 53 65 74 20 69 74 2e 0a  p..  ** Set it..
d5e0: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
d5f0: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
d600: 2c 20 70 57 49 6e 66 6f 2d 3e 69 42 72 65 61 6b  , pWInfo->iBreak
d610: 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61  );..  /* Close a
d620: 6c 6c 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  ll of the cursor
d630: 73 20 74 68 61 74 20 77 65 72 65 20 6f 70 65 6e  s that were open
d640: 64 20 62 79 20 73 71 6c 69 74 65 33 57 68 65 72  d by sqlite3Wher
d650: 65 42 65 67 69 6e 2e 0a 20 20 2a 2f 0a 20 20 70  eBegin..  */.  p
d660: 4c 65 76 65 6c 20 3d 20 70 57 49 6e 66 6f 2d 3e  Level = pWInfo->
d670: 61 3b 0a 20 20 70 54 61 62 49 74 65 6d 20 3d 20  a;.  pTabItem = 
d680: 70 54 61 62 4c 69 73 74 2d 3e 61 3b 0a 20 20 66  pTabList->a;.  f
d690: 6f 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69  or(i=0; i<pTabLi
d6a0: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20 70  st->nSrc; i++, p
d6b0: 54 61 62 49 74 65 6d 2b 2b 2c 20 70 4c 65 76 65  TabItem++, pLeve
d6c0: 6c 2b 2b 29 7b 0a 20 20 20 20 54 61 62 6c 65 20  l++){.    Table 
d6d0: 2a 70 54 61 62 20 3d 20 70 54 61 62 49 74 65 6d  *pTab = pTabItem
d6e0: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 61 73 73 65  ->pTab;.    asse
d6f0: 72 74 28 20 70 54 61 62 21 3d 30 20 29 3b 0a 20  rt( pTab!=0 );. 
d700: 20 20 20 69 66 28 20 70 54 61 62 2d 3e 69 73 54     if( pTab->isT
d710: 72 61 6e 73 69 65 6e 74 20 7c 7c 20 70 54 61 62  ransient || pTab
d720: 2d 3e 70 53 65 6c 65 63 74 20 29 20 63 6f 6e 74  ->pSelect ) cont
d730: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70  inue;.    if( (p
d740: 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20 31  Level->score & 1
d750: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
d760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
d770: 2c 20 4f 50 5f 43 6c 6f 73 65 2c 20 70 54 61 62  , OP_Close, pTab
d780: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 2c 20 30  Item->iCursor, 0
d790: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
d7a0: 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 21 3d 30   pLevel->pIdx!=0
d7b0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d7c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d7d0: 5f 43 6c 6f 73 65 2c 20 70 4c 65 76 65 6c 2d 3e  _Close, pLevel->
d7e0: 69 49 64 78 43 75 72 2c 20 30 29 3b 0a 20 20 20  iIdxCur, 0);.   
d7f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
d800: 63 75 72 73 6f 72 20 73 75 62 73 74 69 74 75 74  cursor substitut
d810: 69 6f 6e 73 20 66 6f 72 20 63 61 73 65 73 20 77  ions for cases w
d820: 68 65 72 65 20 77 65 20 77 61 6e 74 20 74 6f 20  here we want to 
d830: 75 73 65 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20  use.    ** just 
d840: 74 68 65 20 69 6e 64 65 78 20 61 6e 64 20 6e 65  the index and ne
d850: 76 65 72 20 72 65 66 65 72 65 6e 63 65 20 74 68  ver reference th
d860: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 2a 2a 20  e table..    ** 
d870: 0a 20 20 20 20 2a 2a 20 43 61 6c 6c 73 20 74 6f  .    ** Calls to
d880: 20 74 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61   the code genera
d890: 74 6f 72 20 69 6e 20 62 65 74 77 65 65 6e 20 73  tor in between s
d8a0: 71 6c 69 74 65 33 57 68 65 72 65 42 65 67 69 6e  qlite3WhereBegin
d8b0: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 73 71 6c 69   and.    ** sqli
d8c0: 74 65 33 57 68 65 72 65 45 6e 64 20 77 69 6c 6c  te3WhereEnd will
d8d0: 20 68 61 76 65 20 63 72 65 61 74 65 64 20 63 6f   have created co
d8e0: 64 65 20 74 68 61 74 20 72 65 66 65 72 65 6e 63  de that referenc
d8f0: 65 73 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20  es the table.   
d900: 20 2a 2a 20 64 69 72 65 63 74 6c 79 2e 20 20 54   ** directly.  T
d910: 68 69 73 20 6c 6f 6f 70 20 73 63 61 6e 73 20 61  his loop scans a
d920: 6c 6c 20 74 68 61 74 20 63 6f 64 65 20 6c 6f 6f  ll that code loo
d930: 6b 69 6e 67 20 66 6f 72 20 6f 70 63 6f 64 65 73  king for opcodes
d940: 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 72 65 66  .    ** that ref
d950: 65 72 65 6e 63 65 20 74 68 65 20 74 61 62 6c 65  erence the table
d960: 20 61 6e 64 20 63 6f 6e 76 65 72 74 73 20 74 68   and converts th
d970: 65 6d 20 69 6e 74 6f 20 6f 70 63 6f 64 65 73 20  em into opcodes 
d980: 74 68 61 74 0a 20 20 20 20 2a 2a 20 72 65 66 65  that.    ** refe
d990: 72 65 6e 63 65 20 74 68 65 20 69 6e 64 65 78 2e  rence the index.
d9a0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
d9b0: 70 4c 65 76 65 6c 2d 3e 73 63 6f 72 65 20 26 20  pLevel->score & 
d9c0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  1 ){.      int i
d9d0: 2c 20 6a 2c 20 6c 61 73 74 3b 0a 20 20 20 20 20  , j, last;.     
d9e0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20   VdbeOp *pOp;.  
d9f0: 20 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 20      Index *pIdx 
da00: 3d 20 70 4c 65 76 65 6c 2d 3e 70 49 64 78 3b 0a  = pLevel->pIdx;.
da10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
da20: 49 64 78 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Idx!=0 );.      
da30: 70 4f 70 20 3d 20 73 71 6c 69 74 65 33 56 64 62  pOp = sqlite3Vdb
da40: 65 47 65 74 4f 70 28 76 2c 20 70 57 49 6e 66 6f  eGetOp(v, pWInfo
da50: 2d 3e 69 54 6f 70 29 3b 0a 20 20 20 20 20 20 6c  ->iTop);.      l
da60: 61 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ast = sqlite3Vdb
da70: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
da80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 57 49  .      for(i=pWI
da90: 6e 66 6f 2d 3e 69 54 6f 70 3b 20 69 3c 6c 61 73  nfo->iTop; i<las
daa0: 74 3b 20 69 2b 2b 2c 20 70 4f 70 2b 2b 29 7b 0a  t; i++, pOp++){.
dab0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
dac0: 3e 70 31 21 3d 70 4c 65 76 65 6c 2d 3e 69 54 61  >p1!=pLevel->iTa
dad0: 62 43 75 72 20 29 20 63 6f 6e 74 69 6e 75 65 3b  bCur ) continue;
dae0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70  .        if( pOp
daf0: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43 6f 6c  ->opcode==OP_Col
db00: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  umn ){.         
db10: 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65 76 65   pOp->p1 = pLeve
db20: 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20 20 20  l->iIdxCur;.    
db30: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
db40: 3c 70 49 64 78 2d 3e 6e 43 6f 6c 75 6d 6e 3b 20  <pIdx->nColumn; 
db50: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
db60: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3d 3d 70    if( pOp->p2==p
db70: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 6a 5d  Idx->aiColumn[j]
db80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
db90: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 6a 3b 0a 20    pOp->p2 = j;. 
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
dbb0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
dbc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
dbd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dbe0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
dbf0: 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
dc00: 20 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 4c 65     pOp->p1 = pLe
dc10: 76 65 6c 2d 3e 69 49 64 78 43 75 72 3b 0a 20 20  vel->iIdxCur;.  
dc20: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f 70 63          pOp->opc
dc30: 6f 64 65 20 3d 20 4f 50 5f 49 64 78 52 6f 77 69  ode = OP_IdxRowi
dc40: 64 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  d;.        }else
dc50: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
dc60: 3d 3d 4f 50 5f 4e 75 6c 6c 52 6f 77 20 29 7b 0a  ==OP_NullRow ){.
dc70: 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 6f            pOp->o
dc80: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
dc90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dca0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
dcb0: 2f 2a 20 46 69 6e 61 6c 20 63 6c 65 61 6e 75 70  /* Final cleanup
dcc0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
dcd0: 65 65 28 70 57 49 6e 66 6f 29 3b 0a 20 20 72 65  ee(pWInfo);.  re
dce0: 74 75 72 6e 3b 0a 7d 0a                          turn;.}.